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