- 论坛徽章:
- 0
|
2.2 内核源码树arch 特定体系结构的源码crypto Crypto APIDocumentation 内核源码文档drivers 设备驱动程序fs VFS和各种文件系统include 内核头文件init 内核引导和初始化ipc 进程间通信代码kernel 像调度程序这样的核心子系统lib 通用内核函数mm 内存管理子系统和VMnet 网络子系统scripts 编译内核所用的脚本security Linux安全模块sound 语音子系统usr 早期用户空间代码(所谓的initramfs
2.3 编译内核内核配置选项有2选1,3选1,2选1为yes和no,3选1为yes,no,module。Module意味着该配置项被选定了,但是编译的时候这部分功能的实现代码是以模块的形式生成。
make config 该工具会挨个遍历所有配置项。
make menuconfig 基于ncurse库编制的图形界面工具。
make xconfig 基于X11的图形工具。
make gconfig 基于gtk+图形工具。
2.4.1 GNU C1 内联函数Inline这个名称就可以反应出它的工作方式,函数会在它所调用的位置上展开,这么作可以消除函数调用和返回所带来的开销(寄存器存储和恢复),而且,由于编译器会把调用函数的代码和函数本身放在一起进行优化,所以也有进一步优化代码的可能。不过,这么作是有代价的,代码会变长,这就意味着占用更多的内存空间或者占用更多的指令缓存。[color="#FF0102"]内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数。[color="#000102"]定义一个内联函数时候,[color="#FF0102"]需要使用static作为关键字,并且用inline限定[color="#000102"]。[color="#FF0102"]实践中一般在头文件中定义内联函数[color="#000102"]。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件的开始地方。[color="#000102"]
[color="#000102"]2 内联汇编[color="#000102"]gcc编译器支持在C函数中嵌入汇编指令。当然,在内核编程的时候,只有知道对应的体系结构才能使用这个功能。[color="#000102"]linux的内核混合使用了C和汇编语言,在偏近体系结构的底层或对执行时间要求严格的地方,一般使用的是汇编语言。[color="#000102"]
[color="#000102"]3 分支声明[color="#000102"]对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分之选择进行优化。内核把这条指令封装成了宏,比如[color="#FF0102"]likely()和unlikely()[color="#000102"],这样用起来比较方便。[color="#000102"]/*我们认为foo绝大多数时候都会为0...*/[color="#000102"]if(unlikely(foo)){[color="#000102"].....[color="#000102"]}[color="#000102"]相反,如果我们想把一个分支标记为通常为真的选择:[color="#000102"]/*我们认为foo绝大多数时候都不会为0...*/[color="#000102"]if(likely(foo)){[color="#000102"]...[color="#000102"]}[color="#FF0102"]在对一些错误判断时候通常用到unlikely()和likely()[color="#000102"]。[color="#000102"]
[color="#000102"]2.4.2 没有内存保护机制[color="#000102"]如果一个用户程序试图进行一次非法的内存访问,内核会发现这个错误,发送SIGSEGV,并结束整个进程。然后,如果是内核自己非法访问了内存,那后果就很难控制。[color="#000102"]此外,[color="#FF0102"]内核中的内存都不分页[color="#000102"],就是说,用掉了一个字节,物理内存就少一个字节。[color="#000102"]
[color="#000102"]2.4.3 不要轻易使用浮点数[color="#000102"]
[color="#000102"]2.4.4 容积小而固定的栈[color="#000102"]用户空间的程序可以从栈上分配大量空间,因为用户空间的栈比较大,而且还可以动态的增长。[color="#000102"]在内核空间,栈的大小随体系结构而变,可以是4KB也可以是8KB。[color="#FF0102"]从历史上说,内核大小是两页[color="#000102"]。这就是说32位机内核栈是8KB,而64位机是16K,这个是固定不变的,每个处理器都有自己的栈。[color="#000102"]
[color="#000102"]2.4.5 同步和并发[color="#000102"]内核很容易产生竞争条件。和单线程的用户空间程序不同,内核的许多特性都要求能够并发的访问共享数据,这就要求有同步机制保证不出现竞争条件。尤其是:linux是抢占多任务操作系统,linux内核支持多处理器系统,中断是异步到来的,linux内核可能抢占。[color="#FF0102"]这些都可能会互相影响共享资源的访问[color="#000102"]。[color="#000102"]
[color="#000102"]2.4.6 可移植的重要性。[color="#000102"]
[color="#000102"]
[color="#000102"]
[color="#000102"]
[color="#000102"]
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103763/showart_2160717.html |
|