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函数的代码实现 信号量的完整代码 实 ...
随机推荐
- Scala变量和常量的声明
标示符的命名规则 1. 字母或下划线开头 2. 以操作符开头,且只包含操作符(+ - * / # !等) 3. 用反引号`....`包括的任意字符串,即使是 Scala 关键字(39 个)也可以• p ...
- Luna likes Love 题解
Problem Link 简要题意 题目很清楚. 分析 定理 两个人中左边的人一直向右运动,和两人向中间走所用的 步数相同 证明 假设有两组人为 \(a_l , a_r , b_l , b_r (a_ ...
- ET介绍——强大的MongoBson库
强大的MongoBson库 后端开发,统计了一下大概有这些场景需要用到序列化: 对象通过序列化反序列化clone 服务端数据库存储数据,二进制 分布式服务端,多进程间的消息,二进制 后端日志,文本格式 ...
- #树形依赖背包,点分治#BZOJ 4182 Shopping
题目 给定一棵大小为 \(n\) 的树,每个点代表一种物品,其具有体积.价值和数量的属性, 现在选择一个连通块,使得里面所有点都被选中且体积不超过 \(m\),问最大价值. \(n\leq 500,m ...
- 基于OpenHarmony的智能指南针
电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分.为什么电子指南针能指示方向?本 Demo 将为你呈现,其中蕴含了人类智慧及大自然 ...
- C++ While 和 For 循环:流程控制全解析
C++ Switch 语句 使用 switch 语句选择要执行的多个代码块之一. 语法 switch(expression) { case x: // 代码块 break; case y: // 代码 ...
- c# 托管和非托管资源-详解
前言 引用:带你复习c# 托管和非托管资源_C#教程_脚本之家 (jb51.net) c# 托管和非托管比较重要,因为这涉及到资源的释放. 现在只要在计算机上运行的,无论玩出什么花来,整个什么概念,逃 ...
- 算法小白刷了一周 LeetCode 后的思考
Hi,我是 itchao 我自己工作有 2 两年多的前端开发经验,但是数据结构与算法一直不好,基本就是一个算法小白的水平. 听说大公司面试都要手写算法题,最近为了以后能去更好的公司,然后其实心里比较着 ...
- HarmonyOS NEXT调优工具Smart Perf Host高效使用指南
在软件开发的过程中,很多开发者都经常会遇到一些性能问题,比如应用启动慢.点击滑动卡顿.应用后台被杀等,想要解决这些问题势必需要收集大量系统数据.而在收集数据的过程中,开发者则需要在各种工具和命令之 ...
- B端架构升级之路
一.背景 随着B端业务快速发展,系统愈趋复杂.我们发起了B端架构升级专项,基于B端业务的特点,从研发规范建设.B端架构基建.系统架构升级和落地保障等多方面提升了B端的架构水平. 二.升级思路 架构是一 ...