当前位置: 首页 > news >正文

头歌操作系统2.2第一关

rm -rf cur

我注意到你之前查看的步骤指南有些问题,下面我根据这个实验任务的要求,为你提供修正后的完整操作步骤和答案。

---

## 第一步:环境准备

### 1.1 解压版本 1.1 内核

```bash
# 将内核文件复制到 ~/os/ 目录
cp /data/workspace/myshixun/exp1/1.1.tgz ~/os/

# 切换到实验目录并解压
cd ~/os/linux-0.11-lab
tar -zxvf ../1.1.tgz

# 调整 cur 符号链接指向版本 1.1
rm -rf cur
ln -s 1.1 cur
```

### 1.2 编译内核

```bash
cd 1.1/linux
make
cd ../..
```

---

## 第二步:启动 GDB 调试

打开**两个终端**,分别执行以下操作:

**终端 A(启动 Bochs 虚拟机并等待 GDB 连接):**

```bash
cd ~/os/linux-0.11-lab
./rungdb
```

**终端 B(启动 GDB 并连接远程目标):**

```bash
cd ~/os/linux-0.11-lab
./mygdb
```

---

## 第三步:获取调试数据

以下操作均在**终端 B(GDB 端)** 进行。

### 3.1 在 main.c 第 147 行设置断点并运行

```bash
(gdb) b main.c:147
(gdb) c
```

### 3.2 查看 idiv 指令的地址

```bash
(gdb) x/6i $eip
```

输出类似如下内容:

```
=> 0x6903 <main+348>: mov 0x227e0,%eax
0x6908 <main+353>: mov $0x0,%ecx
0x690d <main+358>: cltd
0x690e <main+359>: idiv %ecx
0x6910 <main+361>: mov %eax,0x227e0
0x6915 <main+366>: mov $0x2,%eax
```

其中 `idiv %ecx` 对应的地址就是问题 1 的答案。以上述输出为例,**idiv 指令地址 = 0x690e**(实际值请以你的调试输出为准)。

### 3.3 查看 idiv 指令执行前的寄存器状态(问题 2)

```bash
(gdb) info registers
```

记录 **CS** 和 **EIP** 的值(当前指令位置),以及 **SS** 和 **ESP** 的值(当前栈位置)。例如:

- CS:EIP = `0xf:0x690e`
- SS:ESP = `0x17:0x2573c`

> **注意**:以上值为示例,请以你的实际调试输出为准。

### 3.4 单步执行 idiv 指令

```bash
(gdb) si
```

### 3.5 查看 idiv 指令执行后的寄存器状态(问题 3 前半部分)

```bash
(gdb) info registers
```

再次记录 **CS** 和 **EIP** 的值(新的指令位置,应已跳转至异常处理程序),以及 **SS** 和 **ESP** 的值(新的栈位置,应已切换至内核栈)。例如:

- 新 CS:EIP = `0x8:0x7964`
- 新 SS:ESP = `0x10:0x1fa0c`

### 3.6 查看栈顶状态,提取恢复点和用户栈位置(问题 3 后半部分)

```bash
(gdb) x/5wx $esp
```

该命令以十六进制显示栈顶 5 个 32 位字,输出类似如下内容:

```
0x1fa0c: 0x00006910 0x0000000f 0x00000246 0x0002573c 0x00000017
```

根据 x86 异常处理机制,当发生特权级切换时,CPU 向内核栈依次压入:
- **EIP**(恢复点位置的低 32 位,第一个值)
- **CS**(恢复点位置的高 16 位,第二个值的低 16 位)
- **EFLAGS**(第三个值)
- **ESP**(用户栈位置的低 32 位,第四个值)
- **SS**(用户栈位置的高 16 位,第五个值的低 16 位)

因此:

- **恢复点位置** = 第二个值的低 16 位 : 第一个值 = `0xf:0x6910`(注意:恢复点通常是 idiv 的**下一条指令地址**,即 `0x6910`)
- **用户栈位置** = 第五个值的低 16 位 : 第四个值 = `0x17:0x2573c`

> **注意**:以上值为示例,请以你的实际调试输出为准。`x/5wx $esp` 命令的输出顺序可能与上述不同,但**恢复点位置通常是 idiv 指令的下一条指令地址**,用户栈位置应与 idiv 执行前的 SS:ESP 一致。

---

## 第四步:填写答案文件

将以上获得的实际值填写到 `/data/workspace/myshixun/第一关.txt` 文件中,格式如下:

```
1. idiv 指令地址:0x690e
2. idiv 执行前指令位置(CS:EIP):0xf:0x690e,栈位置(SS:ESP):0x17:0x2573c
3. idiv 执行后指令位置(CS:EIP):0x8:0x7964,栈位置(SS:ESP):0x10:0x1fa0c;恢复点位置:0xf:0x6910,用户栈位置:0x17:0x2573c
```

> **重要提示**:以上值仅为示例!请务必将你自己的实际调试输出值填入文件,否则评测会失败。

---

## 常见问题与解决方案

