0%

30天自制操作系统-第0天,环境搭建

书买了半个月了,也看了前几天的量了。不过一直没动手敲代码,那便不算开始罢。书看得出日文版截稿比较早,内容环境还是基于WinXP(貌似写的WinXP都是时新货的样子XD)光盘附带的工具看得出都是Linux下的一套,Qemu,make,gcc,Makefile。之前架设这个博客的时候就受过惨痛教育(Hexo基于Node.js,上传工具用Git。在windows下用起来,别扭不说,突出一个蛋疼。)于是准备在Debian下部署环境。

好的吧,本书看样子截稿是挺久远了,工具下载页面也年久失修啦。打开则纯HTML风迎面飘来。另存到本地,打开后GOOGLE翻译下,有Linux的环境可以直接下载。可是其中内容也是GCC,也是make,何必用他的捏。好吧,这是强迫症,得治疗。自己定义了源代码的目录结构,Makefile准备在以后看书的时候再慢慢写呗。


  1. 首先是虚拟机模拟环境:
    qemu的执行命令和旧版本也有些许不同。旧的命令参考作者网站给出的链接也应该是
    qemu -m 32 -localtime -STD-VGA -FDA 'XXXX.img'
    而由Apt-get到的版本则是
    qemu -m 32 -localtime -vga std -fda xxx.img
  2. 不过都不是大问题,很快就解决了。但是在链接 C和汇编 Obj文件的时候,出了问题。原书用的是nask,一个修改版的nasm。比起远古版本的nask,我选择了nasm。在这我参考在MAC上搭建环境的这篇文章。所以也用了他的测试代码。编译没有问题,很顺利,可是在链接过程报错了。
    初次报错
    尝试修改掉汇编源代码中符号前的下划线,并且连接时去掉main前的下划线。再次报错,不过错误减少。
    再次报错
    看样子和架构有关,但是两个obj文件都已经用参数定义为32位。挠头后一无所获。将两个文件都重新以64位编译,链接成功。但是执行的时候提示段错误。意识到可能ld链接也区分32位和64位。重新查看参数,加入-m elf_i386选项,链接成功,执行成功。

最后环境如下:

  • 由nasm编译nas汇编文件
  • 由GCC编译 C语言文件
  • 由GNU make管理编译过程
  • 由Qemu来做虚拟机,模拟启动。

以上都可以由apt-get获取。

总结

  • 搜索相关结果,旧版本GCC为了兼容老库,会自动添加下划线。而新版本的GCC不再在编译时向符号名中添加下划线。但是可以由选项重新开启这个功能。

  • ld链接也区分系统架构,mac不需要加选项可能是32位?反正是因为环境不同(在这点上,我傻逼了)。