汇编和硬件级内存获取、处理、分段、偏移、内存寻址范围等的混淆
Posted
技术标签:
【中文标题】汇编和硬件级内存获取、处理、分段、偏移、内存寻址范围等的混淆【英文标题】:Confusion of Assembly and hardware level memory fetching, processing, segmentation, offsets, scope of memory addressing, etc 【发布时间】:2013-01-08 23:11:44 【问题描述】:我很困惑,学习了一段时间的汇编,并查看了许多关于它的优秀教程。
除了记住一些指令来做一些你不完全理解的事情之外,我必须说要完全理解它的整个用处是非常困难的。
我想成为一名操作系统开发人员和设计人员,所以我必须了解低级硬件数据处理、内存管理、处理器获取、解码和内存分段、内存使用、位和字节使用、调用堆栈和硬件堆栈,以及来自硬件本身的机器级程序的机制。
以下是我感到困惑的主要问题:
处理器从 RAM 中获取字节。在编写引导加载程序时,您在编写指令之前“跳转”到一个地址。跳转到内存中的地址后执行的第一条指令,例如移动/数据复制MOV AL, MOV BL
类指令检索 CPU 流水线上不直接在内存中使用的数据。但是,如果指令是从内存中加载/获取的,处理器如何在其管道上生成代码数据段呢?还是我在这里都错了?微处理器在引导加载程序中执行的基本步骤是什么,如果指令全部从内存中获取,CPU如何在不使用内存的情况下从流水线生成代码数据(例如,汇编中的代码段,但数据段和文本段都是指令对于处理器)?
另外,对于比我更有经验的人来说,我的下一个主要问题可能很容易回答:
为什么 x86 和其他架构上的内存/RAM 存储为带有偏移的“段”?对我来说,这比它需要的要复杂得多。为什么所有内存都不能是线性的、寻址的、获取的、存储的和计算的,以及以更直接的方式移入和移出寄存器到存储单元?与让大量寄存器处理基于内存的数据存储和访问的二维分段相比,这不会使架构的说明和理解更容易理解和更直接吗?
【问题讨论】:
【参考方案1】:不仅仅是“汇编”与“高级语言”。
真正的问题是“真实”与“受保护”(虚拟内存)模式。
不幸的是,大多数 x86 汇编示例恰好是 DOS 示例。恕我直言,这与当代 32/64 位虚拟内存架构(包括但不限于 x86)几乎没有相关性。
优秀的入门:
Programming from the Ground Up
PS: 在大多数现代操作系统(包括 Windows、Linux 和 Mac OS)上,地址空间是有效的线性事件,适用于 x86。 x86 段寄存器在很大程度上是 DOS 时代的不合时宜。
如果您有兴趣,这里有一个很好的 Linux 启动过程概述:
http://www.ibm.com/developerworks/library/l-linuxboot/index.html【讨论】:
但是不幸的是,“真实”与“受保护”模式的概念,或者一般来说虚拟内存与 CPU 对真实内存(没有虚拟实施)直接。我想知道的是我应该如何理解数据处理,以及如何充分利用这些知识来真正了解我的代码在做什么,以及我将如何实现代码、数据和内存段以及在那个级别处理。 DOS x86 示例是无用的,因为磁盘操作系统操作尤其适用于该操作系统 我想要的是从公正的角度全面了解它(例如,磁盘操作系统和基于 Linux 的启动是特定于该操作系统的,并且没有概述内存的基本概念地址、指令解码、系统处理设计实现)。 问:“不幸的是,“真实”与“受保护”模式或虚拟内存的概念通常与 CPU 对真实内存的数据处理的实际实现无关(没有虚拟实现)直接。” A:这完全是错误的。 “虚拟内存”是“硬件的东西”。 CPU 加载、存储和操作进程(或内核)看到的相同虚拟地址。阅读 PGU - 老实说,我认为你会喜欢它的 :) 不过我暂时只是想了解一下,没有虚拟内存的迷惑,你给的那个网址也不清楚。 老兄——这不是“混乱”。这是基本的。对于当代系统,如果不掌握“物理”地址和“虚拟”地址之间的区别,您根本无法理解“内存访问”的概念。而且,就此而言,内存映射 IO 也是如此。诚实 :) 恕我直言...以上是关于汇编和硬件级内存获取、处理、分段、偏移、内存寻址范围等的混淆的主要内容,如果未能解决你的问题,请参考以下文章