我一直在开发一个 32 位操作系统,并且刚刚实现了一个 ELF 加载器。我可以加载可执行文件,但是我想运行每个程序都有自己的数据段。现在从我在 32 位保护模式下的研究中收集到的数据段指的是 64k 块,对吗?所以假设我将 DS 设置为 16,并且有类似 mov dword eax,[test] 的代码。处理器得到测试中的内容,如 (DS * 0xFFFF) + 测试,对吗?因此,如果 test 为 0,那么它将读取的实际地址是 983025 还是 0xEFFF1?这是对的还是我完全不在
问问题
885 次
1 回答
3
现在您正在开发自己的操作系统,数据段以及代码段和堆栈段几乎可以随心所欲。
在 386 个 PE 段寄存器中“指向”驻留在物理内存中的描述符表,其中每个段被分配 8 个字节(或者在 x64 中可能是 16 个字节?)来定义基地址、读/写/执行标志和段大小.
通常,这些限制设置为 0 和 2^32(-1),这也称为平坦模式。
即使在使用 linux/cygwin 等兼容 gcc 时,也很有可能从分段架构中受益,因为知道每个内存访问都使用取决于基址寄存器的默认段。只要使用mov [ebp + ... ]
或mov [esp + ...]
作为基址寄存器访问所有局部变量,就使用堆栈段。这可用于异常处理以区分堆栈损坏和堆损坏。它可以用于自动增长数据/堆栈段等。它可以用于为应用程序提供分离的数据区域——也许可以通过分段实现内存映射文件 API——而不是 linux,其中 fs: 和 gs: 是为内核保留。
于 2013-01-07T10:57:59.517 回答