背景
今年年初(2021年我的学习计划)我就计划补一下”操作系统”这门计算机专业课.
最近我就在学一门网课,是极客时间的操作系统实战 45 讲[1],感觉还可以:代码量是1w行多点,课程我就把它当做一个45讲的代码说明文档。
网上也有一些类似的”实验教学”,比如:
-
kernel实验[2] -
linux0.11内核解读[3] -
reactos-操作系统[4]
目前我学习操作系统实战[5]有两个学习目标:
-
完全理解第十三课的代码[6]:十三课之前的内容包括了整个机器初始化过程 -
完全理解第二十六课的代码[7]:比”十三课”内容多了”进程”和”内存”
本文记录我在学习时遇到的第一个小问题:编译”第十三课的代码”时遇到一个报错
问题解决思路:
-
搞清楚”编译器”去哪里找”kernel.inc”文件
分析过程
-
最简便的方法找到”kernel.inc”文件位置
strace -f可以跟踪子进程的系统调用
[root@instance-fj5pftdp Cosmos]# strace -f make 2>/tmp/q.txt
[root@instance-fj5pftdp Cosmos]# cat /tmp/q.txt
...
[pid 20451] open("kernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] open("../includekernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] open("../include/bastypeinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] open("../include/halinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] open("../include/knlinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] open("../include/libinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] open("../include/drvinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
[pid 20451] write(2, "../hal/x86/kernel.asm:6: ", 25../hal/x86/kernel.asm:6: ) = 25可以发现
../includekernel.inc
等路径少了一个/
符号修改后,就编译成功了
总结
strace -f
真香:不需要我去研究”代码”或者”编译器”是怎么包含”kernel.inc文件”。
参考资料
操作系统实战 45 讲: https://time.geekbang.org/column/intro/100078401?tab=catalog
[2]kernel实验: https://github.com/chyyuu/os_kernel_lab
[3]linux0.11内核解读: https://github.com/sunym1993/flash-linux0.11-talk
[4]reactos-操作系统: https://reactos.org/
[5]操作系统实战: https://gitee.com/lmos/cosmos
[6]第十三课的代码: https://gitee.com/lmos/cosmos/tree/master/lesson13/Cosmos
[7]第二十六课的代码: https://gitee.com/lmos/cosmos/tree/master/lesson25~26/Cosmos
原文始发于微信公众号(leveryd):用strace定位bug