Linux中一切都是文件,这样可以通过相同的系统调用接口来操作数据和设备。
处理器的运行状态可以分为:
- 运行于内核态,处于进程上下文中,代表某个进程执行了系统调用;
- 运行于内核态,处于中断上下文,代表正在处理中断;
- 运行于用户态,正在执行用户进程。
单内核与微内核
- 单内核:内核作为一个整体构成一个大过程,运行在一个地址空间中,这样的内核以单个二进制文件的形式存在。内核之间的通信是微不足道的,因为它们之间可以相互调用。
- 微内核:内核根据功能划分为很多个过程,每个过程独立运行在各自的地址空间,它们通过IPC来通信
Linux是一个单内核,但它吸取了微内核的精华:
- 模块化设计
- 抢占式内核
- 内核线程
- 动态装载内核模块
- 避免了微内核的性能缺陷:所有东西都运行于内核态,可以直接互相调用,无需消息传递
Linux内核的编译
- make menuconfig 修改配置
- make defconfig 根据体系结构生成一个默认的配置
- make -j4 多个编译作业
- 示例:
$ make
$ make modules
# make modules_install
# make install
# depmod 2.6.18.8-xen
# cd /boot
# mkinitrd -v -f --with=sd_mod --with=scsi_mod initrd-2.6.18.8-xen.img 2.6.18.8-xen
Linux内核开发的特点
- 不能访问C库
- 必须使用GNU C
- 缺乏用户空间的内存保护机制
- 浮点数很难用
- 很小的定长堆栈(内核栈为两页,即32位8KB,64位16KB)
- 异步中断、抢占和SMP要求时刻注意同步和并发(自旋锁/信号量)
- 支持内联函数
- 支持内联汇编
- likely unlikely分支优化