ubi*_*con 13 assembly memory-management
我正在努力学习汇编语言,我需要澄清一些事情.如果我错了,请纠正我,因为我对装配知之甚少.
我看的所有教程都有汇编程序的变量分配给一个内存地址0x0000,我可以理解你必须在程序集中手动分配内存地址,但是你怎么知道要使用哪个地址?
显然,从可能的最低内存地址开始是有意义的,但如果您分配的变量大于可用的内存,该0x0000怎么办?有问题的变量会延伸到0x0001或0x0002吗?如果它确实不会弄乱其他变量分配具有相似编号的空格(或者你不应该将它们分配给那些关闭)?
如果我有两个程序在同时运行的程序集中编写(在现代操作系统中)并且我在两个程序中使用了相同的内存地址,那么一个程序是否与另一个程序冲突,或者操作系统是否只分配一个可用的内存地址在程序中实际写的是什么?
有关该主题的任何信息表示赞赏.
小智 19
问题的第二部分(在大多数现代操作系统上)的答案是虚拟内存.
您从具有物理内存的硬件层开始.那是你用手指实际戳的东西.这就是操作系统所看到的.操作系统允许您在称为虚拟内存的抽象上运行进程.
每个进程都有自己的虚拟内存空间.所以它可以假装它是唯一运行的进程,它有大量的内存.然后,每次访问内存时,都会提供一个虚拟地址,该地址将映射到物理地址.操作系统保存一个表,其中哪个虚拟地址映射到RAM中的实际物理地址.通常,由于性能原因,这也是通过一些特殊硬件(MMU,内存管理单元)完成的,但您也可以在软件中100%完成.
所以当你在你的程序中说0x000时,那是一个虚拟地址.当您读取或写入时,计算机会将其转换为物理地址.因此在另一个进程中,相同的虚拟地址0x000映射到不同的物理地址.该系统允许您编写程序,而无需确切知道有多少RAM可用,或者程序将加载到哪个地址.它还可以防止程序丢弃属于另一个程序的内存.
至于第一部分,绝对.不同类型的数据占用不同的内存量.在布局数据结构时,您必须知道需要多少空间.还要记住字节对齐问题.多字节数据类型(例如浮点数)通常必须从可被2或4整除的地址或存储浮点所需的字节数开始 - 这是处理器或RAM的要求.因此,您不能只是将所有数据压缩在一起,接下来的一个字节,您必须按照特定顺序进行布局,例如,如果您希望最大限度地减少未使用的内存,则将拼图拼凑在一起.
| 归档时间: |
|
| 查看次数: |
8599 次 |
| 最近记录: |