### Q1:GDB 连接失败?
- 检查终端 A 是否已成功启动 Bochs 并显示 `waiting for connection on port 1234`
- 检查终端 B 是否在正确的目录下执行 `./mygdb`

### Q2:找不到 main.c:147 行?
- 确保已正确编译并链接了版本 1.1 的内核
- 使用 `(gdb) list main` 查看 main 函数的源码,确认 `jiffies = jiffies/0;` 的实际行号

### Q3:x/5wx $esp 输出看不懂?
- x86 栈是从高地址向低地址增长的,`$esp` 指向当前栈顶
- 栈中内容从低地址到高地址依次是:EIP、CS、EFLAGS、ESP、SS
- 栈的详细结构示意图如下:

```
高地址方向
+-----------------+
| SS | ← 用户栈段选择子(高16位有效)
+-----------------+
| ESP | ← 用户栈指针(32位)
+-----------------+
| EFLAGS | ← 标志寄存器(32位)
+-----------------+
| CS | ← 用户代码段选择子(高16位有效)
+-----------------+
| EIP | ← 恢复点地址(32位)
+-----------------+ ← $esp(当前栈顶)
低地址方向
```

> **注意**:由于栈向低地址增长,`$esp` 指向最后压入的 EIP 值,而非 SS。因此 `x/5wx $esp` 显示的第一个值对应 EIP,第二个值对应 CS,以此类推。

---

### 示例答案(仅供参考格式)

以下是一个完整的示例答案(基于某次实际调试):

```
1. idiv 指令地址:0x690e
2. idiv 执行前指令位置(CS:EIP):0xf:0x690e,栈位置(SS:ESP):0x17:0x2573c
3. idiv 执行后指令位置(CS:EIP):0x8:0x7964,栈位置(SS:ESP):0x10:0x1fa0c;恢复点位置:0xf:0x6910,用户栈位置:0x17:0x2573c
```

---

不行就再来一遍确保si ,si,si,指向0x690e!!!!!!

http://www.jsqmd.com/news/687425/

相关文章:

  • 告别AT指令轮询!用状态机+事件驱动重构你的STM32 EC200N-CN 4G通信程序
  • Cursor AI破解工具终极指南:免费解锁Pro功能的完整解决方案
  • 终极指南:使用v-scale-screen快速构建专业级Vue数据大屏
  • CyberpunkSaveEditor:逆向工程驱动的《赛博朋克2077》存档深度编辑方案
  • Docker Registry安全加固实战:27种攻击场景下的镜像签名、TLS、OIDC集成全解析
  • 别再为STM32的定时器不够用发愁了!用IIC协议驱动PCA9685模块,轻松扩展16路舵机控制
  • 10 个顶级 Claude Code Skills,装上就删不掉!附真实使用场景和效果对比
  • 基于vue的电子期刊投稿系统[vue]-计算机毕业设计源码+LW文档
  • 2026年会计学论文降AI工具推荐:财务分析和审计研究部分降AI指南 - 还在做实验的师兄
  • 从风扇异响到硬盘损坏:聊聊日常设备里的‘动压油膜’与润滑失效那些事儿
  • 从零开始:手把手教你用STM32CubeMX配置第一个Cortex-M3工程(基于STM32F103)
  • 瑞数 6 双阶段 Cookie 逆向复盘:从 412 到 200 的一次纯 Python 还原经验总结
  • 3分钟掌握d2s-editor:暗黑破坏神2存档修改的终极免费指南
  • 如何免费将OneNote笔记转换为Markdown?这款神器让迁移效率提升10倍 [特殊字符]
  • 告别付费!手把手教你配置Fiddler Everywhere抓取HTTPS请求(Mac/Win/Linux通用)
  • Linux系统密码死活改不了?别急着重装,先检查这两个文件的‘i’属性(附详细排查流程)
  • FPGA/ASIC设计中的复位信号处理:为什么你的异步复位总出问题?
  • 从手机拍照到NeRF建模:相机标定参数(内参/外参)到底在忙活啥?
  • NFS配置方法
  • 深度剖析雪花算法:原理拆解\+分布式ID与分布式锁彻底分清
  • 快狐KIHU|43寸壁挂触摸一体机Windows系统多串口接口培训机构查询屏
  • 用CH341玩转I2C:从读写EEPROM到自定义设备通信的完整项目流程
  • OpenCV C++编译踩坑记:手把手教你搞定‘undefined reference to cv::imread’这个磨人的小妖精
  • 保姆级教程:在RK3588开发板上配置USB-C PD充电(基于HUSB311芯片与DTS详解)
  • Kubernetes 集群服务发现机制详解
  • 分析全国好用的注塑托盘厂家,江苏凯儒物流靠谱吗? - mypinpai
  • Anthropic 测试移除 Claude Code,AI 编程代理或转向新收费模式
  • 程序员的第一份专利:我是如何把Linux进程调度算法‘抄’进交通信号灯的
  • 3个关键技巧:快速掌握Windows网络性能测试工具
  • Tools for Humanity 宣布与布鲁诺·马尔斯巡演合作遭否认,Concert Kit 将改在杰瑞德·莱托乐队巡演推出