显示字符串的程序,《30天自制操作系统》的作者川合秀实先生在第5章的第六节所完成的一个程序。
我试着将作者的程序,改编了一下,使其可以在流行的编译器与虚拟机上运行着。
所谓的流行的编译器,指的是GNU AS编译器与GCC编译器。
其中,GNU AS编译器是可以编译AT&T汇编语言的,而GCC是可以编译C语言的。
GNU AS与GCC都是GNU项目,两者应该可以算作是无缝对接了吧。
我当初之所以要来学习GNU AS汇编,也是为了能够比较方便地去阅读 Linux 内核源代码。
在这里,我将自己改编的代码,传到了CSDN里面。下面就是代码包的下载链接。
代码包链接
欢迎大家来下载代码包。
在改编这个代码的时候,我其实是耗费了一点力气的。首先呢,我是需要将作者所用的类似于nasm的语法,改编为AT&T汇编语法。
这样改编了以后,有的地方,它还是不能够运行的。这是因为,作者的许多的代码,其实原本就只是适用于他自己编写的编译器,而我们用流行的编译器去编译代码的时候,是会出错的。为此,我还需要构思与规划代码,想着如何来改编代码。
有这么几个地方,算是较大的修改的。
第一,原作者的nas后缀的文件,我将其改成了gas后缀。原作者的nask字样,我将其改成了gas字样。
第二,原作者是将正式内核的执行代码,加载到了0x280000的高地址。而我的改编版代码,则是先将内核搬运到0x10000开始的地方,随后又搬运到了0x0000开始的地方。
第三,原作者的代码里面,没有head.s文件,这个文件,是我自己加上去的。里面的代码,也全是我参考着Linux 0.12内核,写成的。
第四,修改了原书的GDT表。在原书里面,GDT表有三项,第二项为数据段,第三项为代码段。而在我的代码里面,第二项为代码段,第三项为数据段。并且呢,在段描述符的设置上,我主要是采用了Linux 0.12内核的处理办法,然后呢,修改了一下Linux 0.12内核的段限长,使得代码段和数据段的段限长,最终都和作者的设置保持了一致,为4G的长度。
第五,原书里面,作者将显卡的参数,保存在了0x0ff0开始的一段内存空间中。而在我的代码里面,我是将显卡的相关参数保存在了0x90ff0开始的内存中。也就是,我的代码,相比作者原来的代码,它是将地址值加了0x90000。
第六,原书并没有make_font.c程序,也并没有hankaku.h头文件。我为了让自己改编的代码能够显示字符串,自行编写了make_font.c源文件,这个源文件编译以后,用来读取hankaku.txt文档,然后输出hankaku.h头文件。因此,我的代码文件,在bootpack.c里面,
有着#include "hankaku.h"
的代码。而作者本人的程序里面,不是这样的代码,而是另外的模样。
大体上,在改编这个代码的时候,我算是学习了好多。我觉得,Linux世界,可谓是门道很多啊。我觉得,学习Linux系统,学习Linux内核,学习操作系统的知识,都不太容易吧。
我觉得,操作系统知识的学习,这是一个比较耗费心神的东西。
改编这些个代码的时候,真的是挺累的。
改编完成以后,喜悦感不是很大,更多地,还是疲累。
接下来,我大概会不定期地写作CSDN博客。大家若是喜欢我的文章的话,欢迎来点赞和关注啊。



