gcc
gdb
makefile
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
交叉编译器—— i386-elf-gcc
你不可能在一台“裸机”上进行开发,所以你需要在自己的机器(host)上写你的操作系统,然后让编译器将源代码编译成目标机器(guest)上运行的代码。这样的“跨平台”编译则需要交叉编译器(Cross Compiler)的支持,GCC就是一个非常好的交叉编译器!
选定了GCC之后,我们还需要选择具体GCC的目标架构!例如如果我们希望我们地操作系统运行在ARM CPU上和运行在Intel 386架构上的GCC版本是不一样的(因为CPU所支持的指令集不一样)。
我们这里就选用比较常用的架构── i386,具体需要的编译器有:
-
i386-elf-ld: GNU i386-ELF连接器,将多个目标文件链接成一个二进制文件用。
-
nasm (Netwide Assmebler, 汇编编译器): 在写操作系统的时候,有些代码是无法用C来完成地,这时候我们就需要用到汇编。
-
i386-elf-gcc (里面包括 i386-elf-binutils): GCC 交叉编译器,如果你想用C来写操作系统的话就需要这个。
-
可选:i386-elf-gdb : 可以不装GDB,bochs虚拟机里自带了汇编级别的调试器。
其中 ELF 是 Excutable and Linkable Format 的意思,即我们编译出来的多个目标文件是可以被连接器LD链接在一起成为一个二进制文件的。
在Mac下,这些可以通过MacPorts直接安装,linux下也可以通过apt-get等来安装。
虚拟机——Qemu
还有一个比较适合开发操作系统的虚拟机是:Qemu ! 它可以支持 GDB stub:通过 socket 将虚拟机里的内核二进制程序和本机里的symbol file联系起来进行调试,下载地址是:[a]http://www.qemu.org[/a] ,Mac下的用户可以直接在 [a]http://www.kju-app.org/[/a] 下载到Q的dmg文件。
在我们的Makefile中,CFLAGS里一定要加上:” -nostdlib -nostartfiles -nodefaultlibs
“,也就是gcc在编译的时候不增加任何标准库和其他额外信息,因为我们要写的是操作系统,所有这些标准库都应该是我们提供的,我们的新操作系统里没有自带这些东西,一切从零做起!
教程
$(V)$(QEMU) -parallel stdio -hda $< -serial null
使用 dev 设备的命令如:
`-serial dev'
重定向虚拟串口到主机设备 dev 中。
`-parallel dev'
重定向虚拟并口到主机设备 dev 中。
`-monitor dev'
`-s'
等待 gdb 连接到端口 1234。
`-p port'
改变 gdb 连接端口到 port。
`-S'
在启动时不启动 CPU, 需要在 monitor 中输入 'c',才能让qemu继续模拟工作。
-parallel stdio
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
-hda $<
-serial null