关闭

Linux下的地址映射

标签: Linux内存管理
125人阅读 评论(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位为物理页面的偏移量,通过页目录查询页表,通过页表查询物理内存。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

linux地址映射

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

Linux中地址映射的全过程

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

Linux地址映射

http://blog.chinaunix.net/uid-20528014-id-314322.html 一,线性映射与非线性映射 1.       内存管理 物理内存管理: L...
  • bmbm546
  • bmbm546
  • 2015-06-05 19:53
  • 816

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

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

Linux内核地址映射模型

Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 ...
  • moe26
  • moe26
  • 2013-08-26 10:05
  • 994

linux host文件,主机名或者服务器名和ip地址之间的映射

Linux操作系统下/etc/hosts文件配置方法(转自http://os.51cto.com/art/200803/68170.htm) 2008-03-28 Linux 的/e...
  • xiaoshubiao
  • xiaoshubiao
  • 2013-12-12 15:34
  • 15280

32位Linux系统虚拟地址映射

80386
  • wendy_keeping
  • wendy_keeping
  • 2017-06-15 14:54
  • 224

linux地址映射机制

6. 4   地址映射机制        顾名思义地址映射就是建立几种存储媒介(内存,辅存,虚存)间的关联,完成地址间的相互转换,它既包括磁盘文件...
  • zheng123123123123
  • zheng123123123123
  • 2013-10-22 10:57
  • 498

Linux新建虚拟机设置IP,配置主机映射,连接CRT

1,设置IP地址,远程连接CRT: 打开Edit Connections 窗口,选择当前网卡System etho,进行编辑:  其他的不动,选择IPv4  Settings,将Met...
  • qqliang1314
  • qqliang1314
  • 2015-12-13 16:52
  • 1262

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

/************************************************************/ /* file name : memmap.c ...
  • w335191658
  • w335191658
  • 2016-08-09 10:50
  • 1012
    个人资料
    • 访问:232次
    • 积分:21
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档