《Linux内核设计与实现》读书笔记——从内核出发

内核源码树结构

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

配置、编译及安装内核

配置内核

内核提供了各种不同的工具来简化内核配置。

一. 通过一个字符界面下的命令行工具

$ make config

这个工具会逐一遍历所有配置项,要求用户选择yesnomodule(如果是三选一的话),比较耗费时间

二. 通过基于ncurse库编制的图形界面工具(需要预先安装ncurse

$ make menuconfig

三. 通过基于gtk+的图形工具

$ make gconfig

四. 基于默认配置为你的体系结构创建一个配置

$ make defconfig

这些配置项会被存放在内核源码树根目录下的.config文件中,你可以找到它,并可以随意修改它。在你修改过配置文件之后,或者在用已有的配置文件配置新的代码树的时候,你应该验证和更新配置:

$ make oldconfig

编译内核

一旦内核配置好了,就可以使用一个简单的命令来编译它了

$ make

或者你也可以衍生多个作业来加快编译计数

$ make -jn

这里的n是要衍生的作业数

安装内核

一. 安装内核模块

$ make modules_install

二. 安装内核

$ make install

Linux所谓的安装即是拷贝文件,修改配置文件,内核安装实际上也是如此

  1. 复制内核映像到/boot中,编译成功后生成的内核映像文件bzImage放在arch/<architecture>/boot/中,该文件复制到/boot后重命名为vmlinuxz-<kernel-version>
  2. 生成initrd-<kernel-version>.img文件
  3. 配置引导程序(GRUB方式编辑/etc/grub/grub.confLILO方式编辑/etc/lilo.conf
  4. reboot进入新内核

内核开发的特点

  1. libc库抑或无标准头文件
    为了保证内核的小而且高效,内核开发不能使用C标准库,所以哪怕是最简单的printf函数也无法使用,不过有替代的printk
  2. 使用GNU C,推荐使用GNC 4.4或之后的版本
    因为使用了GNC,所以Linux内核常有一些GNC的一些扩展
  3. 内联(inline)函数
    内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数。
    定义一个内联函数的时候,需要使用static作为关键字,并使用inline限定它,比如
```c
static inline void wolf(unsigned long tail_size)
```
  1. 内联汇编
    gcc编译器支持在C函数中嵌入汇编指令,在内核编程的时候,知道对应的体系结构,可以使用这个功能。通常使用asm()指令嵌入汇编代码,例如下面这条内核指令用于执行x86处理器的rdtsc指令,返回时间戳(tsc)寄存器的值:
```c
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low 和 high 分别包含64位时间戳的低32位和高32位 */
```
  1. 分支声明
    如果事先知道一个条件经常为假,或者经常为真,我们可以使用unlikely()likely()对条件分支选择进行优化。
```c
/* 我们认为error绝大多数时间都会为0 */
if (unlikely(error)) {
    /* ... */
}
```

```c
/* 我们认为success通常都不会为0 */
if (likely(success)) {
    /* ... */
}
```
  1. 缺乏像用户空间那样的内存保护机制
  2. 难以执行浮点运算
  3. 内核给每个进程只有一个很小的定长堆栈
    内核栈的大小由编译内核时决定的,对于不用的体系结构,内核栈的大小虽然不一样,但都是固定的。
    查看内核栈大小的方法:
$ ulimit -a | grep "stack size"
  1. 由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发
  2. 要考虑可移植性的重要性
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容