免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1275 | 回复: 0
打印 上一主题 下一主题

从内核出发 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-26 11:42 |只看该作者 |倒序浏览
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP