一、下载内核源码
linux内核官网http://www.kernel.org
二、内核源码树
目录 | 说明 |
arch | 特定体系结构的代码 |
block | 块设备I/O层 |
crypo | 加密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 menuconfig
- 编译:make
四、内核开发的特点
- 内核编程时既不能访问C库也不能访问标准的C头文件
- 内核编程时必须使用GNU C,内核开发者有时会用到gcc提供的许多语言扩展部分。(gcc是多种GNU编译器的集合,他包含的C编译器既可以编译内核,也可以编译linux系统上用C语言编写的其他代码。)gcc 编译器支持内联(inline)函数、内联汇编、分支声明(比如likely(),unlikely())
- 没有内存保护机制,在内核中不能做访问非法内存地址,引用空指针之类的事情,否则会发成内存错误,内核会死掉。
- 不要轻易在内核中使用浮点数,因为内核不能完美的支持浮点操作,在内核中使用浮点数时,需要人工保证和恢浮点寄存器,还有其他一些琐碎的事情,所以,不是万不得已,干脆就别用浮点操作了。
- 内核栈容积小且固定,在X86上栈的大小在编译时配置,可以是4KB也可以是8KB。查看内核栈大小的方法:
ulimit -a | grep "stack size"
- 同步和并发,由于内核可以抢占,是多任务操作系统,进程调度随时可能发生;中断处理程序与被中断的进程访问同一资源;内核支持对称对处理器系统(SMP),同时在两个或两个以上的处理器上执行的代码可能会同时访问共享的资源。因此,需要同步机制保证不出现竞争条件,常用的方法有自旋锁、信号量、互斥体。
- 保证可移植性,诸如保持字节序、64位对齐、不假定字节长度和页面长度等方法有助于移植性。