首页 > 系统相关 >Linux-0.11操作系统源码调试

Linux-0.11操作系统源码调试

时间:2022-11-12 15:57:53浏览次数:68  
标签:操作系统 编译 源码 0.11 Linux 调试

学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《Orange's:一个操作系统的实现》等书就是教学这个的;另一种方式就是调试操作系统源码,相比第一种方式,调试源码可以更能感受真实操作系统的实现机制。

Linux-0.11 是 Linux 最早期的代码,它包含现代操作系统的所有雏形,代码体量也不大,非常适合对操作系统进行源码学习。下面记录在 Ubuntu22 上面编译调试源码的流程。

安装 QEMU

QEMU 是一款模拟器,它可以模拟 i386、x86_x64、ARM 等多种 CPU 架构,编译好的 Linux-0.11 代码就会跑在这个模拟器上。QEMU 的官网: https://www.qemu.org 。

在 Ubuntu20 以后安装 QEMU 的指令如下:

sudo apt-get install qemu
sudo apt-get install qemu-system

下载安装好之后,在控制台输入 qemu-,按 Tab 键两次,就会显示所有支持的 CPU 架构:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

编译 Linux-0.11 源码

由于 Linux-0.11 代码比较古老,直接从官网下载自己编译需要处理很多问题,好在前人已经帮我们做好了(感谢这些前辈),我们只需要到下面 github 地址上下载源码编译,就可以直接在 QEMU 上启动了。github 地址:

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

下载好源码之后,进入根目录,直接运行下面的命令:

make start

就可以编译运行 Linux-0.11 操作系统了。运行效果如下面所示:

 

 如果想 debug 源码,就直接运行下面的命令启动操作系统:

make debug

这时会弹出下面的窗口,整个系统处于 Paused 状态:

 

 此时整个系统处于可以被调试的状态。开启一个新的控制台窗口,输入下面的命令:

gdb tools/system
target remote:1234

就可以愉快的调试操作系统源码了。

 

 比如我们想调试操作系统的 main 函数,就继续输入下面两行命令:

b main
c

 

 此时 gdb 已经断在了操作系统的 main 函数上。

在使用 gdb 进行调试时需要注意,如果不修改 Linux-0.11 源码里面的 Makefile 文件,直接运行下面代码:

gdb tools/system
target remote:1234

会报 ‘g' packet reply is too long 的错误,此时没法进行调试。

 

 报错的原因上面第一个红箭头处已经提示了,Linux-0.11 编译后的二进制需要运行在 i386 架构上,但是现在确运行在了 x86_x64 架构上。

从 Linux-0.11 的 make 文件(Makefile.header)可以看到,Linux-0.11 被编译链接成32bit的程序:

 

 上面的 CFLAGS 中的 -m32 以及 LDFLAGS 中的 -m elf_i386 就是编译链接成32位程序的指令。Linux-0.11 最终的编译产物位于 tools/system,通过在控制台使用 file 命令同样也可以看到:

 

 要解决这个问题,只要找到 Linux-0.11 的 Makefile 文件(该文件包含 Makefile.header 文件),找到下面的命令:

 

 将箭头处原本是 x86_64 替换成 i386 保存,重新执行调试命令即可。

标签:操作系统,编译,源码,0.11,Linux,调试
From: https://www.cnblogs.com/chaoguo1234/p/16883932.html

相关文章

  • linux 添加 jdk 环境变量
    编辑vi/etc/proffile文件末尾追加保存后需要刷新资源source/etc/profile 输入java验证即可......
  • macOS 和 Linux 有什么区别?
    我们经常对比Linux和Windows,那macOS和Linux有什么区别呢?Linux和Windows的差异很明显,但Linux和macOS在很多人看起来却很相似。二者都可以在命令行中运行Un......
  • linux配置固定(静态)IP地址
    第1步:cd /etc/network第2步:sudo vi interfaces第3步:按照下图进行修改,修改完成后切换回命令状态(esc键)输入:wq!离开即可    ......
  • [ Linux ] 重定向的再理解,以及文件系统的理解、inode和软硬链接
    在上篇文章我们了解了Linux中文件描述符和重定向以及缓冲区的理解,本篇文章我们要对了解一下重定向的再理解、文件系统以及引出inode的意义和软硬链接。0.重定向在之前我们实......
  • linux 基础补充
    Linuxfind命令-通配符语法:find起始路径-name“被查找文件名”被查找文件名,支持使用通配符*来做模糊查询。符号*表示通配符,即匹配任意内容(包含空),示例:test*,表示匹......
  • Windows Docker安装和卸载(包括linux内核)
    WindowsServer安装DockerPowerShell命令(管理员)WindowsServer安装Docker(windows内核)Install-Module-NameDockerMsftProvider-RepositoryPSGallery-Force ......
  • Unix/Linux系统编程第十三章学习笔记
    第十三章TCP/IP和网络13.2TCP协议TCP/IP(Comer1988,2001;RFC11801991)是互联网的基础。TCP代表传输控制协议。IP代表互联网协议。目前有两个版本的IP,即IPv4和IPv6。IPv4使......
  • WINDOWS下从源码编译Carla0.9.13+UE4.26
    CARLA是一个开源的自动驾驶模拟器,基于UE4。本篇文章讲述如何在windows系统上从源码编译Carla0.9.13+UE4.26。参考官方文档:https://carla.readthedocs.io/en/0.9.13/build_......
  • linux多命令的顺序执行
    当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果。(1);分号,没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成......
  • 关于Redhat-Linux中-compat-sap-c++软件包的说明
    本文OS版本:RedHatEnterpriseLinuxrelease8.6(Ootpa)还是先说一下compat-sap-c++软件包的作用:InordertorunSAPapplicationscompiledwithcertainnewerGCC......