linux 内核源代码情景分析——linux 内核源代码中的C语言代码
linux 内核的主体是以GNU的C语言编写的,GNU为此提供了编译工具gcc。GNU对C语言本身作了不少扩充。
1) gcc 从 C++ 语言中吸收了“inline”和“const”。inline 函数的使用与#define 宏定义相似,但更有相对的独立性,也更安全,因为“inline”函数会进行参数的类型检查。使用inline 函数也有利于程序调试。如果编译时不加优化,则这些inline函数就是普通的、独立的函数,更便于调试。调试好了以后,再采用优化重新编辑一次,这些inline函数就像宏操作一样融入了引用处的代码中,有利于提高运行效率,由于inline函数的大量使用,相当一部分代码从.c文件移入了.h文件中。
2) gcc支持一些“属性描述符”,如“aligned”、“packed”等等,这些描述符的使用等于是在C语言上增加了一些新的保留字,可是,在原来的C语言中这些词并非保留字,这样就有可能产生一些冲突。例如,gcc支持保留字inline,可是由于inline 原非保留字,所以在老的代码中可能已经有一变量名为inline,这样就产生了冲突,为了解决这个问题,gcc允许在作为保留字使用“inline”前、后都加上“__”,因而“__inline__”等价于保留字“inline”,同样的道理,“__asm__”等价于“asm”。这就是我们在代码汇总有时候看到“asm”,而有时候又看到“__asm__”的原因。
3) gcc 还支持一个保留字“attribute”,用来作属性描述。如:
struct foo {
char a;
int x[z] __attribute__ ((packed));
}
这里属性描述“packed”表示在字符a与整型数组x之间不应为了与32位长整数边界对齐而留下空洞,这样,“packed”就不会与变量名发生冲突了。
4) 由于gcc 和Linux 内核在平行的发展,一旦在Linux内核中使用的gcc,在其较新版本中有了新增加扩充,就不能再使用较老版本的gcc来编译。也就是说,Linux 内核的各种版本有着对gcc 版本的依赖关系。
5)
page = ((struct page*)((char*)(curr)-(unsigned long)(&((struct page*)0)->list)));
这里的curr是一个page结构内部的成员list的地址,而我们需要的确实那个page结构本身的地址,所以要从地址curr减去一个偏移量,即成员list在page内部的偏移量,才能达到要求,那么这个偏移量到底是多少呢?&((struct page*)0)->list 就表示当结构page正好在地址0上时其成员list的地址,这就是偏移量。
linux 内核源代码情景分析——linux 内核源代码中的C语言代码的更多相关文章
- linux 内核源代码情景分析——linux 内核源码中的汇编语言代码
1. 用汇编语言编写部分核心代码的原因: ① 操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C语言中并无对应的语言成分: ② CPU中的一些特殊指令也没有对应的C语言成 ...
- linux 内核源代码情景分析——linux 内存管理的基本框架
386 CPU中的页式存管的基本思路是:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射.这种映射模式在大多数情况下可以节省页面表所占用的空间.因为大多数进程不会用到整个虚存空间,在虚存空 ...
- Linux内核源代码情景分析系列
http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统 5.1 概述 构成一个操作系统最重要的就 ...
- go语言调度器源代码情景分析之五:汇编指令
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...
- go语言调度器源代码情景分析之四:函数调用栈
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第3小节. 什么是栈 栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需 ...
- go语言调度器源代码情景分析之二:CPU寄存器
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第1小节. 寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时 ...
- 《Android系统源代码情景分析》连载回忆录:灵感之源
上个月,在花了一年半时间之后,写了55篇文章,分析完成了Chromium在Android上的实现,以及Android基于Chromium实现的WebView.学到了很多东西,不过也挺累的,平均不到两个 ...
- go语言调度器源代码情景分析之三:内存
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第2小节. 内存是计算机系统的存储设备,其主要作用是协助CPU在执行程序时存储数据和指令. 内存由大量内存单元组成,内存单元大小为 ...
- Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
随机推荐
- Android通过WebView实现新闻界面的加载
原文链接:Android实现WebView加载网页及网页美化(简易新闻 四)_Tobey_r1的博客-CSDN博客 效果展示: 我是按照原文作者的步骤一步步来的,中间没有遇到什么问题.主要是界面中有很 ...
- C++ 飞行游戏
源代码: #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace ...
- 关于buildroot移植的思考
buildroot是一个成熟的SDK框架,基于它有了openwrt. 曾经有一个项目,需要将原有的OpenWrt SDK改造,并且将软件框架重新定义.尝试精简原来的OpenWrt,并且删除所有的软件包 ...
- Shell系列(27)- 条件判断之两个整数比较
两个整数之间比较 Liunx中,都是字符型,但是加了数值比较的选项,所以自动将他们转换成了整数型进行比较,不需要对这些参数进行变量转换或者重新声明 测试选项 作用 整数1 -eq 整数2 判断整数1是 ...
- JDBC-2(CRUD)
3.PreparedStatement实现CRUD 3.1 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和SQL语句,接受数据库服务器返回的结果.(一个数据库连接就是也给Socket连接) ...
- Spring Cloud Hystrix 学习(三)请求合并
什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...
- php--laravel --debug--mac
1>安装debug 一.下载xdebug文件 1.将phpinfo();的信息全部输入网址中的框,得到适配的xdebug版本: 网址:http://xdebug.org/wizard.php 2 ...
- phpstoem破解
https://blog.csdn.net/voke_/article/details/78794567
- bzoj1972 SDOI2010-----猪国杀(模拟)
题目自己去找吧 记得数据范围是<=10 注意事项: 1.牌库空的时候,要不断的抽第一张牌 2.反贼的决斗永远是向主公发的 3.每次判定无懈的时候,都是从使用锦囊的那个牌开始,记得敌意和殷勤的判断 ...
- docker环境下搭建python3.6
前言:当我们在一台电脑上搭建了python3.6的环境,下次换了个电脑或者换成linux的系统了又得重新搭建一次,设置环境变量,下载pip等操作.所以使用docker 一.安装python步骤: 1. ...