WINDOWS下的gdt和ldt http://www.vkfz.com/WINDOWS-gdt-ldt-t709032.htm

本文探讨了Windows操作系统中Intel Protection Mode的工作原理,重点分析了全局描述符表(GDT)与局部描述符表(LDT)的作用及使用情况。文中详细解释了Windows为何实际上并不依赖LDT,并澄清了分段机制在现代操作系统的实际角色。
是这样的,我想问下Windows 在Intel Protection Mode下工作的问题。
在指令手册第三卷system programming 可以看到,通常GDT只有一个,而LDT可以有很多的。
本来我很天真地想:
那么我又多少个进程在running 就应该有多少个LDT才对。
于是我打开softice, 输入GDT
结构只有一个被标为LDT,参考了using softice,只看到如下一段:
Under Winnt , LDT are per process data structures and are only used for virtual dos machines.
The 16 bit WOW box is executed within a NTVDM process and has an LDT.
Like Windows 3.1 the LDT for a WOW contains the selectors for every 16 bit proteced mode code and data segment for each 16 bit application or DLL that is loaded. It also contains the selectors for each task database, module database, local heaps, global allocation, and all USER and GDI objects that require the creation of a selector. Under a WOW, because the number of selectors needed can be quite large, a full LDT is created with a majority of the entries initially reserved. These reserved selectors are allocated as needed. Under a non-WOW VDM, the size of the LDT is significant smaller.

老实说我不知道它在说什么,最后的结果就是我只能看到一个LDT.
这实在太奇怪了,请问难道windows不用LDT?

第二个奇怪的是
GDTbase=80036000 Limit=03FF
0008 Code32 Base=00000000 Lim=FFFFFFFF DPL=0 P R
0010 Data32 Base=00000000 Lim=FFFFFFFF DPL=0 P R
001B Code32 Base=00000000 Lim=FFFFFFFF DPL=3 P R
0023 Data32 Base=00000000 Lim=FFFFFFFF DPL=3 P R
0028 TSS32 Base=8000B000 Lim=000020AB DPL=0 P B
0030 Data32 Base=FFDFF000 Lim=00001FFF DPL=0 P R
003B Data32 Base=7FFDE000 Lim=00000FFF DPL=3 P R
0043 Data16 Base=00000400 Lim=0000FFFF DPL=3 P R
0048 LDT Base=E156C000 Lim=0000FFEF DPL=0 P

显然code32 data32也就是从0008-001b
这段是固定的,所谓的flat mode,可是真的不明白,
明明规定4g地址只有低2g空间是用户可以访问的。
高2G操作系统用,也就是ring0才能访问。
那么这里有两个Code32,一个是ring3(0008),一个是ring0(001B)
那么同一句汇编指令,访问32位偏移0xYYYYYYYY地址,
操作系统怎么知道是访问上面那个还是下面那个,
有两个段,这两个段根本都覆盖了4g空间,却具有不同的权限,dpl 不同,
同一个地址到底要怎么解释呢?

晕眩。

Alecksun 发表于 2007-4-14 15:44:53

Windows 的分段是个摆设,你当它不存在好了,真正的保护是在分页上处理的,低2G页表的特权级是用户的,高2G页表的特权级是系统的。至于分段,你说对了,就是给分页提供一个平坦的4G空间。同时段选择子表明了当前的特权级。

至于LDT,windows还真不用,为什么一定要用呢?一般的PC操作系统都不用,Linux也不用
 
