2020更新:解决所有编译警告。
在《Linux内核完全注释》
一书中配置的环境只在 CentOS 7 上使用 gcc-3.x 编译成功并且运行,但书中对源码和 Makefile 的修改并不能用在 gcc-4.x 以上的版本。
主要可能会出现以下问题:
- 大块数据拷贝方向位不正确。
- string.h中字符串操作导致数据和指针出现奇怪改变。
- 启用-On优化后出现问题(比如-O2优化会去优化链接顺序导致入口函数不正确)。
- get_fs_long()不能正确获取用户区数据。
以上问题任意一个都会导致无法成功运行 linux-0.11 到 bash 命令行中。
这是一个经过修改带 linux-0.11 内核注释可编译,可运行的 linux-0.11 github仓库,并且对以上问题进行了修复。在实际调试时可使用 GDB 进行源码级别调试,在 Linux 平台也可以使用 Bochs 进行汇编调试。
linux-0.11 内核可在 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