- 浏览: 12144 次
最新评论
初探Linux kernel之喝凉水系列二
2011年03月03日
今天来介绍一下内核开发和应用程序开发的差别:
l 内核编程时不能访问C库(因为Linux下很多C库函数是对Linux系统调用的封装,自身怎么可以调用自身呢?)
l 内核编程时必须使用GNU C。
l 内核编程时缺乏像用户空间那样的内存保护机制。
l 内核编程时浮点数很难使用。
l 内核只有一个很小的定长堆栈。
l 由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发。
l 要考虑可移植性的重要性。
下面对这几点进行描述。
1、首先就是内核不能访问C库的问题,你想啊Linux下很多C库函数是对Linux系统调用的封装,自身怎么可以调用自身呢?这里的系统调用学过OS的应该都清楚,是系统应用给用户提供的编程接口,注意这里的对象是用户。注意啦,程序员也是分等级的,在kernel级别的编程(这里指纯kernel编程),你已经看不到系统调用,此时你的职责可能就是为系统添加一个系统调用(后边会讲到),且C库是应用层对底层系调(系统调用,为了便于我打字,后边可能会多次出现)的封装,从逻辑的角度你也该明白了吧。那么问题就出来了,没有c库怎么办,还谈什么模块化,难不成都自己写?这就是接下来的问题。
2、既然kernel不能调用C库,那么它就得拥有自己独立的c语言库,这样才能高内聚低耦合,并且提升其安全性,所以就用了GNU C 。短小精悍效率高,毕竟是专才专用。这里需要注意一点,内核中没有实现printf(); 但是有功能更为强大的printk();其实也谈不上功能强大(因为printf() 本身就很强大,尤其是在调试时,这里也显出了printk的优势),它和printf() 的显著区别就是printk() 允许通过指定一个标志来设置优先级。Syslog会根据这个优先级标志来决定什么地方显示这条系统消息。如:
printk( KERN_ERR “This is an error!”); // 不理解吧,我也不理解,后边内核调试时肯定还会将这东西,不怕。
3、内核编程时缺乏像用户空间那样的内存保护机制。你在做什么?内核好不好,这是一个OS的核心部分,控制着整个系统的运转,自然要有处理协调整个系统的权利,在内核coding的东西就是OS核心的一部分,是给别人或者自己在OS的上一层用的。既然你是把握这一切的,且又是在硬件基础上的第一层抽象,另外还把握着全局,内存的控制自然也不能束缚你,就像在公司工作一样,领导要在可能的范围内尽可能的下放权力,下属才能发挥他的极致,估计kernel也是这样,内存访问,包括其他的内核结构都不对出于内核的你进行束缚,当然也没有进行相应的保护机制。因为这是的内核是你的,你没必要傻逼到写程序让自己的系统崩溃吧,哈哈。这也留了一个问题,就是在coding过程中要斟酌好啊。
4、内核编程时浮点数很难使用。这里你需要知道的是在用户空间的进程进行浮点操作时,kernel会完成从整数到浮点数的模式转换,一般是通过捕获陷阱并作相应的处理的实现的。(陷阱可以算是一种特殊的异常,是从用户态进入内核态的途径,后边会进一步介绍。)
与用户空间不同的是,kernel并不能完美的支持浮点操作,因为自身不能陷入自身。在kernel中使用浮点数时,除了要人工保存和恢复浮点寄存器,还有很多琐碎的事要做。直截了的说就是:不要在kernel中使用浮点数!!!
5、内核只有一个很小的定长堆栈。在x86上,kernel的栈是在编译时配置的,可为4k或者8k,且每个处理器都有自己的栈。为什么这么小呢?大了不可以么?我的理解是,现在都在追求微内核,这是一方面原因,还有就是内核也是一个软件,只不过是包含了硬件抽象且富含大量系统管理功能的进程,而其他功能的进程(系统调用,其他内核进程),在调度是,存在内核抢占和代替内核执行的情况,这是要将要执行的进程的上下文切换过来,当然这些数据都会出现在栈里边,你想如果栈很大,那么操作时内存访问地址会很长,访问时占内存且费时间,会降低效率,所以要尽可能的小且灵活……
6、由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发。这不仅仅是linux kernel ,是所有现有的多进程/多线程并发OS都要注意的,包括多线程编程也一样,你就把kernel 想成是一个多线程的执行程序就OK了,不难理解。
7、要考虑可移植性的重要性。这个更不用多说了,因为这是linux的一个灰常显著的特征,大到企业的服务器,小到嵌入式的android ,IP camera ……等很多东西不同平台构架的cpu …… 应该是目前跑的平台最多的OS了,所以他的内核要有足够的可移植性,似乎有点java的感觉,哈哈,毕竟我是学java出身的啊……
OK,未完待续……
其他相关请关注:http://blog.csdn.net/dreambegin 博客更新。
发表评论
-
Red5学习笔记(一):入门及配置
2012-01-20 10:36 841Red5学习笔记(一):入门及 ... -
FLEX 开发领域你知多少?
2012-01-20 10:36 543FLEX 开发领域你知多少? ... -
chatroulette 与RTMFP
2012-01-20 10:36 741chatroulette 与RTMFP 2010年0 ... -
使用PHP模拟RTMP客户端发送AMF消息(弹幕发射器)
2012-01-20 10:36 1187使用PHP模拟RTMP客户端发 ... -
.net 网站项目dll引用的管理问题
2012-01-20 10:36 814.net 网站项目dll引用的 ... -
GCC
2012-01-19 15:41 538GCC 2011年10月21日 The History ... -
C库函数
2012-01-19 15:41 573C库函数 2010年06月28日 rename()文件改 ... -
D200的库设置
2012-01-19 15:41 684D200的库设置 2010年07月2 ... -
关于malloc函数后free内存空间的疑问
2012-01-19 15:41 623关于malloc函数后free内存空间的疑问 2011年11 ... -
2012-1-13
2012-01-17 05:24 4842012-1-13 2012年01月13日 2011-2 ... -
google地图API开发基础(三):控件
2012-01-17 05:23 768google地图API开发基础(三 ... -
手机党心声:“离开手机生活”这是不可能的!
2012-01-17 05:23 544手机党心声:“离开手机生活”这是不可能的! 2012年01月 ... -
Alienware新版全机型超详细全导购(升级价格/配置参考/建议分析/选配配置)!!
2012-01-17 05:23 667Alienware新版全机型超详 ... -
actually, i …
2012-01-17 05:23 540actually, i … 2012年01月13日 其实 ... -
上海老百姓的胆量 VS 大牌店营业员的势利
2012-01-16 04:18 689上海老百姓的胆量 VS 大 ... -
是谁成就了凤姐的忘形
2012-01-16 04:18 465是谁成就了凤姐的忘形 2010年06月02日 ... -
第七十三章 暗杀
2012-01-16 04:18 559第七十三章 暗杀 2011年06月10日 丰含笑又等了 ... -
看“非诚勿扰”(2011.3.27)
2012-01-16 04:18 281看“非诚勿扰”(2011.3.27 ...
相关推荐
目前在Linus Torvalds的监督之下,Linux核心约2到3个月发布一个新的稳定版本,每次更新大约包含8000到12000项修改,平均每小时有提交6.88次修改。内核所有文件代码已超过1500万行,大约以每年10%的代码量在增长。 ...
实时Linux操作系统初探.pdf
20160921-华泰证券-多因子系列之一:华泰多因子模型体系初探.pdf
20160921-华泰证券-多因子系列之一:华泰多因子模型体系初探(1).pdf
地产行业杂谈系列之十六:社区增值服务模式初探
第2章 Linux基础命令 2.1 Linux常用操作命令 2.2 Linux启动过程详解 2.3 Linux系统服务 2.4 实验内容 本章小结 思考与练习 第3章 Linux下的C编程基础 3.1 Linux下C语言编程概述 3.2 进入Vi 3.3 ...
Linux核心初探.pdf
Linux优势初探.pdf
嵌入式实时Linux操作系统初探.pdf
实时linux操作系统初探
这本有关linux入门的文档是从‘李正果’的个人网站上下载而来的,希望对刚入门者有些指导作用。
Linux操作系统初探.pdf
与Linux同行——Linux平台上网工具初探.pdf
Linux驱动初探
海通证券_20160606_海通证券选股因子系列研究(十一):LEVEL2行情选股因子初探.pdf
Linux和Windows服务器的统一管理初探.pdf
宏定义第二句定义一个函数指针__initcall_customize_machine3 宏定义第三句将定义的这个函数指针放到.initcall3.init 中 宏定义第三行定义函数指针__initcall_customize_machine3 指向customize_machine
Linux操作系统教学改革初探.pdf
Linux操作系统在Windows平台上运行仿真系统研究的初探.pdf