Linux内核入门(四)—— 内核汇编语言规则

    任何一个用高级语言编写的操作系统,其内核源代码中总有少部分代码是用汇编语言编写的。读 过Unix Sys V源代码的读者都知道,在其约3万行的核心代码中用汇编语言编写的代码约2000行,分 成不到20个扩展名为.s和.m的文件,其中大部分是关于中断与异常处理的底层程序,还有就是与初始 化有关的程序以及一些核心代码中调用的公用子程序。

    用汇编语言编写核心代码中的部分代码,大体上是出于如下几个方面的考虑的:

   ●   操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C 语言中并无对应的语言成分。例如,在386系统结构中,对外设的输入/输出指令如inb, outb 等均无对应的C语言语句。因此,这些底层的操作需要用汇编语言来编写。CPU中的一些对 寄存器的操作也是一样,例如,要设置一个段寄存器时,也只好用汇编语言来编写。
   ●   CPU中的一些特殊指令也没有对应的C语言成分,如关中断,开中断等等。此外,在同一种 系统结构的不同CPU芯片中,特别是新开发出来的芯片中,往往会增加一些新的指令,例如 Pentium, Pentium II和Pentium MMX,都在原来的基础土扩充了新的指令,对这些指令的使用 也得用汇编语言。
   ●   内核中实现某些操作的过程、程序段或函数,在运行时会非常频繁地被调用,因此其(时间) 效率就显得很重要。而用汇编语言编写的程序,在算法和数据结构相同的条件下,其效率通常 要比用高级语言编写的高。在此类程序或程序段中,往往每一条汇编指令的使用都需要经过推 敲。系统调用的进入和返回就是一个典型的例子。系统调用的进出是非常频繁用到的过程,每 秒钟可能会用到成千上万次,其时间效率可谓举足轻重。再说,系统调用的进出过程还牵涉到 用户空间和系统空间之间的来回切换,而用于这个目的的一些指令在C语言中本来就没有对 应的语言成分,所以,系统调用的进入和返回显然必须用汇编语言来编写。
   ●   在某些特殊的场合,一段程序的空间效率也会显得非常重要。操作系统的引异程序就是一个例 子。系统的引导程序通常一定要能容纳在磁盘上的第一个扇区中。这时候,哪怕这段程序的大 小多出一个字节也不行,所以就只能以汇编语言编写。

    在Linux内核的源代码中,以汇编语言编写的程序或程序段,有几种不同的形式:

    第一种是完全的汇编代码,这样的代码采用.s作为文件名的后缀。事实上,尽管是“纯粹”的汇编代码,现代的汇编工具也吸收了C语言预处理的长处,也在汇编之前加上了一趟预处理,而预处理 之前的文件则以.S为后缀。此类(.S)文件也和C程序一样,可以使用#include, #ifdef等等成分,而 数据结构也一样可以在.h文件中加以定义。

    第二种是嵌入在C程序中的汇编语言片段。虽然在ANSI的C语言标准中并没有关于汇编片段的 规定,事实上各种实际使用的C编译中都作了这方面的扩充,而GNU的C编译gcc也在这方面作了 很强的扩充。

    此外,内核代码中也有几个Intel格式的汇编语言程序,是用于系统引导的。 由于我们专注于Intel i386系统结构下的Linux内核,下面我们只介绍GNU对i386汇编语言的支持

    对于新接触Linux内核源代码的读者,哪怕他比较熟悉i386汇编语言,在理解这两种汇编语言的 程序或片段时都会感到困难,有的甚至会望而却步。其原因是:在内核“纯”汇编代码中GNU采用了 不同于常用386汇编语言的句法;而在嵌入C程序的片段中,则更增加了一些指导汇编工具如何分配 使用寄存器、以及如何与C程序中定义的变量相结合的语言成分。这些成分使得嵌入C程序中的汇编 语言片段实际上变成了一种介乎386汇编和C之间的一种中间语言。

    所以,我们先集中地介绍一下在内核中这两种情况下使用的386汇编语言,以后在具体的情景中 涉及具体的汇编语言代码时还会加以解释。

 

1 GNU的386汇编语言


    在Dos/Windows领域中,386汇编语言都采用由Intel定义的语句(指令)格式,这也是几乎在所 有的有关386汇编语言程序设计的教科书或参考书中所使用的格式。可是,在Unix领域中,采用的却 是由AT&T定义的格式。当初,当AT&T将Unix移植到80386处理器上时,根据Unix圈内人上的习 惯和需要而定义了这样的格式。Unix最初是在PDP-11机器上开发的

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值