【Step1】Linux Kernel -基础

2023-10-25 17:40
文章标签 基础 linux kernel step1

本文主要是介绍【Step1】Linux Kernel -基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux内核设计与实现.第3版》1-2章学习笔记

1. 获取内核源码

http://www.kernel.org

2. 内核版本命名规则

内核的版本号主要有四个数字组成。

在这里插入图片描述

从版本号: 偶数表示稳定版(可用于企业级环境),奇数表示开发版;

修订版本号: 包括BUG修正,新的驱动以及新的特性的追加;

稳定版本号: 关键性BUG的修改;

3. 单内核和微内核

原理优势劣势
单内核整个内核都在一个大内核地址空间上运行。简单、高效: 所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销。一个功能的崩溃会导致整个内核无法使用。
微内核内核按功能被划分成各个独立的过程。每个过程独立的运行在自己的地址空间上。安全: 内核的各种服务独立运行,一种服务挂了不会影响其他服务。内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。

Linux内核是基于单内核的,但也具备微内核的一些特征:(体现了Linux实用至上的原则)

  1. 支持动态加载内核模块
  2. 支持对称多处理(SMP)
  3. 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
  4. 不区分线程和进程

4. 内核源码的结构

目录说明
arch特定体系结构的代码
block块设备I/O层
crypo加密API
Documentation内核源码文档
drivers设备驱动程序
firmware使用某些驱动程序而需要的设备固件
fsVFS和各种文件系统
include内核头文件
init内核引导和初始化
ipc进程间通信代码
kernel像调度程序这样的核心子系统
lib库文件代码
mm内存管理子系统和VM
net网络子系统
samples内核编程案例
scripts配置裁剪内核的工具脚本
security包括不同的Linux安全模型代码
sound音频设备的驱动程序
usr早期用户空间代码(所谓的initramfs)
tools在Linux开发中有用的工具
virt虚拟化基础结构

5. 编译内核的方法

# 1.通过命令图形用户界面化配置,生成.config配置文件
$ sudo make menuconfig
# 2.内核编译
$ sudo make -j4
# 3.安装模块
$ sudo make modules_install
# 4.安装内核
$ sudo make install
# 5.reboot系统,重新选择内核版本,启动后通过以下指令查看内核版本
$ uname -a

修改ubuntu启动时选择内核:

# step1: 修改grub文件
$ sudo vim /etc/default/grub 
GRUB_DEFAULT=0
#GRUB_TIMEOUT_STYLE=hidden    # 1.屏蔽此处
GRUB_TIMEOUT=30               # 2.修改等待时间为30s
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""# step2:更新grub配置
$ sudo update-grub

6. 内核开发的特点

  1. 无标准C库: 为了保证内核的小和高效,内核开发中不能使用C标准库,例如printk替代printf

  2. GNU C 扩展:

    • 内联函数: 内联函数在编译时会在它被调用的地方展开,减少了函数调用的开销,性能较好。

      ​ 但频繁的使用内联函数也会使代码变长,从而在运行时占用更多的内存。

      所以使用内联函数时要求: 函数较小,会被反复调用,对程序的时间要求比较严格。

      /*EG:*/ static inline void sample();
      
    • 内联汇编: 内联汇编用于偏近底层或对执行时间严格要求的地方。

      unsigned int low, high; /* low 和 high 分别包含64位时间戳的低32位和高32位 */
      asm volatile("rdtsc" : "=a" (low), "=d" (high));
      
    • 分支声明: 如果能事先判断一个if语句时经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码

      if (unlikely(error))  /* 如果error在绝大多数情况下为0(假) */
      if (likely(success))  /* 如果success在绝大多数情况下不为0(真) */
      
  3. 没有内存保护: 因为内核是最低层的程序,所以如果内核访问的非法内存,那么整个系统都会挂掉,所以内核开发的风险比用户程序开发的风险要大。

    ​ 而且,内核中的内存是不分页的,每用一个字节的内存,物理内存就少一个字节。所以内核中使用内存一定要谨慎。

  4. 不使用浮点数: 内核不能完美的支持浮点操作,使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。

  5. 内核栈容积小且固定: 内核栈的大小有编译内核时决定的,对于不用的体系结构,内核栈的大小虽然不一样,但都是固定的。

    $ ulimit -a | grep "stack size"                # 查看内核栈大小的方法
    stack size              (kbytes, -s) 8192
    
  6. 同步和并发: Linux是多用户的操作系统,所以必须处理好同步和并发操作,防止因竞争而出现死锁。

  7. 可移植性: Linux内核可用于不用的体现结构,支持多种硬件。所以开发时要时刻注意可移植性,尽量使用体系结构无关的代码。


路虽远行则将至、事虽难做则必成
MrWang

这篇关于【Step1】Linux Kernel -基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/284147

相关文章

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面