前言
多阅读优秀代码,才能提高快速、深刻理解代码的能力。linux 内核源码无疑是最好的选择,不过当前 linux 内核版本为 6.3,代码量是相当庞大了,别说看完整个代码了,就算是看完一个子系统,都是不太现实的。因此,我的打算是看老版本的内核代码,再加上有《Linux0.11 内核完全注释3.0》这本书,所以,就开始看 linux-0.11 吧。
源码下载
http://www.oldlinux.org/Linux.old/Linux-0.11/sources/system/linux-0.11.tar.Z
这份源码,配合赵炯老师的内核完全注释正好。
编译
在看源码的同时,如何能够编译、运行,就再好不过了,如果还能调试,那就锦上添花了。
所以我们先尝试编译,在
ubuntu编译linux0.11
编译linux-0.11的第二种方法
两份武功秘籍的加持下,最终磕磕绊绊,我终于还是没编过。。。😂
那就转变思路,找一份能编过的,最终找到了
https://github.com/yuan-xy/Linux-0.11
编译方法参考下面这篇博客
Linux 0.11-调试 Linux 最早期的代码-36
运行
编译好后,可以使用 qemu 运行,
$ make start
调试
代码不理解的地方,可以使用 gdb 调试,比单纯看书有意思多了。
进阶
经常调试,每次手敲 gdb、打断点、看变量,还是有些呆板和琐碎的,所以我们继续借助工具,vscode 登场,
.vscode 目录下添加文件 launch.json,内容如下
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "qemu-kernel-gdb",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "127.0.0.1:1234",
"program": "/home/liyongjun/project/c/linux-0.11-source/tools/system",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": false,
"logging": {
"engineLogging": false
},
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
},
{
"description": "设置体系结构",
"text": "-gdb-set arch i386:x86-64",
"ignoreFailures": true
}
]
}
]
}
执行完 make debug
后,在 vscode 上点击调试按钮,打断点,运行,单步。
可以实时显示:寄存器数据、监视变量、调用堆栈、当前执行的代码等,非常方便。