Linux下的地址映射

标签: Linux 内存管理
142人阅读 评论(0) 收藏 举报
刚刚开始写博客,怕自己忘记,同时有些专业错误也请大家指正。
在这里我讲一些,在Linux下的地址映射,首先说一下实模式下的地址映射,实模式简单的说就是没有操作系统的模式,在实模式下,不区分用户态与内核态,因为此时还没有操作系统,主要是指在8086之前的计算机,8086的数据总线是16位,地址总线是20位,因此它有效的寻址空间是2^20,即1M,在8086里面有4个寄存器,CS,代码段寄存器,DS,数据段寄存器,SS(ES),堆栈段寄存器,我们的物理地址=段基址+逻辑地址/偏移地址,这里的段基址值指,在段寄存器里面的值,但是我们需要知道的是,在8086里面规定每个内存段的起始地址为16的倍数,也就是说段基址的低4位一定为0,因此,在8086的设计中,寄存器并没有保存它低4位的值,因此在计算的时候,我们需要将段基址左移4位,之后即可得到真实的物理地址。

由于实模式这样的设计并不安全,因为我们并不知道,内存的访问权限,内存的大小,很有可能一不小心就越界,因此在80386之后,采用了保护模式下的地址映射,在保护模式下,新增了寄存器,GDTG,全局段描述符表,LDTR,局部段描述符表,在GDTR里面存放了GDT的地址,而GDT相当于一个存放内存信息的数组,在GDT里面存放的数组信息包括内存的起始地址,内存段的大小,以及内存的访问权限等信息,而之前8086里面已经存在的寄存器也没有消失,只是它不再存放段基址,它存放GDT的索引,即下标,在80386中,段寄存器的低两位为RPL,表示内存的权限,00为最高全校,也即内核态,01表示用户态,最低权限,次低位为TL,表示在这里用的是什么段描述符,0 为GDTR,1为LDTR,因此段寄存器还剩下13位,这里的13位可以表示对的数字为8192,但是在系统内部已经有12个数字已用,因此,8180个数字表示GDT和LDT的数组下标,GTD结构如下:

这里的G如果为0;表示是按照字节,也即1M*1=1M;为1表示是按照页面,4K*1M=4G,也即总共的内存大小为4G,32位操作系统分配给每一个进程的虚拟地址空间为4G,其中前3G为用户空间,高的3-4G为内核空间,我们的段页式管理,计算物理内幕内存的时候,在分段管理模式下,GTD[ds<<3].base address+逻辑地址=线性地址,为什么要将寄存器的值左移三位呢,因为前面已经提到了,寄存器的低三位保存了一些信息,只有高13位才保存我们GTD的下标值,因此需要左移,在得到线性地址的情况下,如果没有开启内存分页,则这里的线性地址就是物理地址,如果开启了分页机制,我们还需要进行多级页表映射才能得到物理地址。

通过CR0寄存器的PG为可以查看是否开启了分页机制,CR2寄存器为我们提供发生缺页异常时的虚拟地址,CR3保存当前页目录的其实地址,CR4可以通过PAE查看是否开启了物理地址扩展。在进行多级页表映射时是这样做的,在CR3寄存器中存放的是当前进程的其实地址,它的高10位为PG,次高10位为页表,低12位为物理页面的偏移量,通过页目录查询页表,通过页表查询物理内存。

查看评论

Linux下的虚拟地址映射详解(一)逻辑地址到线性地址的映射

现在假设有这么一段代码:   void main() { int a = 100; cout }   如果编译执行,先打印地址,假设是0x12345678。那么,这个地址,是逻辑地址呢...
  • qq_33225741
  • qq_33225741
  • 2017-05-14 15:05:24
  • 485

Linux下虚拟地址映射

一、基本概念: 1、Linux下比较重要的点:虚拟地址空间、虚拟内存、交换分区 2、Linux下的四种地址:逻辑地址、线性地址、虚拟地址、物理地址 3、Linux下的两种映射:实模式下的地址映射...
  • cfy1024
  • cfy1024
  • 2017-06-04 18:15:02
  • 289

Linux 下地址映射过程总结

Linux32位下二级地址映射
  • sanyishaonvdemeng
  • sanyishaonvdemeng
  • 2017-11-13 18:13:28
  • 78

linux地址映射

最近看了本书,突然对于地址空间有些疑惑。在深入理解linux内核中把地址分为三类:逻辑地址(汇编语言中操作数地址或指令的地址,对于80x86的cup,逻辑地址是段+段内偏移地址)、线性地址(也叫虚拟地...
  • songwx479735228
  • songwx479735228
  • 2014-08-07 19:16:59
  • 766

linux下内存管理之地址映射

常见知识点:1、虚拟内存:内存管理的技术(1)由虚拟内存将最久未使用的页面放到交换分区中。活动的页面放在内存中。(2)给每个进程分配一个4G的虚拟地址空间。(3)它保证了每个进程的地址空间是隔离的。2...
  • m0_37976734
  • m0_37976734
  • 2018-03-27 14:05:24
  • 11

Linux下地址映射原理

一、Intel x86芯片发展过程       在x86体系中,8086及以前是16位处理机,80386是32位处理机,80286是16位到32位的过渡芯片。这里CPU的位数是指“算术逻辑单元A...
  • HappyToEat
  • HappyToEat
  • 2016-11-30 09:48:27
  • 287

linux更改映射ip地址

修改/etc/hosts里面的127.0.0.1为 linux的ip
  • smile_Accompany
  • smile_Accompany
  • 2018-01-03 22:04:54
  • 170

Linux中地址映射的全过程

Linux内核采用页式存储管理。虚拟地址空间划分成固定大小的“页面”,由MMU在运行时将虚拟地址“映射”成某个物理内存页面中的地址。 CPU的硬件结构 页式存储管理与段式存储管理所要求的硬件支...
  • s651665496
  • s651665496
  • 2016-06-03 17:20:42
  • 2636

PCI9030地址映射使用指南

  • 2010年11月02日 09:20
  • 115KB
  • 下载

Linux下将物理地址映射到用户空间

/************************************************************/ /* file name : memmap.c ...
  • w335191658
  • w335191658
  • 2016-08-09 10:50:22
  • 1248
    个人资料
    等级:
    访问量: 260
    积分: 22
    排名: 209万+
    文章存档