Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567083
  • 博文数量: 213
  • 博客积分: 6789
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-01 17:11
文章分类

全部博文(213)

文章存档

2012年(9)

2011年(62)

2010年(99)

2009年(43)

分类: LINUX

2010-01-26 11:42:46

2.2 内核源码树
arch            特定体系结构的源码
crypto Crypto   API
Documentation   内核源码文档
drivers         设备驱动程序
fs              VFS和各种文件系统
include         内核头文件
init            内核引导和初始化
ipc             进程间通信代码
kernel          像调度程序这样的核心子系统
lib             通用内核函数
mm              内存管理子系统和VM
net             网络子系统
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 C
1 内联函数
Inline这个名称就可以反应出它的工作方式,函数会在它所调用的位置上展开,这么作可以消除函数调用和返回所带来的开销(寄存器存储和恢复),而且,由于编译器会把调用函数的代码和函数本身放在一起进行优化,所以也有进一步优化代码的可能。不过,这么作是有代价的,代码会变长,这就意味着占用更多的内存空间或者占用更多的指令缓存。内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数。
定义一个内联函数时候,需要使用static作为关键字,并且用inline限定
实践中一般在头文件中定义内联函数。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件的开始地方。

2 内联汇编
gcc编译器支持在C函数中嵌入汇编指令。当然,在内核编程的时候,只有知道对应的体系结构才能使用这个功能。
linux的内核混合使用了C和汇编语言,在偏近体系结构的底层或对执行时间要求严格的地方,一般使用的是汇编语言。

3 分支声明
对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分之选择进行优化。内核把这条指令封装成了宏,比如likely()和unlikely(),这样用起来比较方便。
/*我们认为foo绝大多数时候都会为0...*/
if(unlikely(foo)){
.....
}
相反,如果我们想把一个分支标记为通常为真的选择:
/*我们认为foo绝大多数时候都不会为0...*/
if(likely(foo)){
...
}
在对一些错误判断时候通常用到unlikely()和likely()

2.4.2 没有内存保护机制
如果一个用户程序试图进行一次非法的内存访问,内核会发现这个错误,发送SIGSEGV,并结束整个进程。然后,如果是内核自己非法访问了内存,那后果就很难控制。
此外,内核中的内存都不分页,就是说,用掉了一个字节,物理内存就少一个字节。

2.4.3 不要轻易使用浮点数

2.4.4 容积小而固定的栈
用户空间的程序可以从栈上分配大量空间,因为用户空间的栈比较大,而且还可以动态的增长。
在内核空间,栈的大小随体系结构而变,可以是4KB也可以是8KB。从历史上说,内核大小是两页。这就是说32位机内核栈是8KB,而64位机是16K,这个是固定不变的,每个处理器都有自己的栈。

2.4.5 同步和并发
内核很容易产生竞争条件。和单线程的用户空间程序不同,内核的许多特性都要求能够并发的访问共享数据,这就要求有同步机制保证不出现竞争条件。尤其是:linux是抢占多任务操作系统,linux内核支持多处理器系统,中断是异步到来的,linux内核可能抢占。这些都可能会互相影响共享资源的访问

2.4.6 可移植的重要性。





阅读(617) | 评论(0) | 转发(0) |
0

上一篇:进程调度

下一篇:__builtin_constant_p

给主人留下些什么吧!~~