2.内存寻址

  • 内存地址 
    1. 三种内存地址:1)逻辑地址(机器指令中操作数或指令的地址) 分段单元 2)线性地址(虚拟地址)分页单元
      3)物理地址(用于内存芯片级内存单元寻址

    2. 多CPU时,共享同一内存,RAM芯片由独立的CPU并发访问; 由内存仲裁器保证RAM的读写的串行执行
         

  • Linux中的分段 
    1. 80X86才使用分段(把程序划分为逻辑相关的实体),Linux更喜欢使用分页(当所有进程使用相同的段Register值时,它们共享同样的一组线性地址,这样内存管理简单;
      RISC对分段的支持有限.).

    2. 两者都划分进程的物理地址空间:分段可以给每一个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间.

    3. 段选择符由宏__USER/KERNEL_CS/DS定义.对内核代码寻址,吧__KERNEL_CS宏产生的值装入cs寄存器即可.这样执行指令时,只需指定逻辑地址的偏移部分,段选择符已经隐含在寄存器内.

    4. 所有段(内核/用户的数据/代码段)的Base=oX0000000,即逻辑地址(的偏移量字段值)=线性地址(的值).所有进程使用相同的逻辑地址.

    5. 每个CPU一个GDT,会插入未使用的项使得经常一起访问的描述符能够处于同一32字节的硬件Cache中;
      大多数用户态APP不适用局部描述符表,所以定义了一个缺省的LDT供进程共享,同时进程可以创建自己的LDT.
         

  • 硬件中的分页 
    1. 分页单元的一个关键任务就是把所请求的访问类型与现行地址的访问权限相比较,如果访问无效,产生一个缺页异常.

    2. 页: 线性地址被分为固定长为单位的页,页内连续的线性地址被映射到连续的物理地址中,内核仅需为页指定物理地址和存取权限,提高了效率.

    3. 页框: 相应地,把RAM也分为固定长度的页框(物理页),一个页框包含一个页(长度一致).

    4. 页表: 把线性地址映射到物理地址的数据结构.存放于主存中

    5. CPU通过设置cr0寄存器的PG=0标志启动线性地址到物理地址的翻译

    6. 常规分页 
      1. 页Size=4KB.从而32位的线性地址= Directory(10b:目录)+ Table(10b:页表)+
        Offset(低12b:偏移量)

      2. 转换分为两步,每一步基于一种转换表.使用二级模式为了减少每个进程页所需的RAM的数量.二级模式只为进程实际使用的那些虚拟内存区请求页表来减少内存容量.

      3. 每个活动进程都有一个页目录,但是仅在进程实际需要一个页表时才给该页表分配RAM.

    7. 扩展分页:
      页框Size=4MB.用于把大段连续的线性地址转换成相应的物理地址.不适用中间页表.32b线性地址=Directory(10)+Offset(22)

    8. 64位系统中的分页: 使用了额外的分页基本.不然的话每个进程的页目录和页表含有的表项太多.

    9. 物理地址扩展(PAE)分页机制 
      1. CPU所支持的RAM容量受地址总线上的管脚数限制,将该数从32改为36即可为2(36)=64GB.

      2. PAE机制:1)64GB的RAM分为2(24)个页框,页表项的物理地址字段从20变为24位.所以PAE页表项=12个标志位+24个物理地址位=36,页表项Size=64(>32).所以一个4KB的页表包含512个页表而非1024个.

      3. 2)引入页目录指针表(PDPT)的级别,由4个64位表项组成.

      4. 3)cr3控制寄存器含有一个27位的PDPT的基地址,因PDPT在RAM的前4GB中,并在32字节的倍数上对其,所以27可以表示其基地址

      5. 解释32位线性地址(4KB/2MB的页):1)cr3指向PDPT; 2)31-30指向PDPT中4个项之一;
        3)29-21指向页目录中512个项中的一个;
        4)20-12指向页表512项之一+11-0为4KB页内Offset/20-0为2MB页中Offset.

      6. PAE的主要问题是线性地址仍是32位.并没有扩大进程的线性地址空间,而只处理物理地址.内核编程人员必须用同一线性地址映射不同的RAM区.

      7. 由于只有内核才能修改进程的页表,所以用户态下的进程不能使用>4GB的物理地址;
        但内核能够使用更多的物理地址从而增加了系统中的进程数量.

    10. 硬件Cache 
      1. 由行(几十个连续的字节)组成.其位于分页单元和主内存之间.由硬件Cache内存(真正的行)+Cache控制器(表项数据.一个表项(标签(辨别行映射的内存单元)+标志)对应一个行)组成

      2. 类型: 直接映射/充分关联/N-路组关联,来将主存中的一个行,关联到Cache中的一个行.

      3. 写策略:通写(同时写RAM和行,一般为了效率,关闭Cache;
        回写:只写Cache的行,当CPU没有命中时,Cache的行被写回到内存中.

      4. 一个CPU一个Cache,需要使用高速缓存侦听(snooping)来同步他们的内容.

      5. Pentium CPU可以为每一个页框指定Cache策略,Linux忽略之,使得所有的页框都启用Cache,且回写策略.

    11. 转换后援缓冲器(TLB):
      加速线性地址的转化.物理地址经过一次转化后放于TLB表项内.其每个CPU都有一个,但是不必同步,因为运行在现有CPU上的进程可以使同一线性地址于不同的物理地址关联.
         

  • Linux中的分页 
    1. 组成:页全局目录+页上级目录+页中间目录+页表. 并在32位系统中将页中间目录和页上级目标级别的位设置为0来对应.

    2. 物理内存布局: Linux内核安装于RAM的第二个MB开始.原因:页框0由BIOS使用;
      640KB~1MB为洞(物理地址被保留但不能被使用).布局=内核代码+已初始化过的Data+未初始化过的Data.

    3. 进程页表:线性地址空间,用户态 < oXc000000, 内核态 > oXc0000000.

    4. 内核页表

2.内存寻址

时间: 2024-10-08 18:23:20

2.内存寻址的相关文章

内存寻址

当使用80x86微处理器时,我们必须区分三种地址: 1.逻辑地址(logical address) 包含在机器语言指令中用来指定一个操作数或者一条指令的地址.由一个段(segment)和偏移量(offset)组成. 2.线性地址(linear addres,也称虚拟地址 virtual address) 是一个32位无符号整型.是我们编程时接触到的都是这种. 3.物理地址(physical address) 用于内存芯片级内存单位元寻址. 内存控制单元(MMU)通过一种称为分段单元(segmen

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  ||         索引号