Linux-0.11操作系统源码调试
学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《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 保存,重新执行调试命令即可。
Linux-0.11操作系统源码调试的更多相关文章
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
- Linux 0.11源码阅读笔记-文件管理
Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...
- Linux 0.11源码阅读笔记-总览
Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...
- Linux 0.11源码阅读笔记-中断过程
Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...
- 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码
从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...
- Linux 0.11源码阅读笔记-总结
总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...
- linux下使用gdb对php源码调试
title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...
- 在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...
- Android FrameWork 学习之Android 系统源码调试
这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...
- Linux 0.11下信号量的实现和应用
Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...
随机推荐
- vim-plus install
1.输入:git clone https://github.com/chxuan/vimplus.git ~/.vimplus 2.输入:cd ~/.vimplus 3.输入:./install.sh ...
- Linux下Bochs,NASM安装和使用
安装环境 以Ubuntu为例,先更新一下: sudo apt-get update sudo apt-get upgrade 然后安装Bochs环境: sudo apt-get install bui ...
- [UAC]C++判断某进程是否有管理员权限
BOOL IsAdminProcess(UINT PID) { if (PID <= 0) PID = GetCurrentProcessId(); HANDLE hProcess = Open ...
- K8s技术全景:架构、应用与优化
本文深入探讨了Kubernetes(K8s)的关键方面,包括其架构.容器编排.网络与存储管理.安全与合规.高可用性.灾难恢复以及监控与日志系统. 关注[TechLeadCloud],分享互联网架构.云 ...
- 用户触达难?流失率高?HMS Core预测服务和智能运营,助你提前掌握营销时机,解决此难题。
用户流失了,触达难? 活动做了那么多,转化仍然很低? 运营也需要提前思考,预测用户动向,提前精准触达,才能事半功倍.结合HMS Core分析服务的预测服务和智能运营,洞察营销时机,实时落地营销策略,提 ...
- QImage 与 Mat 互转
QImage 转 Mat Mat QImage2Mat(QImage &img) { cv::Mat mat; switch (img.format()) { case QImage::For ...
- 设置 BCompare 打开文件时的默认字符编码
每次比对 .h .cpp 文件,BCompare总是默认以西欧字符编码打开文件,导致中文都变成乱码了,还需要手动的修改文件字符编码,这样才能正常的显示.非常的不方便 然后我们就需要设置默认的字符编码, ...
- Python查询上周五是多少号
使用Python可以轻松的查询出上周几是多少号,这周几是什么多少号,以下是查询上周五的示例: import datetime, calendar last = datetime.date.today( ...
- 关于openGauss中的虚拟索引
关于 openGauss 中的虚拟索引 作为曾经的 Oracle 资深使用者,对于 Oracle 11gR2 版本推出的 invisible Index 感觉一直很良好:因为这对于大部分情况下做优化是 ...
- Unity 音频资源优化
1.声道设置 (1).不设置 单声道 音频大小为下图 (2).设置单声道 音频大小为下图 2.加载类型 (1).Decompress On Load 使用内存8.1M (2).Compressed I ...