手把手教你在ubuntu16.04上调试linux0.11代码

一.前言

目前在跟着李治军老师的操作系统32讲学习操作系统原理。在完成操作系统的lab过程中常常会遇到一些奇奇怪怪的错误这样就需要打断点进行调试。但是linux0.11依赖于很多古老的编译工具链调试起来不是很友好。于是笔者发现了这样一个神奇的开源项目。可以利用现代工具链在qemu模拟器上编译并且单步调试linux0.11源码。

二.整体的思路和效果

  • 在VMARE虚拟下搭载ubuntu16.04系统
  • 下载qemu模拟器
  • 拉取改编的适配于现代工具链的linux0.11源码
  • 配置gdbinit使其具有IDE效果
  • vscode 中ssh remote到虚拟机中进行调试

三.具体步骤

3.1 VMARE下载

在这里插入图片描述

下载教程:[VMARE下载教程](https://blog.youkuaiyun.com/weixin_45912291/article/details/108 在VM894737?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166947467416800192222895%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166947467416800192222895&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-108894737-null-null.142%5Ev66%5Econtrol,201%5Ev3%5Econtrol_1,213%5Ev2%5Et3_control2&utm_term=VMARE%E4%B8%8B%E8%BD%BD&spm=1018.2226.3001.4187)
考虑到文章篇幅,这里引用了一篇详细的VMARE下载教程。

3.2 构建ubuntu16.04虚拟机

安装的操作系统镜像是ubuntu-16.04.7-desktop-amd64
官网是:https://ubuntu.com/
下载界面是:https://releases.ubuntu.com/xenial/
这个版本的直接下载地址是:https://releases.ubuntu.com/xenial/ubuntu-16.04.7-desktop-amd64.iso
这里就不在这里详细展开说了。具体看这篇博客:
https://blog.youkuaiyun.com/trackxiaoxin321/article/details/115591796?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166947509816800213074467%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166947509816800213074467&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-115591796-null-null.142v66control,201v3control_1,213v2t3_control2&utm_term=ubuntu16.04%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187

3.3 下载qemu模拟器

qemu 是模拟器,简单理解和虚拟机一样,用来当做真机启动 Linux 0.11 的。
官网是这个:https://www.qemu.org/
在刚才安装的虚拟机下直接安全qemu

sudo apt-get install qemu

下载好后,我们输入 qemu-,按两下 tab,查看下支持的体系结构。
在这里插入图片描述

看到有 qemu-system-x86_64 即可,一会我们会用这个来模拟启动 Linux 0.11。

3.4 下载并运行可调试的linux0.11源码

这一步直接下官网上的是不行的,因为那个依赖好多古老的工具链。
这里一般网上都是参考了赵炯老师为我们修改好的 Linux 0.11 源码,用现代的工具链即可构建,造福了广大热爱内核的开发者,我们直接拿来主义即可。
在赵炯老师准备好的源码的基础上,很多人又进行了二次改造,使得其可以一键 qemu 或 bochs 启动。拉取代码:

git clone  https://github.com/yuan-xy/Linux-0.11

进入Linux-0.11目录下
先make生成镜像:

zzy@zzy-virtual-machine:~/Linux-0.11$ make
make[1]: Entering directory '/home/zzy/Linux-0.11/boot'
make[1]: Leaving directory '/home/zzy/Linux-0.11/boot'
make[1]: Entering directory '/home/zzy/Linux-0.11/boot'
make[1]: Leaving directory '/home/zzy/Linux-0.11/boot'
make[1]: Entering directory '/home/zzy/Linux-0.11/boot'
make[1]: Leaving directory '/home/zzy/Linux-0.11/boot'
make[1]: Entering directory '/home/zzy/Linux-0.11/kernel'
make[1]: Leaving directory '/home/zzy/Linux-0.11/kernel'
make[1]: Entering directory '/home/zzy/Linux-0.11/mm'
make[1]: Leaving directory '/home/zzy/Linux-0.11/mm'
make[1]: Entering directory '/home/zzy/Linux-0.11/fs'
exec.c: In function ‘do_execve’:
exec.c:239:11: warning: assignment makes pointer from integer without a cast [enabled by default]
   if ((cp = strchr(buf, '\n'))) {
           ^
make[1]: Leaving directory '/home/zzy/Linux-0.11/fs'
make[1]: Entering directory '/home/zzy/Linux-0.11/kernel/blk_drv'
make[1]: Leaving directory '/home/zzy/Linux-0.11/kernel/blk_drv'
make[1]: Entering directory '/home/zzy/Linux-0.11/kernel/chr_drv'
sync
make[1]: Leaving directory '/home/zzy/Linux-0.11/kernel/chr_drv'
make[1]: Entering directory '/home/zzy/Linux-0.11/kernel/math'
make[1]: Leaving directory '/home/zzy/Linux-0.11/kernel/math'
make[1]: Entering directory '/home/zzy/Linux-0.11/lib'
make[1]: Leaving directory '/home/zzy/Linux-0.11/lib'
记录了1+0 的读入
记录了1+0 的写出
512 bytes copied, 0.000847058 s, 604 kB/s
记录了1+1 的读入
记录了1+1 的写出
618 bytes copied, 0.000709103 s, 872 kB/s
记录了253+1 的读入
记录了253+1 的写出
129729 bytes (130 kB, 127 KiB) copied, 0.00472476 s, 27.5 MB/s
记录了2+0 的读入
记录了2+0 的写出
2 bytes copied, 0.000228377 s, 8.8 kB/s

然后启动linux0.11:

make start

在这里插入图片描述

3.5 调试linux0.11源码

3.5.1 配置gdb

使gdb拥有和IDE一样的效果:

git clone https://github.com/cyrus-and/gdb-dashboard/
cp gdb-dashboard/.gdbinit ~

进入到Linux0.11目录下:

make gdb

效果如下图。
在这里插入图片描述
再开一个窗口,输入命令 gdb tools/system

然后 target remote :1234

就可以愉快地进行 gdb 调试了,最终效果如下图。
在这里插入图片描述

3.5.2 vscode调试

在本机的 windows 里安装好 vscode,下载 remote-ssh 和c/c++插件。
在这里插入图片描述
在这里插入图片描述
下载好后按下 ctrl + p,输入 >remote-ssh,找到 Connect to Host
在这里插入图片描述
按照它提示的格式输入你的虚拟机 IP 和用户名,随后输入密码,即可远程连接到虚拟机。
之后点击菜单栏 运行-启用调试,在弹出的 launch.json 中做如下配置

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/tools/system",
            "miDebuggerServerAddress": "127.0.0.1:1234",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb"
        }
    ]
}

