Linux Kernel Development 笔记(一)Linux 内核特点
2013-03-05 12:05
232 查看
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. 可移植性很重要
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. 可移植性很重要
相关文章推荐
- Linux Kernel Development 笔记(五)内核数据结构
- Linux Kernel Development 笔记(九)内核同步方法
- Linux Kernel Development 笔记(八)内核同步的介绍
- 【Linux学习笔记②】Linux系统内核Kernel和GNU计划
- Linux Kernel Development 笔记(七)下半部处理以及延迟工作
- Linux Kernel Development 笔记(四)系统调用
- Linux Kernel Development——内核同步方法
- Linux Kernel 学习笔记9:内核与用户层通信之netlink
- Linux Kernel Development----内核线程
- Linux Kernel Development 笔记(六)中断以及中断处理
- Linux Kernel Development 笔记(二)进程
- 【读书笔记】【Linux Kernel Development】【linux内核简介】
- Linux Kernel Development, 3rd Edition (Linux内核开发 第3版)
- Linux Kernel Development 笔记(三)进程调度
- 【读书笔记】【linux kernel development】【从内核出发】
- 内核阅读笔记之浅析Linux2.6.34内核桥接数据转发(一)
- linux内核开发基础学习笔记
- Linux内核升级之制作initrd.img及其new-kernel-pkg(.sh)使用
- linux内核分析学习笔记:用gdb跟踪linux内核启动过程
- android kernel 被Linux 内核除名