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语言代码的更多相关文章

  1. linux 内核源代码情景分析——linux 内核源码中的汇编语言代码

    1. 用汇编语言编写部分核心代码的原因: ① 操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C语言中并无对应的语言成分: ② CPU中的一些特殊指令也没有对应的C语言成 ...

  2. linux 内核源代码情景分析——linux 内存管理的基本框架

    386 CPU中的页式存管的基本思路是:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射.这种映射模式在大多数情况下可以节省页面表所占用的空间.因为大多数进程不会用到整个虚存空间,在虚存空 ...

  3. Linux内核源代码情景分析系列

    http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统  5.1 概述 构成一个操作系统最重要的就 ...

  4. go语言调度器源代码情景分析之五:汇编指令

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...

  5. go语言调度器源代码情景分析之四:函数调用栈

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第3小节. 什么是栈 栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需 ...

  6. go语言调度器源代码情景分析之二:CPU寄存器

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第1小节. 寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时 ...

  7. 《Android系统源代码情景分析》连载回忆录:灵感之源

    上个月,在花了一年半时间之后,写了55篇文章,分析完成了Chromium在Android上的实现,以及Android基于Chromium实现的WebView.学到了很多东西,不过也挺累的,平均不到两个 ...

  8. go语言调度器源代码情景分析之三:内存

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第2小节. 内存是计算机系统的存储设备,其主要作用是协助CPU在执行程序时存储数据和指令. 内存由大量内存单元组成,内存单元大小为 ...

  9. Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...

随机推荐

  1. 利用 g4l 完整备份和还原Linux系统

    前言: 1.Windows中Ghost由于一系列原因,有不支持分区格式,因此可能无法完整备份Linux. 2.g4l = Ghost for Linux 1.下载g4l https://sourcef ...

  2. PHP设计模式之门面模式

    门面模式,也叫外观模式.不管是门面还是外观,都是我们对外的媒介,就好像我们的脸面一样.所以,这个模式最大的特点就是要表现的"好看".怎么说呢?一堆复杂的对象调用,自己都看蒙了,特别 ...

  3. Mysql实现排序

    排序   SELECT     obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum FROM     (         SELECT     ...

  4. web、app、小程序测试异同点

    http://www.spasvo.com/Company/news_show.asp?id=702 https://blog.csdn.net/weixin_43489515/article/det ...

  5. windom 下面redis安装和扩展安装

    参考 https://www.cnblogs.com/yulongcode/p/10585229.html https://blog.csdn.net/qq_41921511/article/deta ...

  6. NetCore5实现https请求

    前言 本文主要介绍在NetCore5中,实现证书加载和https访问请求. 证书准备 首先我们先创建一个自定义的证书Kiba518.pfx. 证书创建参考:最通俗易懂的RSA加密解密指导. 然后将证书 ...

  7. Flawfinder在Python2和Python3环境下对代码进行扫描方法

    1. Flawfinder Flawfinder是一款开源的关于C/C++静态扫描分析工具,其根据内部字典数据库进行静态搜索,匹配简单的缺陷与漏洞. 官网:https://dwheeler.com/f ...

  8. jQuery实现购物车功能

    1.HTML代码(品优购模版) <!DOCTYPE html> <html lang="zh-CN"> <head> <meta char ...

  9. docker - compose 部署 Nginx

    主要介绍 docker 中 Nginx 的部署及项目目录挂载券的方法.docker 中部署一个服务,有三种方法,分别是 docker run.Dockerfile.docker-compose . 下 ...

  10. C语言的return语句

    Q1:函数中的Return语句有什么用? Q2:Return 0有什么含义吗? A1:Return的作用为,跳出当前的函数,并且返回到调用当前函数的主调函数,当前函数中Return语句一下代码将不会运 ...