第三讲指针存储之迷 李林 电子科技大学计算机学院
第三讲 指针存储之谜 李 林 电子科技大学 计算机学院
个看似废话的问题 示例代码 。 int test; int *ptr &test; 问题 指针变量ptr中存储的是什么? 变量test的地址? 变量test的地址,再外加它的类型int? 似乎真的是地址?此地址非彼地址
一个看似废话的问题 ◼ 示例代码: ◼ int test; ◼ int *ptr = &test; ◼ 问题: ◼ 指针变量ptr中存储的是什么? ◼ 变量test的地址? ◼ 变量test的地址,再外加它的类型int? ◼ 似乎真的是地址?此地址非彼地址
回顾 “地址” 回顾《汇编语言》 。在汇编编程中,我们常常使用什么地址? 逻辑地址(段基址:偏移量) 物理地址=段基址(段寄存器×10H)+偏移 量 short jmp、near jmp、far jmp、r near call、 far call 回顾《操作系统》 虚拟地址经页表(多级)转换,变成物理地址 虚拟地址是什么?和逻辑地址有什么关系?
回顾“地址” ◼ 回顾《汇编语言》 ◼ 在汇编编程中,我们常常使用什么地址? ◼ 逻辑地址(段基址:偏移量) ◼ 物理地址 = 段基址(段寄存器×10H)+ 偏移 量 ◼ short jmp、near jmp、far jmp、near call、 far call ◼ 回顾《操作系统》 ◼ 虚拟地址经页表(多级)转换,变成物理地址 ◼ 虚拟地址是什么?和逻辑地址有什么关系?
回顾 “地址” 回顾《高级计算机系统结构》 x86的地址转换机制: 分段+分页 逻辑地址 分段 线性地址 分页 物理地址 虚拟地址包括了逻辑地址和线性地址 为什么会有分段机制? 为什么会有分页机制?
回顾“地址” ◼ 回顾《高级计算机系统结构》 ◼ x86的地址转换机制: ◼ 分段 + 分页 ◼ 虚拟地址包括了逻辑地址和线性地址 ◼ 为什么会有分段机制? ◼ 为什么会有分页机制? 逻辑地址 线性地址 分段 分页 物理地址
回顾“地址 逻辑地址 分段 线性地址 分页 物理地址 分页机制可以绕开,但分段机制绕不开 程序能直接使用的只能是逻辑地址 示例代码: int test; int *ptr &test; ptr存储的内容,与test的逻辑地址有关 段基址存放在寄存器中,ptr只能存放偏移量
回顾“地址” ◼ 分页机制可以绕开,但分段机制绕不开 ◼ 程序能直接使用的只能是逻辑地址 ◼ 示例代码: ◼ int test; ◼ int *ptr = &test; ◼ ptr存储的内容,与test的逻辑地址有关 ◼ 段基址存放在寄存器中,ptr只能存放偏移量 逻辑地址 线性地址 分段 分页 物理地址
指针存储之谜 T入 问题 指针变量存储的只是偏移量,带来了更多疑 惑: 除了直接写汇编程序,使用C、C++写程序时基 本没有考虑过段寄存器、near/far jmp,/call等 等,但是程序好像依然能“正确”运行? 既然程序直接使用的是逻辑地址,为什么操作 系统中经常提到的是“进程线性地址空间”, 而不是“进程逻辑地址空间”? 好像将分段机制绕开了! 指针变量到底存储的是什么?怎么办? 靠猜!
指针存储之谜——问题 ◼ 指针变量存储的只是偏移量,带来了更多疑 惑: ◼ 除了直接写汇编程序,使用C、C++写程序时基 本没有考虑过段寄存器、near/far jmp/call等 等,但是程序好像依然能“正确”运行? ◼ 既然程序直接使用的是逻辑地址,为什么操作 系统中经常提到的是“进程线性地址空间”, 而不是“进程逻辑地址空间”? ◼ 好像将分段机制绕开了! ◼ 指针变量到底存储的是什么?怎么办? ◼ 靠猜!
靠“猜”不靠“蒙”■ “猜”是有根据地猜。哪里找根据? 地址转换机制,分段和分页,是由CPU提供 的 需要到体系结构中去找根据
靠“猜”不靠“蒙” ◼ “猜”是有根据地猜。哪里找根据? ◼ 地址转换机制,分段和分页,是由CPU提供 的 ◼ 需要到体系结构中去找根据
体系结构中找根据 怎么在体系结构中找根据呢? 程序员技术手段之文档阅读法 Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1:Basic Architecture Volume 2:Instruction Set Reference Volume 3:System Programming Guide 查看卷3一一第三章Protected-Mode Memory Management
体系结构中找根据 ◼ 怎么在体系结构中找根据呢? ◼ 程序员技术手段之文档阅读法 ◼ Intel® 64 and IA-32 Architectures Software Developer’s Manual ◼ Volume 1: Basic Architecture ◼ Volume 2: Instruction Set Reference ◼ Volume 3: System Programming Guide ◼ 查看卷3——第三章 Protected-Mode Memory Management
Logical Address (or Far Pointer) 7 I Segment Selector Offset Linear Address Space WUA Global Descriptor Linear Address Table (GDT) Dir Table Offset Physical Address Space Segment Segment Page Table Page Descriptor Page Directory Phy.Addr. Lin.Addr. Entry Entry Segment Base Address Page Segmentation Paging-
实证思路一:弄清地址转换机制
体系结构中找根据 段寄存器 15 32 10 index GDT表 段描述符8字节(段基址,段界限) 段描述符8字节(段基址,段界限) 段描述符8字节(段基址,段界限) GDTR寄存器 48喝 1615 0 32位base 16位Limit
体系结构中找根据 段描述符8字节(段基址,段界限) 段描述符8字节(段基址,段界限) ………………………… 段描述符8字节(段基址,段界限) ……………………… GDT表 32位base 48 16位Limit 16 15 0 GDTR寄存器 index 15 3 2 1 0 段寄存器