指针存储之谜 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 段寄存器