本来说好的接下来的工作是要去“丰满”我们的内核,可咱们这种一步一回头的学习方式还得继续啊。其实我了解大家急切写内核的心情,但本书《操作系统真象还原》(请大家支持正版)的目的不是写一个操作系统就完事了,而是让大家明白一个至少能运行的操作系统为什么要这样写,所以咱们的学习方式必然是边学习理论知识边实践。如果不给大家交待清楚必要的理论知识,我也对不起自己的良心,我不能为了自己的懒惰而假装大家都明白了。另外,既然咱们都渴望学习,能了解到更多的混合编程方式不是更好吗,好啦,不煽情了,开始学习go! go! go!。
开门见山,汇编语言和c语言混合编程可分为两大类:
- 单独的汇编代码文件与单独的c语言文件分别编译成目标文件后,一起链接成可执行程序。
- 在c语言中嵌入汇编代码,直接编译生成可执行程序。
本节所说的“汇编语言和c语言混合编程”属于第1种,第2种的内嵌汇编又称为内联汇编,以后咱们会有专门的章节来说的。在内核文件中,有些比较长的汇编代码真不适合用内联汇编完成,还是需要专门写个汇编代码文件专项专用。
简单起见,咱们先学习下linux系统调用,利用系统调用能够帮助简化演示的模型。
系统调用是linux内核提供的一套子程序,它和windows的动态链接库dll文件的功能一样,用来实现一系列在用户态不能或不易实现的功能,比如最常见的读写硬盘文件,只有操作系统有权限去访问硬件,用户程序是没有权限的,用户程序只能向操作系统寻求帮助,故系统调用是供用户程序来使用的,操作系统权利至高无上,不需要使用自己对外发布的功能接口,即系统调用。
由于是用户程序想使用操作系统提供的功能,所以系统调用又称为操作系统功能调用。
系统调用很像bios中断调用(在很久很久以前咱们有说过bios中断、dos中断等内容),只不过系统调用的入口只有一个,是第0x80号中断,它不像bios中断那样,几乎是一个功能就有一个入口,所以您在bios中断手册中会见到那么多的中断调用啦,比如中断号 0~0x20都是bios的中断调用。
为什么系统调用只有一个入口呢?以后咱们学习中断机制的时候就会明白,中断的实现是要用到中断描述符表的,表中很多中断项(号)是被预留的,不能强占,所以linux就选了一个可用的中断号做个所有系统调用的统一入口,具体的子功能在寄存器eax中单独指定。
总之,bios中断走的是中断向量表,所以有很多中断号给它用,而系统调用走的是中断描述符表中的一项而已,所以只用了第0x80项中断。