又有闲时间了,一直没有在x86的计算机上做过裸机编程,只要闲下来就手痒,去买了本《30天自制操作系统》,因为之前听说过这本书,而且是在x86的windows电脑上做的,所以就买来研读了一番,之前写的东西也只在群里共享了,这次正好想开个博客,剩下有一年的闲时间可以打理一下这个博客。所以说,这是第一篇文章,我不去照搬照抄书上的内容,我只是参考一下它搭建的过程,所有我操作的过程我会记下来放在这里,以后给自己和大家能有一个参考,毕竟GCC编写操作系统和AT&T汇编这方面的资料太少了。
作为一个忠实的linux用户,我的操作系统在linux上搭建,具体点说是ubuntu,而且有很多地方我写的比较粗,还是得有一定linux基础的小伙伴来看这些文章。有不太懂的或者我写错的地方,可以直接评论区回复,我会尽可能的回答。
创建一个文件夹,以后这就是操作系统的诞生地了,我起的名字是OranOS
一、罗列一下要用的工具
编译器:GCC,具体说是as、ld和gcc,这三个经常写硬件的小伙伴应该是耳熟能详了,第一个是AT&T格式的汇编器,第二个是连接器,第三个是c语言编译器
汇编语言的编写:gedit,默认的gedit不会高亮显示AT&T汇编语言,我一会儿传一个脚本上来,是从国外网站上搬进来的,特别好用,支持AT&T i386高亮显示而且做的挺好看的,当然Eclipse也是个不错的选择,但是前期就没有必要使用了,等系统复杂了我再使用Eclipse
虚拟机:qemu,书上就是用的这个虚拟机,我之前一直都是vmware,不过看起来还是很好用的,apt-get install装上,具体怎么用现学现卖吧
好像写一个系统也就这些东西,似乎很简单的样子,写文章总喜欢感谢一下GNU,在这里再感谢一下这帮伙计。
二、创建今天用的文件
开始了,第一步,在文件夹里创建好今天要用的文件,先说一嘴,操作系统的大致启动步骤,首先CPU上电,内部电路控制CPU去0xFFFFFFF0这个位置取指令,就是在这16个bytes中存着一个小程序,把BIOS加载到内存某个位置,然后jmp去启动BIOS,BIOS会将某种启动方式的启动程序加载到0x7c00处,比如说用U盘启动,它会把U盘最开始的512个字节加载到0x7c00处,然后这512个字节中就要我们自己写一个loader程序,把我们的系统加载到内存中并且启动起来,真复杂哈,不如arm处理器做的简洁。当然,如果作为一个Linux老司机,GRUB是必须的,GRUB会把操作系统加载到0x10000位置,然后启动。我们写的是基于bios启动的,所以,不关心GRUB了,我们的第一步当然就是把这个loader做出来。
创建今天用的文件:
loader.s:loader的汇编源程序
loader.lds:我习惯用lds指定link方式,当然不用也可以
Makefile:如果想每次都输入那么长的命令行的话,就把这个也省略了吧
1、先把次要工作做完,把Makefile的代码贴上来
run : loader.bin
dd if=loader.bin of=loader.img bs=512 count=1
dd if=/dev/zero of=zero.img bs=1474048 count=1 conv=sync
dd if=zero.img of=loader.img bs=512 seek=1
qemu-system-i386 -fda loader.img -boot a
loader.bin : loader.o Makefile loader.lds
ld -M --oformat binary -m elf_i386 -o loader.bin loader.o -T loader.lds
loader.o : loader