问题标签 [memory-segmentation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
memory-management - Segmented paging 和 Paged segmentation 的异同?
我正在研究组合分页/分段系统,在我的书中有两种方法:
我无法弄清楚两者之间的区别。我认为在分页分段中,段被分成页面,在分段分页中,页面被分成段,虽然我不知道我是对还是错。同时在互联网上,仅使用一种方案来描述组合的寻呼/分段。我不明白为什么在我的课本中有两种方案。任何帮助将不胜感激。
x86 - 受保护平面模型中的 CS 与 DS 值
受保护平面模型中给定进程的 CS 和 DS 段寄存器是否保持相同的值?
换句话说,在同一个程序中执行以下代码序列
mov dword ptr [0x7fffffff], ebx
并且
org 0x7fffffff
...some instruction ...
参考同一个位置?(如果是这样,那么在受保护的平面模型中拥有单独的 CS 和 DS 的目的是什么?)谢谢。
x86 - x86 实模式下的段大小
我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以小于 64K。我的问题是这些段大小和基地址是如何初始化的?就像在保护模式下有 GDT 和 LDT。实模式段也可以重叠、不相交或相邻。就像 BIOS 为特定的东西(如引导代码、视频缓冲区等)保留了一些区域一样,汇编程序是否需要做类似的事情?
operating-system - 每个程序是否在内存中都有自己独立的段(代码、堆栈、数据)?
假设有许多程序同时运行。
每个运行的可执行程序是否在 RAM 中都有自己的代码、数据和堆栈段,或者是完整的 RAM 分为 4 个段,每个段分别保存每个程序的段。
x86-16 - 为什么数据存在于同一物理内存中的 8086 中的多个位置?
在 8086 中,多个逻辑地址 ( segment:offset
) 可以具有相同的物理地址(001F:000F
并且000F:010F
是相同的地址,就像001F:000F = 01F0+000F = 01FF
一样000F:010F = 01FF
)。
在物理内存中,任何程序都可以看到逻辑内存地址。因此,多个程序可以在同一物理地址(尽管逻辑地址不同)位置拥有数据(字节)。为什么它们不相互碰撞?为什么我们不丢失数据???
memory-management - x86 分段内存
前几天在阅读The Art of Assembly时,我来到了这里关于内存布局的部分。它开始讨论分段内存,我认为它没有多大意义。
将内存分割成段作为一种组织方式非常有意义,但是使用函数segment + offset
,当函数重复其输出时你会怎么做?eg 1038 + 57
, 57 + 1038
,1095 + 0
都出来到线性地址 1095。这不是坏事吗?当您不打算这样做时,您不会不小心处理相同的线性内存空间吗?
Wikipedia 说它可以用于一个优势,“例如在处理多个嵌套数据结构时”,但是如何使用它来更快地处理嵌套结构呢?
linux - 在 Linux 上从 64 位代码远调用 __USER32_CS
最近我意识到你可以在 64 位代码中做到这一点:
wherecode
指向位于地址空间较低 4GiB 的可执行页面上的一段 32 位代码,并且是Linux x86 标头中段选择器0x23
的值。__USER32_CS
我不知道跳跃目标是否需要属性,但我添加了for good measure。当然,为了使远程返回成为可能,这个调用代码本身必须位于虚拟地址空间的低 4 GiB 中的某个位置。我发现把它放进main
去就足够了。
我知道这几乎是无用的(没有加载 32 位库,调用约定不同等)并且容易损坏( 的值__USER32_CS
不是 Linux 面向用户空间的 API 的一部分)。
我的问题:有没有一种简单的方法来证明调用的目标确实是在 32 位模式下执行的?这种调用是否有任何实际用途(现有的库软件利用它,或者至少不那么不切实际的可能性)?
assembly - 近/远 jmp/呼叫细节
我无法完全掌握 jmp/call 远/近版本的细节。据我了解, jmp/call 指令附近使用指令本身的相对偏移量作为操作数。Far jmp/call 指令使用绝对地址作为操作数。
1)在保护模式下,这个绝对地址只是编译器放置的虚拟地址。
2)在实模式下,您通常会写:
然后绝对地址由公式计算:
这实际上是实模式下的物理地址。
执行 far jmp/call 时 CPU 会自动更新 CS 吗?例如,当 BIOS 代码跳转到加载的引导扇区代码时。我没有在引导扇区文件的源代码中看到设置 CS 值。
在保护模式下:cs = index in descriptor table = absolute address / page size
在实模式下:cs = segment index in RAM = specified "new number of code segment"
我的假设正确吗?
c - 如何编写自解密二进制文件?
我正在编写一个二进制文件,该文件正在访问一些安全凭证,如 RSA 私钥,没有人应该看到。我不知道如何安全地保存私钥。现在我将这些信息保存在二进制文件的内部.data
部分中。因此,为了安全起见,我正在考虑加密二进制文件的数据部分,并且该部分将在运行时由二进制文件中的一些小程序解密。我写了一个小程序,它读取二进制文件并加密数据部分,它也可以工作。现在我想要的是在运行时解密数据部分。但是在运行时,所有这些部分都将作为段加载到内存中,我对在运行时获取段地址知之甚少。
所以任何人都可以告诉我任何我可以用来将数据部分加载到内存中并在运行时解密该部分并使用存储在数据部分中的值的方法。
assembly - 段偏移对 bs 段描述符
与 32 位处理器中的段描述符相比,我对理解 8088 中用于物理地址计算的段偏移对之间的区别感到有点困惑。
任何解释将不胜感激。