和上一小节一样在一个窗口内 make debug
然后在vscode打断点开始调试。最后的效果是这样的。
在这里插入图片描述

带中文注释可成功编译运行的Linux0.11+Bochs2.62实验环境说明 此注释以网上获得的“linux带中文注释的0.11版本”为基础,对照赵炯博士《Linux内核完全注释(0.11) 》V3.0版(http://oldlinux.org/download/clk011c-3.0.pdf)编辑而成。作为对赵博士感谢,以及对Linux初学者的回馈,特发布在优快云上。 此注释可以在http://oldlinux.org/Linux.old/bochs/提供的Linux-0.11-devel-XXXXXX实验环境下正确编译成功,使用:"make disk"命令重启Bochs虚拟机后,新编译源码直接生效,便于学习者直接阅读源码,直接进行实验。 注意事项: 1、为了使注释版与实验环境上的Linux0.11内核保持一致,达到对应文件可以互换的目的,与Linux0.11原始版本相比,加入了15个系统调用函数(参见include/Linux/sys.h第78-92行。赵博士原书没有这部分注释,我不敢班门弄斧),其它相关的文件加入了相应的定义。新加入的代码只有函数体定义,没有具体实现,对其它原始代码没有改变、没有影响。 2、键盘定义改成了美式键盘(原始代码中是芬兰键盘,会导致个别键出问题,调试的时候我曾被迷糊了好久,以为自己把程序搞乱了)。 3、把网上VC版的注释统一改成了 “/* */” 格式的注释。经测试,在Linux0.11实验环境中(gcc1.40),只有标准C注释语法可以正常编译。 4、由于《Linux内核完全注释(0.11) 》原书版本更新的原因,注释中提到的图、表可能与V3.0版书中不一致。 5、由于代码中加入注释,代码行号发生变化,注释中提到的代码行号会出现不一致,建议对照3.0版查询对应内容。 6、实验方法:请先安装附带的Bochs2.62版安装包,双击Test.bxrc即可启动实验系统,执行命令:sh t,即可完成对linuxcn的编译。 7、linux目录中是此实验系统中/usr/src/linux提取出来的不含中文注释的linux0.11源码(此版本比原始的0.11版多15个系统调用函数),linuxcn是加入了中文注释的源码。 8、diskb.img是实验系统与Windows环境下进行文件交换的1.44M软盘映像,执行脚本命令"sh t"时会自动从此映像中读取linux.tar、linuxcn.tar包,解包并编译,编译结果在:/usr/root/zw/linuxcn目录下。为了方便文件交换,建议使用7zip为压缩/解压缩工具(7zip可以直接生成tar包),用WinImage实现Windows环境与软件映像交换文件。 9、实验系统下 .profile中加入了几个命令,请读者注意。 10、若实验环境的启动盘被破坏,请用压缩包中的bootimage-0.11-hd覆盖对应文件即可。 11、若实验环境的要命文件系统被破坏,请用压缩包中的hdc-0.11-new.img覆盖对应文件即可。 2014-5-4 cyfx2288
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪中奇侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值