【问题标题】:x86 assembly proper data segment usage?x86 程序集正确使用数据段?
【发布时间】:2012-12-20 13:57:05
【问题描述】:

我一直在开发一个 32 位操作系统,并且刚刚实现了一个 ELF 加载器。我可以加载可执行文件,但是我想运行每个程序都有自己的数据段。现在从我在 32 位保护模式下的研究中收集到的数据段指的是 64k 块,对吗?所以假设我将 DS 设置为 16,并且有类似 mov dword eax,[test] 的代码。处理器得到测试中的内容,如 (DS * 0xFFFF) + 测试,对吗?因此,如果 test 为 0,那么它将读取的实际地址是 983025 还是 0xEFFF1?这是正确的还是我完全关闭了

【问题讨论】:

  • No 数据段不是 64Kbytes。在 32 位模式下,这些几乎已经过时了。
  • 是的,我认为内存地址完全关闭了,我不知道我是否读过它,但它一定是其他架构。所以你说没有必要? CPU 怎么会计算出类似 char* ptr;ptr[0] = 2; 的东西?

标签: memory assembly x86 segments


【解决方案1】:

现在您正在开发自己的操作系统,数据段以及代码段和堆栈段几乎可以随心所欲。

在 386 个 PE 段寄存器中“指向”一个描述符表,驻留在物理内存中,其中每个段被分配 8 个字节(或者在 x64 中可能是 16 个字节?)来定义基地址、读/写/执行标志和段大小。

通常这些限制设置为 0 和 2^32(-1),这也称为平面模式。

即使使用 linux/cygwin 等兼容的 gcc,也很有可能从分段架构中受益,因为知道每个内存访问都使用取决于基址寄存器的默认段。只要使用mov [ebp + ... ]mov [esp + ...] 作为基址寄存器访问所有局部变量,就使用堆栈段。这可用于异常处理以区分堆栈损坏和堆损坏。它可以用于自动增长数据/堆栈段等。它可以用于为应用程序提供分离的数据区域——也许可以通过分段实现内存映射文件 API——而不是 linux,其中 fs: 和 gs: 是为内核保留。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多