Linux Kernel Development 笔记(一)Linux 内核特点

来源:互联网 发布:阿里云et 编辑:程序博客网 时间:2024/04/29 02:38

Linux 内核是跑在内核态的,它与用户态的程序,存在重要的区别,这些区别罗列如下:

1. 内核既不能使用标准C lib也不能使用标准C Headers

    主要原因是速度以及大小,内核自有自己一套库函数,同时也只能引用内核自身的头文件。

2. 内核是GNU C编写的

    内核不是采用标准的ANSI C写的,而是采用GNU C标准,采用了ISO C99以及GNU的一些扩展特性。如inline特性,可以让消除

    函数调用以及返回的开支,并让编译器可以优化代码,使调用者与被调用者合二为一。一般此特性用在对时间要求很高的函数里,不能

    乱用,否则容量会增大从而消耗内存以及指令缓存。还有内嵌汇编的特性,让内核可以C与汇编混合编码,但必须注意是仅能用在内核与

    本平台系统是一致的情况。gcc C还拥有内建的符号,利于优化条件分支处理极有可能发生的或极不可能发生的条件。这个符号被封装在

    宏 likely() 和 unlikely()里面。这两个宏使用上要小心,以内使用不当会造成性能上的损失。一般情况下,这一般用在错误条件发生的分支,

    内核编程多数采用unlikely()来处理特殊的情况。

3. 内核缺乏如用户态拥有的内存保护机制

    内核态不像用户态,对内存没有保护机制。用户态在内存越界或非法访问都会让内核发出一个错误信号 SIGSEGV,并杀掉进程。但内核态

    访问错误的内存,则不会有任何警告,最终会造成oops。但是,并不是说着一定就不能访问非法内存,就好比如取NULL的值,但会有很高风险。

    同时,内核的内存不是按页处理的,每一个字节内存的消耗,都比实际消耗的物理内存少一个字节,这点要记住。

4. 内核不容易处理浮点操作

    内核要使用浮点操作,必须人工的保存以及恢复浮点寄存器。不像用户态使用浮点数一样,可以让内核引发一个事件,使整数操作转为浮点操作模式,

    但内核态不能自己引发自己,必须手动处理。所以说,在众多繁杂的事务中,浮点操作在内核态中,最好少处理,除了一些非常罕见的需求。

5. 内核拥有对应每一个进程的固定的,小容量的栈,一般只有8KB或16KB字节,刚好是2个page大小(针对不同平台)

6. 因为内核存在异步的中断,是抢占式的,支持SMP(对称多处理器),故此多数情况下,内核主要关注是同步以及并发的内容

    Linux是抢占式多任务操作系统,进程是由内核的即兴调度的,故此内核必须在多个任务中同步。同时linux也支持SMP,必须在多处理器访问共同资源的

    时候加以保护处理。中断相对于正在运行的代码来说,是异步的,也就是随时可能在代码正在访问资源的中途发生,并有可能访问同一个资源。

7. 可移植性很重要


原创粉丝点击