1 内核比较
1.1 单内核与微内核设计
【单内核】:所有的内核服务都在一个地址空间上运行;
- 内核以静态二进制的形式存放在磁盘中;
- 可类似用户程序直接调用函数;
- 简单、性能高;
【微内核】:将功能模块划分为多个独立的过程(服务器),都运行在各自的地址空间上;
- 调用函数需要采用ICP机制,将消息传递到微内核通信;
- 各自独立,避免出现失效;
- 【IPC机制】:开销多余函数调用,设计到内核态与用户态的上下文切换;
- 【解决】:基于该内核的系统,将服务器位于内核中,就避免了这些开销;
【Linux内核】:为单内核,提供模块化设计、抢占式内核、支持内核线程、多处理机制以及动态装载内核模块的能力;
- 让所有事情都运行在内核态中,直接调用函数;
- 汲取了微内核的精华;
1.2 Linux内核版本
【主.副.修.稳】
- 副班版本是奇数则为开发版,为偶数则为稳定版;
2 了解内核
=========》内核源码下载地址《======== 或者===》 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
2.1 源码目录介绍
2.2 内核开发
2.2.1 特点
【特点】:
- 内核编程时不能访问C库和标准C头文件;
- 必须使用CNU C;
- 缺乏类似用户空间的内存保护机制;
- 难以执行浮点运算;
- 每个进程只有一个很小的定长堆栈;
- 需要注意同步和并发因为内核支持异步中断、抢占和SMP;
- 注意移植性;
【无libc库和标准头文件】 内核不能连接C库,但大部分函数在内核都进行实现;
【GNU】 gcc是多种GNU编译器的集合,可编译内核及系统上的C程序;
【GNU中的区别】 1.内联函数: C99及GNU支持,函数会在调用位置展开,减少函数调用以及返回带来的开销; 但会让内存空间增多,少用于常调用的函数; 2.分支声明 gcc内建了指令用于优化,likely和unlikely; 若使用正确,性能会提升,否则会下降; 一般用于错误条件判断;
【没有内存保护机制】 若用户程序内存错误则会结束进程,而内核则无法控制,没有提示;
【不要使用浮点数】 在用户程序中会被内核进行转换,内核中不会;
【同步和并发】 Linux是抢占多任务系统,内核进程调度会对进程进行调度; 是多处理器系统,会有多个访问统一资源; 常用自旋锁和信号量;
|