汇编和硬件级存储器读取,处​​理,分段,偏移,存储器寻址范围等的混乱

时间:2013-01-08 23:11:45

标签: performance

在学习装配一段时间后,我很困惑,并在其上复习了很多很棒的教程。

除了记住一些指示去做一些你并不完全理解的事情之外,我必须说完全理解它的有用性的整个方案是非常困难的。

我寻求成为一名操作系统开发人员和设计人员,因此我必须了解低级硬件数据处理,内存管理,处理器获取,解码和内存分段,内存使用,位和字节使用,调用堆栈和硬件堆栈,以及硬件本身的机器级程序的机制。

以下是我感到困惑的主要问题:

处理器从RAM中获取字节。在编写引导加载程序时,您在写入指令之前“跳转”到一个地址。跳转到内存中的地址后执行的第一条指令,例如移动/数据复制MOV AL, MOV BL类指令检索CPU管道上的数据,该数据不直接在内存中使用。但是,如果从内存加载/获取指令,处理器如何在其管道上生成代码数据段?或者我在这里错了吗?微处理器在引导加载程序中执行的基本步骤是什么,如果指令全部从内存中取出,CPU如何在不使用内存的情况下从管道生成代码数据(例如,汇编中的代码段,但数据段和文本段都是指令)对于处理器)?

另外,对于一些比我更有经验的人来说,我的下一个主要问题可能很容易回答:

为什么x86和其他架构上的内存/ RAM存储为带有偏移的“段”?对我而言,这比它需要的更复杂。为什么不能以更直接的方式将所有存储器线性化,寻址,获取,存储和计算,以及移入和移出寄存器到存储单元?这会不会使架构的说明和理解更容易理解,而且比大量寄存器处理基于存储器的数据存储和访问的二维分段更直接?

1 个答案:

答案 0 :(得分:0)

这不仅仅是“集会”与“高级语言”。

真正的问题是“真实”与“受保护”(虚拟内存)模式。

不幸的是,大多数x86汇编示例恰好是 DOS 示例。其中,恕我直言,与当代32/64位虚拟内存架构(包括但不限于x86)几乎没有关系。

优秀的底漆:

Programming from the Ground Up

PS: 在大多数现代操作系统(包括Windows,Linux和Mac OS)上,地址空间 是有效线性的x86事件。 x86段寄存器在很大程度上是DOS时代的错误。

如果您有兴趣,可以在这里详细了解Linux启动过程: