没有合适的资源?快使用搜索试试~ 我知道了~
重点linux源码分析.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 22 浏览量
2022-10-26
22:12:07
上传
评论
收藏 345KB PDF 举报
温馨提示
试读
12页
。。。
资源推荐
资源详情
资源评论
[重点]linux 源码分析
linux 源码分析
Linux 内核源代码中的 C 语言代码
Linux 内核的主体是以 GNU 的 C 语言编写的,GNU 为此提供了编译工具
gcc。GNU 对 C 语言本身
(在 ANSI C 基础上)做了不少扩充,可能是读者尚未见到过的。另一方面,由
于内核代码,往往会用
到一些在应用程序设计中不常见的语言成分或编程技巧,也许使读者感到陌
生。本书并非介绍 GNU C
语言的专著,也非技术手册,所以不在这里一一列举和详细讨论这些扩充和技
巧。再说,离开具体的情
景和上下文,罗列一大堆规则,对于读者恐怕也没有多大帮助。所以,我们在
这里只是对可能会影响读
者阅读 Linux 内核源程序,或使读者感到困惑的一些扩充和技巧先作一些简
单的介绍。以后,随着具体
的情景和代码的展开,在需要时还会结合实际加以补充。
首先,gcc 从 C++语言中吸收了“inline”和“const”。其实,GNU 的 C 和
C++是合为一体的,gcc
既是 C 编译又是 C++编译,所以从 C++中吸收一些东西到 C 中是很自然的。
从功能上说,inline 函数的 使用与#define 宏定义相似,但更有相对的独立性,
也更安全。使用 inline 函数也有利于程序调试。如果 编译时不加优化,则这些
inline 就是普通的、独立的函数,更便于调试。调试好了以后,再采用优化重
新编译一次,这些 inline 函数就像宏操作一样融入了引用处的代码中,有利
于提高运行效率。由于 inline 函数的大量使用,相当一部分的代码从.c 文件移
入了.h 文件中。
还有,为了支持 64 位的 CPU 结构(Alpha 就是 64 位的),gcc 增加了一种新
的基本数据类型“long
long int”,该类型在内核代码中常常用到。 许多 C 语言都支持一些“属性
描述符”(attribute),如“aligned”、“packed”等等;gcc 也支持不少 这样的
描述符。这些描述符的使用等于是在 C 语言中增加了一些新的保留字。可是,在
原来的 C 语言(如 ANSI C)中这些词并非保留字,这样就有可能产生一些冲突。
例如, gcc 支持保留字 inline,可是由于“inline” 原非保留字(在 C++中是保
留字),所以在老的代码中可能已经有一变量名为 inline,这样就产生了冲突。
为了解决这个问题,gcc 允许在作为保留字使用的“inline”前、后都加上
“__”(注意,是两个下划线), 因而“__inline__”等价于保留字“inline”。
同样的道理,“__asm__”等价于“asm”。这就是我们在代码 中有时候看到
“asm”,而有时候又看到“__asm__”的原因。
gcc 还支持一个保留字“attribute”,用来作属性描述。如:
struct foo {
char a;
int x[2];
} __attribute__((packed));
这里属性描述“packed”表示在字符 a 与整形数组 x 之间不应为了与 32 位
长整数边界对齐而留下空
洞。这样“packed”就不会与变量名发生冲突了。 由于在 Linux 的内核中使
用了 gcc 对 C 的扩充,很自然地 Linux 的内核就只能用 gcc 编译。不仅如
此,由于 gcc 和 Linux 内核在平行地发展,一旦在 Linux 内核中使用了
gcc,在其较新版本中有了新增加 新扩充,就不能再使用较老的 gcc 来编译。也
就是说, Linux 内核的各个版本有着对 gcc 版本的依赖关系。 读者自然会
问:“这样,Linux 内核的可移植性是否会受到损害,”
回答是:“是的,但这是经过权衡利
弊以后作出的决定。”首先,在可移植性与本身的质量之间,GNU 选择了以质
量为优先。再说,将 gcc
移植(其实就是扩充)到新的 CPU 上应非难事。回顾一下 Unix 的历史。最初
的 Unix 是以汇编和 B 语 言书写的,正是因为 Unix 的需要才有了 C 语言。所
以,C 语言可说是 Unix 的孪生物。Unix 要发展,C 语言自然也要发展。对于
Unix 来说,C 语言不过是工具,而工具当然要服从目的本身的需要。其次,可
移植性问题看似重大,其实并不太严重。如前所述,目前的 Linux 内核源代
码已经支持几乎所有重要的、
常用的 CPU,gcc 支持的 CPU 就更多了。而且,gcc 还支持对各种 CPU 的交
叉编译。
如前所述,Linux 内核的代码中使用了大量的 inline 函数。不过,
这并未消除对宏操作的使用,内核
中仍有许多宏操作定义。人们常常会对内核代码中一些宏操作的定义方式感到
迷惑不解,有必要在这里
作一些解释。先看一个实例,取自 fs/proc/kcore.c 第 163 行。
00163: #define DUMP_WRITE(addr,nr) do { memcpy(bufp,addr,nr);
bufp += nr; } while(0) Linux 内核源代码情景分析
读者想必知道,do-while 循环是先执行后判断循环条件。所以这个定义意味
着每次引用这个宏操作
剩余11页未读,继续阅读
资源评论
G11176593
- 粉丝: 6643
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功