问题标签 [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.

0 投票
1 回答
2770 浏览

operating-system - 分段如何工作以及如何从段表中计算物理内存地址

我正在讨论操作系统中的细分主题。

我了解到分段的概念之所以存在,是因为内存中加载的进程的地址空间中可能存在空闲空间。

我将尝试首先解释一些我从研究中理解的东西。如果有任何错误,请纠正我。

例如,如果不使用分段,这可能不是理想的情况

我有一个地址空间很小的进程,它被加载到内存中。由于进程地址空间可能不会放在物理内存的开头。我们需要一些机制来转换程序代码的地址(代码段,从哪里PC 指向的指令被执行)到实际的物理内存地址。因此,我们为此使用硬件寄存器(MMU)来维护正在运行的进程的基值和绑定值。基值是放置进程的物理内存的起始地址,绑定是运行进程的总大小或运行进程的最后地址。由于 MMU 是全局的,我们需要在上下文切换期间保存基值/绑定值。

所以在这里physical memory address = virtual memory address + base;

现在假设我们有一个地址空间很大的进程。我们需要一些像分段这样的机制来更好地利用空闲空间,因为进程地址空间可能在堆和堆栈或代码和堆之间包含大量空闲空间。

对于分段,我们为每个进程维护一个分段表(需要在上下文切换期间将该表存储在 PCB 中)。

在分段中,我们为正在运行的进程地址空间的每个逻辑段维护基本/绑定值。因此,理想情况下,我们为每个代码、堆栈和堆段维护基本/绑定值,并将这些值存储在段表中。

所以段表应该看起来像这样..

物理内存可能看起来像这样..

那么现在如果处理器在执行代码指令时需要将虚拟内存地址转换为物理内存地址,它如何知道选择哪个基值,因为段表中可能有很多基值?

假设让我们说指令是更新一些堆栈变量..在这种情况下它将如何选择堆栈的基值?

那么物理内存地址=堆栈的基地址+指令中的虚拟内存地址?

除了外部碎片之外,分割的缺点是什么。

任何对分段//分页/虚拟化概念进行详细解释的外部链接都会非常有帮助。

0 投票
1 回答
400 浏览

operating-system - 操作系统中的程序员和细分

我了解到操作系统中的分段是基于将不同的段(对于程序,这些段可以表示符号表、源文本、堆栈...)划分为从逻辑内存地址 0 开始的单元。这是除了偏移量之外,MMU (?) 用来获取真实值的虚拟地址。

分段的一个明显好处是,由于每个段都从地址 0 开始,因此多个进程可以同时利用单个段(例如共享库)。

但是,我看不出分割还能如何使程序员受益。会有什么例子?

谢谢!

0 投票
1 回答
163 浏览

c - 堆栈、数据和指令段在哪里实现?

所以在 x86-64 中放弃了内存分段,但是当我们使用汇编时,我们可以在代码中指定 .code 和 .data 节/段,并且还有堆栈指针寄存器。

以及堆栈段、数据段和代码段寄存器。

代码/数据/堆栈的划分是如何以及在哪里发生的,它是由 CPU 还是操作系统实现的?

因为当我们调试并看到一些C程序的反汇编视图时,地址空间是线性的,没有除法。

当他们说数据段有全局、静态和堆的“部分”时,这是操作系统抽象吗?

0 投票
2 回答
1444 浏览

assembly - 汇编程序如何计算符号地址的段和偏移量?

我已经了解了编译器和汇编语言,所以我想编写自己的汇编程序作为练习。但是我有一些问题;

如何计算诸如@DATA 或 OFFSET/ADDR VarA 之类的段的地址?

以一个简单的汇编程序为例:

那么汇编器是如何计算段的段地址的@data呢?

它如何知道将什么放入直接用于mov dx, offset msg

0 投票
1 回答
931 浏览

x86-16 - 有人可以帮我处理分段和 8086 英特尔的微处理器吗?

我正在阅读有关英特尔 8086 架构的信息,但无法弄清楚以下有关分段的内容:我知道段寄存器分别指向段并包含 64kb 长段的基地址。但是谁计算以及在哪一点设置段寄存器中的物理地址?另外,因为一个物理地址可以被多个段访问:偏移量对和段可以重叠,你怎么能确定你不会覆盖一些东西?我可以在哪里阅读更多相关信息?

0 投票
1 回答
598 浏览

assembly - 段寄存器和段落边界 8086

段寄存器是否保存用作基地址的物理地址,或者因为段只能在段落边界上开始,段寄存器只保存该段边界的序号,然后乘以 10H 最终物理基数形成地址,然后添加偏移量。我对吗?

0 投票
1 回答
953 浏览

x86 - x86 段描述符布局 - 为什么它很奇怪?

为什么英特尔选择在段描述符中将段的基数和限制拆分为不同的部分,而不是使用连续位?

参见http://css.csail.mit.edu/6.858/2014/readings/i386/s05_01.htm的图5-3

为什么他们不将基地址存储在 0 到 31 位,限制在 32 到 51 位,并将剩余位置用于其他位(或一些类似的布局)?

0 投票
1 回答
693 浏览

assembly - 保护模式,设置段寄存器

我最近在简单的操作系统开发中使用 gnu-assembler。我正在使用下面的代码将 CPU 切换到保护模式。为了做到这一点,我将 GDT 设置如下并执行远跳转到给定标签 wit 0x08 作为 GDT 偏移量(以设置 CS)。之后CPU没有自行复位jmp,但是mov跳转到后没有一条指令被正确执行leaveToKernelmov我说设置 DS 和 SS 失败的原因是这个 qemu print ( info registers):

有人可以帮我理解和解释这种行为吗?提前致谢

用于将 CPU 切换到 p 模式的代码(GAS 语法):

0 投票
5 回答
1152 浏览

pointers - 操作系统如何在不检查所有指针地址的情况下确定空指针访问?

众所周知,0 地址(标记为宏“NULL”)是非法访问的。我想知道操作系统(比如linux)如何确定何时可以访问代码中某处的空地址,而不必访问代码中的每个指针地址?我认为它与信号有关,特别是与“sigsegv”信号有关。

但我不确定它是如何完成的。

0 投票
1 回答
2823 浏览

x86 - 访问代码段时的权限级别检查

我试图了解有关英特尔 x86 架构的一些细节。我还没有真正理解调用门机制,但是没有它,为了访问不符合要求的代码段,它的 DPL 必须等于 CPL。

我明白这在 DPL < CPL 的情况下很重要,但为什么在 DPL > CPL 的情况下它是被禁止的?我的意思是如果我们想保持相同的特权级别,CPL 可以在跳转后保持不变,如果我们想降低我们的特权,我们可以使用 RPL 。