内存寻址

当使用80x86微处理器时,我们必须区分三种地址:

1.逻辑地址(logical address)

  包含在机器语言指令中用来指定一个操作数或者一条指令的地址。由一个段(segment)和偏移量(offset)组成。

2.线性地址(linear addres,也称虚拟地址 virtual address)

  是一个32位无符号整型。是我们编程时接触到的都是这种。

3.物理地址(physical address)

  用于内存芯片级内存单位元寻址。

内存控制单元(MMU)通过一种称为分段单元(segmentation
unit)的硬件电路把一个逻辑地址转换成线性地址;接着,第二个成为分页单元(paging unit)的硬件电路把线性地址转换成一个物理地址。

Linux 中的分段

  与分段相比,linux更喜欢使用分页方式。运行在用户态的所有linux进程都使用一对相同的段来对指令和数据寻址。这两个段就是所谓的用户代码段和用户数据段。类似地,内核态的分别为内核代码段和内核数据段。

  与段相关的线性地址从0开始,达到231-1的寻址限长。

  所有的段都从0x0开始,那就是在linux下逻辑地址与线性地址是一致的。即逻辑地址的偏移量和线性地址相等。

硬件中的分页

  为了效率起见,线性地址被分成以固定长度为单位的组,成为页(page)。页内部连续的线性地址被映射为连续的物理地址。

  从80386开始,Intel处理器的分页单元出来4KB的页。

  32位的线性地址被分成3个域:

  Directory (目录),最高10位

  Table (页表),中间10位

  Offset (偏移量),最低12位

  线性地址的转换分两步完成,每一步都基于一种转换表,第一中转换表称为目录表(page
directory),第二中转换表称为页表(page table)。

内存寻址,布布扣,bubuko.com

时间: 2024-10-27 07:14:17

内存寻址的相关文章

Linux内存寻址

我会尽力以最简洁清晰的思路来写这篇文章. 所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程.因为操作系统要兼顾许多东西,所以也就变得复杂. 逻辑地址 → 线性地址 → 物理地址 逻辑地址 = 段 + 偏移量 因为:最开始cpu中的alu宽度只有16位,但地址总线宽度有20位.所以设置四个段寄存器:cs(指令),ds(数据),ss(堆栈),es(其它). 每个段寄存器16位,对应地址总线高16位.每条指令中的16位内部地址与某个段寄存器中内容相加,得到20位的实际地址. 上述的16位

Linux内存寻址之分段机制

http://blog.xiaohansong.com/2015/10/03/Linux内存寻址之分段机制/ .段的起始地址.段的长度等等,而在保护模式下则复杂一些.IA32将它们结合在一起用一个8字节的数表示,称为描述符 .IA32的一个通用的段描述符的结构从图可以看出,一个段描述符指出了段的32位基地址和20位段界限(即段长).这里我们只关注基地址和段界限,其他的属性略过. 段描述符表 各种各样的用户描述符和系统描述符,都放在对应的全局描述符表.局部描述符表和中断描述符表中.描述符表(即段表

Linux内存寻址之分页机制

http://blog.xiaohansong.com/2015/10/05/Linux内存寻址之分页机制/ 在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性-物理地址的转换过程.段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址. 硬件中的分页 分页机制由CR0中的PG位启用.如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

内存寻址二(分页)

硬件中的分页 概念 分页单元(paging unit)把线性地址转换成物理地址.其中一个关键任务是把所请求的访问类型与线性地址的访问权限相比较,如果这次内存访问时无效的,就产生一个缺页异常. 为了效率起见,线性地址被分成以固定长度为单位的组,称为页(page).页内部连续的线性地址被映射到连续的物理地址中.这样,内核可以指定一个页的物理地址和其存取权限,而不用指定页所包含的全部线性地址的存取权限.通常使用术语"页"既指一组线性地址,又指包含在这组地址中的数据. 分页单元把所有的RAM分

汇编第一节-寄存器与内存寻址

1. 内存寻址方式: 确定访问内存存储单元偏移地址方式,称为寻址方式. 名称 格式 直接寻址 [偏移量值] 寄存器简介寻址 [基址寄存器/变址寄存器] 寄存器相对寻址 [基址寄存器/变址寄存器+偏移量值] 基址变址寻址 [基址寄存器+变址寄存器] 相对基址变址寻址 [基址寄存器+变址寄存器+偏移量值] 2. 寄存器 普通寄存器:AX(AH,AL).BX(BH,BL).CX(CH,CL).DX(DH,DL).SP.BP.SI.DI 段寄存器:DS.SS.CS.ES 3.BX.SI.DI.BP寄存器

X64下MmIsAddressValid的逆向及内存寻址解析

标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com/showthread.php?t=205143 在内核编程时,经常会用到MmIsAddressValid来检测地址是否有效,结合之前学过的虚拟地址到物理地址之间的转化,所以发一篇对该函数的逆向以及代码还原,x86的资料论坛以及网络有很多了,所以这里楼主只谈一下Win7 x64下的MmIsAddre

内核基础 - 寄存器与内存寻址(by quqi99)

作者:张华  发表于:2016-03-01 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 汇编 汇编编译器assembler编译目标代码二进制文件(nasm -f elf -g -F stabs *.asm),连接器linker(ld -o bin_file *.o)除了把目标代码组合成一个单个的块,还要确保模块以外的函数调用能够指向正确的内存引用(连接器必须建立一个索引,也就是符号表,里面

【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)

2.1 内存地址 逻辑地址:段+偏移 线性地址(虚拟地址) 物理地址 2.2硬件中的分段 2.2.1 段选择符和段寄存器 15                                                3  2  1   0 ------------------------------------------------|                                                    |TI |RPL  ||         索引号