初探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 博客更新。
发表评论
-
Microsoft 数据访问技术总结
2012-01-20 01:07 426Microsoft 数据访问技术总 ... -
visual studio 2008下装CGAL
2012-01-20 01:07 477visual studio 2008下装CGAL 2010年 ... -
C# 中使用 Win32 和其他现有库
2012-01-20 01:07 460C# 中使用 Win32 和其他现有库 2011年03月25 ... -
linux 下安装android遇到的问题及解决
2012-01-20 01:07 630linux 下安装android遇到的 ... -
winodws上使用vs2008编译QGis-1.6.0
2012-01-20 01:07 842winodws上使用vs2008编译QGis-1.6.0 2 ... -
GCC调试基础知识
2012-01-19 08:56 439GCC调试基础知识 2011年08月19日 1984年, ... -
memmem 函数
2012-01-19 08:56 493memmem 函数 2011年06月02日 软件研发的面 ... -
GCC
2012-01-19 08:56 426GCC 2011年10月21日 The History ... -
C库函数
2012-01-19 08:56 473C库函数 2010年06月28日 rename()文件改 ... -
Photoshop常见问答集
2012-01-17 01:26 404Photoshop常见问答集 ... -
一个PS高手的话,对初学者很实用
2012-01-17 01:26 624一个PS高手的话,对初学 ... -
PHOTOSHOP初学者成长教材
2012-01-17 01:26 471PHOTOSHOP初学者成长教材 ... -
Photoshop初学者必读十课
2012-01-17 01:26 538Photoshop初学者必读十课 2010年06月15日 ... -
玩转诺基亚5800XM,新手上路指南
2012-01-17 01:26 573玩转诺基亚5800XM,新手上路指南 2011年05月11日 ... -
萧皇后历经丧乱连侍五主的人生传奇
2012-01-15 20:07 526萧皇后历经丧乱连侍五 ... -
解读唐朝??雁门勤王,兵不厌诈
2012-01-15 20:07 514解读唐朝??雁门勤王,兵不厌诈 2010年06月16日 ... -
旧唐书 卷六十三??列传第十三
2012-01-15 20:07 428旧唐书 卷六十三??列传第十三 2011年03月05日 ... -
中国历史上的特等美女
2012-01-15 20:07 609中国历史上的特等美女 2010年06月28日 中国古 ... -
祝福我的二十三岁
2012-01-11 12:16 352祝福我的二十三岁 2011年03月10日 ... -
纠正:构造方法优先执行的错误
2012-01-11 12:16 491纠正:构造方法优先执行的错误 2011年03月10日 ...
相关推荐
目前在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