<think> 我们正在讨论的是哈工大操作系统实验环境中的 `./dbg-asm` 命令。根据引用[1],该命令是在编译好 Linux 0.11 后使用的,用于启动调试器。运行后,会打开两个窗口:Bochs窗口(黑屏状态)命令行窗口。注意不要最小化或最大化窗口,以免影响调试。 功能: `./dbg-asm` 是一个调试脚本,用于启动 Bochs 模拟器并加载 Linux 0.11 内核,同时进入汇编级调试模式。它允许开发者单步执行指令、查看寄存器内存状态等,是操作系统内核调试的重要工具。 使用方法: 1. 确保已经正确编译了 Linux 0.11 内核(在 `~/oslab/linux-0.11` 目录下执行 `make` 编译)。 2. 进入 `~/oslab` 目录: ```bash cd ~/oslab ``` 3. 运行调试脚本: ```bash ./dbg-asm ``` 4. 此时会出现两个窗口: - Bochs 窗口:显示模拟的机器屏幕(初始为黑屏) - 命令行窗口:用于输入调试命令 5. 在命令行窗口中,可以使用 Bochs 调试命令,例如: - `c`:继续执行(遇到断点会停下) - `s`:单步执行(step into) - `r`:显示寄存器状态 - `xp /nuf <addr>`:查看物理内存,如 `xp /8wx 0x00000000` 查看物理地址0开始的8个字(32位) - `b <addr>`:设置断点,如 `b 0x7c00` 在引导扇区代码处设置断点 - `info b`:查看断点列表 - `d n`:删除第n个断点 常见问题及解决方法: 1. **Bochs窗口不显示或无法操作**: - 确保没有最小化或最大化窗口,保持正常尺寸。 - 如果使用远程连接(如SSH),确保启用了X11转发(使用`ssh -X`或`ssh -Y`连接)[^1]。 2. **调试命令无法输入**: - 检查命令行窗口是否被其他窗口遮挡。 - 如果是在实验楼环境中,注意不要关闭任何窗口。 3. **无法单步调试或断点不生效**: - 确保在运行`./dbg-asm`前已经正确编译了内核(在`linux-0.11`目录下执行`make`成功)。 - 检查断点地址是否有效,例如引导扇区起始地址为`0x7c00`。 4. **查看内存寄存器的使用示例**: 根据引用[2][5],我们可以查看LDT表的内容: ```bash <bochs:1> xp /8w 0x00faa2d0 # 查看物理地址0x00faa2d0处的8个字(32位) ``` 输出类似: ``` [bochs]: 0x00faa2d0 <bogus+ 0>: 0x00000000 0x00000000 0x00000002 0x10c0fa00 0x00faa2e0 <bogus+16>: 0x00003fff 0x10c0f300 0x00000000 0x00fab000 ``` 这里展示了LDT表项的内容,每个表项8字节(64位),其中包含段基址、段限长等信息。 5. **调试完成后如何退出**: - 在命令行窗口中输入`q`退出Bochs模拟器。 - 或者按Ctrl+C强制终止。 6. **其他调试资源**: 引用[4]提到使用gdb调试core文件的方法,但在`./dbg-asm`中我们使用的是Bochs内置调试器。如果遇到内核崩溃,也可以尝试生成core文件并用gdb分析[^4]。 注意:`./dbg-asm` 是专门为哈工大操作系统实验配置的调试脚本,其内部调用了Bochs模拟器并加载了特定的配置文件(如`bochsrc.bxrc`),因此无需手动配置Bochs。 实验建议: - 在调试前,建议先阅读Linux 0.11内核的启动代码(如`boot/bootsect.s``boot/setup.s`),了解其汇编级执行流程。 - 结合源码设置断点,例如在`bootsect.s`的`start`标签处(地址0x7c00)设置断点,观察引导过程。 以上信息基于引用内容及实验环境常见设置整理而成。 </think>### `./dbg-asm` 命令详解 `./dbg-asm` 是哈工大操作系统实验环境中的关键调试命令,用于启动 Bochs 模拟器的汇编级调试模式。以下是全面解析: --- #### **功能与作用** 1. **启动调试环境** - 启动 Bochs 模拟器并加载编译好的 Linux 0.11 内核 - 进入汇编级调试模式(可直接查看/修改寄存器、内存等底层状态) - 生成两个窗口: - **Bochs窗口**:黑屏状态,显示模拟的物理机器界面 - **命令行终端**:用于输入调试命令[^1] 2. **调试能力** - 单步执行汇编指令 - 查看/修改内存内容(如 `xp` 命令查看物理内存) - 检查段描述符表(GDT/LDT)状态[^2][^5] - 设置断点并分析崩溃原因(结合 `core` 文件)[^4] --- #### **使用步骤** ```bash # 1. 编译内核(在 oslab/linux-0.11 目录) make # 2. 返回 oslab 目录启动调试 cd ~/oslab ./dbg-asm ``` **调试命令示例**: 1. 查看物理内存: ```bash <bochs:1> xp /8w 0x00faa2d0 # 查看地址0x00faa2d0处的8个字(32位) ``` 输出示例(引用[5]): ``` [bochs]: 0x00faa2d0 <bogus+0>: 0x00000000 0x00000000 0x00000002 0x10c0fa00 0x00faa2e0 <bogus+16>: 0x00003fff 0x10c0f300 0x00000000 0x00fab000 ``` 2. 分析段寄存器(以DS为例): - 当 `DS=0x0017` 时: - 索引值=0x10(二进制00010000) - TI=1 表示使用LDT-LDT第2项(每项8字节,16/8=2)[^2] --- #### **常见问题与解决** 1. **窗口显示异常** - **现象**:Bochs窗口黑屏或无响应 - **解决**: - 保持窗口正常尺寸(勿最小化/最大化) - 检查是否完成内核编译(`make`命令无报错) - 重启调试:先关闭所有窗口再运行`./dbg-asm` 2. **调试命令失效** - **现象**:输入命令无响应 - **解决**: - 确认光标在命令行终端(而非Bochs窗口) - 检查Bochs版本:`bochs --version` 应为2.6.x 3. **分析崩溃问题** - 生成core文件后使用gdb分析[^4]: ```bash gdb -c core # 调试core文件 ``` --- #### **关键技巧** 1. **结合源码调试** 修改 `oslab/linux-0.11` 内源码后重新编译,立即在调试环境测试 2. **磁盘映像操作** 通过 `hdc-0.11.img` 访问实验环境中的工具(vi、gcc等)[^3] 3. **常用调试命令**: | 命令 | 功能 | 示例 | |---------------|--------------------------|-----------------------| | `s` / `n` | 单步执行 | `s` | | `c` | 继续运行 | `c` | | `b addr` | 设置断点 | `b 0x7c00` | | `r` | 显示寄存器 | `r` | | `xp /nf addr` | 查看内存(n=数量,f=格式) | `xp /8wx 0x00000000` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值