linux-0.11在gcc-4.3.0版本以上的编译和调试
在《Linux内核完全注释》一书中配置的环境只在CentOS 7上使用gcc-3.x编译成功并且运行,但书中对源码和Makefile的修改并不能用在gcc-4.x以上的版本。主要可能会出现:
1. 大块数据拷贝方向位不正确。
2. string.h中字符串操作导致数据和指针出现奇怪改变。
3. 启用-On优化后出现问题(比如-O2优化会去优化链接顺序导致入口函数不正确)。
4. get_fs_long()不能正确获取用户区数据
以上问题任意一个都会导致无法成功运行bash。
这是我的github仓库,对以上问题进行了一些修改。在时间调试时可是用GDB进行源码级别调试,在Linux平台也可以使用Bochs进行汇编调试。
内核可在windows和linux上运行。具体步骤可见根目录的Makefile。根目录包含了System.map System.lst System.syms 可随时定位变量和函数位置以及函数对应的汇编代码。
项目中以自带Bochs-2.6.9源码,通过Makefile可直接编译安装。如果想使用Bochs自带的汇编调试则使用make bochs-build-debug
如果想使用gdb进行源码级别调试则使用
make bochs-build-gdb
安装过程可能会提示ERROR: X windows gui was selected, but X windows libraries were not found. 则还需要安装X11 库 使用 sudo apt-get install libx11-dev xserver-xorg-dev xorg-dev
或者直接在Makefile中bochs-build-xxx的命令./configure 后面添加 –with-nogui
安装bochs之后直接make编译源码。或之直接使用make disk将生成的Image拷贝至tools/a.img软盘中。tools/c.img是含有Old Minx文件系统的硬盘,可直接被引导使用。
编译后会在根目录下生成如下文件Image为含有引导程序的完成映像文件。
system.map为elf格式的含有所有信息的符号表。
system.elf为elf32格式的可执行文件,也是gdb调试使用的调试文件。
system.bin为除去elf格式头,gdb调试信息,符号表,重定位信息等的二进制文件。
使用make info
还会生成system.list 和 system.syms 两个文件。list是包含对应的汇编代码。syms为只包含system的符号地址信息。
最后使用make bochs-run
或者make bochs-gdb
就可直接运行linux-0.11。
其中只用gdb时,需要另开一个终端。进行端口连接。跳转至tools/目录下,执行
gdb -tui system
在gdb命令行中输入target remote localhost:1234
进行连接 之后就可以使用gdb命令调试了。
如果输入layout split还可以进行源码和汇编同时调试。
最后附上完整运行图,当然已经包含了可执行gcc和glibc库。如果有任何问题。可直接在我的git上#issue