学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《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操作系统源码调试的更多相关文章

  1. [原创]在Windows和Linux中搭建PostgreSQL源码调试环境

    张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...

  2. Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...

  3. Linux 0.11源码阅读笔记-总览

    Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...

  4. Linux 0.11源码阅读笔记-中断过程

    Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...

  5. 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码

    从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...

  6. Linux 0.11源码阅读笔记-总结

    总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...

  7. linux下使用gdb对php源码调试

    title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...

  8. 在Eclipse中进行HotSpot的源码调试--转

    原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...

  9. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

  10. Linux 0.11下信号量的实现和应用

    Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...

随机推荐

  1. #ST表,并查集#洛谷 3295 [SCOI2016]萌萌哒

    题目 分析 可以发现除了最高位只能填 1 到 9,其它位置还可以填 0. 直接用并查集找连通块会超时,如果将这些区间的合并可以下传到子区间的合并那样就可以了. 考虑ST表的逆操作,合并时直接合并两个极 ...

  2. #Splay#U137476 序列

    题目 给定长度为\(n\)的序列\(Ai\) ,我们将按照如下操作给\(Ai\) 排序, 先找到编号最小的所在位置\(x1\) ,将\([1,x1]\) 翻转, 再找到编号第二小的所在位置\(x2\) ...

  3. 深入理解HashMap和LinkedHashMap的区别

    目录 简介 LinkedHashMap详解 插入 访问 removeEldestEntry 总结 深入理解HashMap和LinkedHashMap的区别 简介 我们知道HashMap的变量顺序是不可 ...

  4. HE琥珀虚颜破解自由安装程序教程(001)

    HE琥珀虚颜破解自由安装程序教程(001) 前言 自从狗尾草跑路后,HE琥珀就没法用了,当前APP还没法破解,但是笔者找到了HE琥珀存在的一些漏洞,可以实现安装自己的APP. 所需工具 所需工具 1. ...

  5. 深入解析 C 语言中的 for 循环、break 和 continue

    C语言中的 for 循环 当您确切地知道要循环执行代码块的次数时,可以使用 for 循环而不是 while 循环 for (语句 1; 语句 2; 语句 3) {   // 要执行的代码块 } 语句 ...

  6. DevEco Studio强大的预览功能让开发效率大大提升!

    原文:https://mp.weixin.qq.com/s/C5DL0wBubDX3exvPpeXBPQ,点击链接查看更多技术内容.   应用的开发过程中,往往需要多次调试和修改,如果支持实时预览,边 ...

  7. Android 开发入门(4)

    0x06 中级控件 (1)图形绘制 a. 图形 Drawable Drawable 类型包括图片.色块.画板.背景 drawable 目录一般保存描述性 XML 文件,具有具体分辨率的 drawabl ...

  8. IIS 动态与静态压缩

    前言 我们有时候需要在页面启动的时候进行压缩代码,这时候iis已经帮助我们做好了动态压缩代码. 正文 静态压缩及动态压缩的区别 IIS7中的HTTP压缩分为"静态内容压缩"和&qu ...

  9. 说说对 Node 中的 Buffer 的理解?应用场景?

    一.是什么 在Node应用中,需要处理网络协议.操作数据库.处理图片.接收上传文件等,在网络流和文件的操作中,要处理大量二进制数据,而Buffer就是在内存中开辟一片区域(初次初始化为8KB),用来存 ...

  10. Vue 路由组件传参的 8 种方式

    我们在开发单页面应用时,有时需要进入某个路由后基于参数从服务器获取数据,那么我们首先要获取路由传递过来的参数,从而完成服务器请求,所以,我们需要了解路由传参的几种方式,以下方式同 vue-router ...