linux内核开发准备工作与注意事项

一、下载内核源码

linux内核官网http://www.kernel.org

二、内核源码树

目录说明

arch特定体系结构的代码

block块设备I/O层

crypo加密API

Documentation内核源码文档

drivers设备驱动程序

firmware使用某些驱动程序而需要的设备固件

fsVFS和各种文件系统

include内核头文件

init内核引导和初始化

ipc进程间通信代码

kernel像调度程序这样的核心子系统

lib同样内核函数

mm内存管理子系统和VM

net网络子系统

samples示例,示范代码

scripts编译内核所用的脚本

securityLinux 安全模块

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位对齐、不假定字节长度和页面长度等方法有助于移植性。

linux内核开发准备工作与注意事项

相关推荐