页表

嵌入式学习-MMU

。_饼干妹妹 提交于 2020-04-03 12:04:12
原文: https://blog.csdn.net/u011003120/article/details/51812188 参考: https://blog.csdn.net/groundhappy/article/details/54889677 MMU 存储器管理单元,在之前因为是操作物理地址,不需要MMU,因此是处于关闭状态的,而这次则是打开MMU并且使用MMU. 一、MMU的作用 1.将虚拟地址转化为物理地址 2.进行访问权限的管理 看上图可以得知,有三个运行的程序,他们的虚拟地址都为0x400000,但是若要使用物理地址,他们的物理地址不能够相同,因此就需要一个机制,使他们的相同的虚拟地址对应不同的物理地址,这个机制就是上图中的Page tables(即页表),虚拟地址通过查表的方式对应到不同的物理地址上。 二、地址转化 首先需要知道的是,以段(Section,1M)的方式进行转换时只用到一级页表,而页(Page)的方式进行转换时用到两级页表,有粗也转换和细页转换两种,页的大小有3种:大页(64KB)、小页(4KB)和极小页(1KB)。 1.地址转化总体分析 整个地址转换的过程分为了两步,为一级转换和二级转换。 虚拟地址的[31:20]位作为一个表的索引,表的名字为translation table,即TTB,如果表的后两位为00,则为无效的转换,如上图,如果后两位为01

2.内存寻址

江枫思渺然 提交于 2020-03-31 04:26:23
内存地址 三种内存地址:1)逻辑地址(机器指令中操作数或指令的地址) 分段单元 2)线性地址(虚拟地址) 分页单元 3)物理地址(用于内存芯片级内存单元寻址 多CPU时,共享同一内存,RAM芯片由独立的CPU并发访问; 由内存仲裁器保证RAM的读写的串行执行 Linux中的分段 80X86才使用分段(把程序划分为逻辑相关的实体),Linux更喜欢使用分页(当所有进程使用相同的段Register值时,它们共享同样的一组线性地址,这样内存管理简单; RISC对分段的支持有限.). 两者都划分进程的物理地址空间:分段可以给每一个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间. 段选择符由宏__USER/KERNEL_CS/DS定义.对内核代码寻址,吧__KERNEL_CS宏产生的值装入cs寄存器即可.这样执行指令时,只需指定逻辑地址的偏移部分,段选择符已经隐含在寄存器内. 所有段(内核/用户的数据/代码段)的Base=oX0000000,即逻辑地址(的偏移量字段值)=线性地址(的值).所有进程使用相同的逻辑地址. 每个CPU一个GDT,会插入未使用的项使得经常一起访问的描述符能够处于同一32字节的硬件Cache中; 大多数用户态APP不适用局部描述符表,所以定义了一个缺省的LDT供进程共享,同时进程可以创建自己的LDT. 硬件中的分页

《深入理解linux内核》第二章 内存寻址

北城以北 提交于 2020-03-29 04:45:15
我的博客: www.shishangguan.net 三种不同的内存地址 逻辑地址(logical address) 包含在linux实际指令中的地址,即分段式地址,是 对应的硬件平台段式管理转换前地址 由16位的段选择符(segment selector)和32位的偏移量组成。 线性地址(linear address)(虚拟地址(virtual address)) 是一个32位无符号整数,可以表示4G的地址,值范围从0x00000000-0xffffffff。 线性地址则对应了硬件页式内存的转换前地址。 物理地址(physical address) 用32位或者36位无符号整数表示。用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。 三者之间的关系 逻辑地址------> 分段单元 ------>线性地址------> 分页单元 ------>物理地址 硬件中的分段 段选择符和段寄存器 如图所示,16位段选择符的最后13位是索引号,第0和1位是2bit位的请求者特权等级(一共有4中特权等级,linux只使用内核态还是用户态),第2位为表指示器。 段寄存器有css,ss,ds,es,fs,gs。其中前三个有特殊用途,后三个是通用段寄存器。 段描述符(segment descriptor) 段描述符表放在全卷描述符表(global descriptor table

[迷途羔羊:Linux 思考记  (第七天)]

妖精的绣舞 提交于 2020-03-29 00:41:31
一、常规分页 1、32线性地址分为3个域 【1】、Directory(目录) 最高10位 <<2^10>> 【2】、table(页表)最高10位 【3】、Offset(偏移量) 最低12位 线性地址分两步,第一种转化为页目录表(page directory) 第二种转化表称为页表(page table) 2、线性地址Directory字段决定页目录的目录项,而目录项指向适当的页表。地址的Table字段依次决定页表中的表项, ,而表项含有所在页框的物理地址。 【2】、页目录项和页表项结构 1、Present 标志 【1:页表或者页在主存 0:页不在主存】 2、Accessed 标志 分页单元对相应页框进行寻址时《操作系统》设置这个标志 3、Dirty 标志 页表项对相应页框进入写操作《操作系统》设置这个标志 4、Read /Write 标志 页/页表存储权限 5、User / Supervisor 标志 访问页/页表的特殊权限 6、PCD / PWT 标志 控制硬件高速缓存处理页或者页表的方式 7、Page Size 标志 页目录项,设置为1,页目录指向2MB或者4MB的页框 8、Gloal 标志 页表项,防止常用页从TLB(转换后援缓冲器)高速缓存中刷新出去,只有 cr4寄存器的页全部启用标志置位才起作用 来源: https://www.cnblogs.com/fantom

Linux内核学习--内存寻址

大城市里の小女人 提交于 2020-03-23 03:17:26
1.内存寻址的基本流程   首先,一般的书中或者博客中,在介绍Linux内核的时候,首先都会介绍Linux的内存寻址,这样的一块知识和程序的关联在哪里,下面的内容就首先的讨论一下这个问题。   在我们书写程序的时候,我们有的时候会操作地址空间空间,那么我们用到的地址是真实的内存空间地址么,答案是否定的,我们用到的是逻辑地址,在操作系统中,存在着这样的三个地址概念,他们是逻辑地址、线性地址和物理地址。   逻辑地址:包含在机器语言中,用来指定一个操作数或者一条指令的地址。每一个逻辑地址都由一个段和偏移量组成,偏移量指明了他从段开始的地址到实际地址的距离;   线性地址:也称作虚拟地址,是一个32位的无符号整数(32位操作系统),可以表达4GB的地址空间。其地址用十六禁止的数字表示,值得范围从0x00000000到0xffffffff。   物理地址:用于内存单元的寻址,是真正的内存的地址。   三种地址之间的关系如下:      从80286模型开始,Intel的处理器以两种不同的方式进行地址转换,这两种方式分别是实模式和保护模式,下面我们描述的都是保护模式下的地址转换。 2.内存中的分段机制   首先,我们来讨论下CPU的寻址方法:   (1)根据指令的类型来确定应该使用哪一个段寄存器,例如转移指令中的地址在代码段,取数指令中的地址在数据段。   (2)根据段寄存器中的内容

精髓——高度概括几种页框到线性地址的映射技术

巧了我就是萌 提交于 2020-03-20 23:19:13
3 月,跳不动了?>>> 第一种:就是页框到线性地址的一 一映射关系。这是在分页阶段,已经建立好的(这部分我可以深入讲一下,但是这部分内容不是很难,而且我的肩膀好酸痛,就不写了,以后在补上),就是为物理内存前896M的每个页框建立页表,并写进页表项。当进程请求这部分内存时,可以直接访问到这些页表,而不并现场创建页表。 第二种:高端内存永久内核映射。就是上一篇博文讲到的。这种技术的映射可以阻塞进程,使进程去睡眠。 第三种:临时内核映射。其实道理差不多。任何一个页框与权限合成的页表可以写进预留的几个页表项中,但这种技术是不能阻塞的内核映射技术,因此可以用到中断处理函数和可延迟函数中。 第四种:非连续内存映射技术。用slab分配器分配线性区描述符,然后在非连续内存区找到一块空闲的线性区。然后把申请到的每一个零散的物理页框描述符和权限合成页表,并将此页表写到查找到的线性区对应的页表项中。(其实道理都是差不多的,只要领悟了上一篇博文写的永久内核映射思想,那么此种技术的思想也是一样的:查找物理页框,(合成页表,写进页表项,返回线性地址) 后3种技术会重写页表,导致tlb中的页表无效。 大道至简,只要记住以下几句话那么面对各种映射技术就不会恐慌: 查找页框,合成页表,写进页表项,返回页表项的线性地址 以后几篇的更新会涉及物理内存页框的分配。内核的映射就写到这里 来源: oschina 链接:

大页内存原理

时间秒杀一切 提交于 2020-03-18 17:06:27
什么是内存分页? 我们知道,CPU是通过寻址来访问内存的。32位CPU的寻址宽度是 0~0xFFFFFFFF ,16^8 计算后得到的大小是4G,也就是说可支持的物理内存最大是4G。 但在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。 为了解决此类问题,现代CPU引入了 MMU(Memory Management Unit 内存管理单元)。 MMU 的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由 MMU 负责将虚址映射为物理地址。 MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。 内存分页(Paging)是在使用MMU的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(4K)分割成页(page)和页帧(page frame),并保证页与页帧的大小相同。 这种机制,从数据结构上,保证了访问内存的高效,并使OS能支持非连续性的内存分配。 在程序内存不够用时,还可以将不常用的物理内存页转移到其他存储设备上,比如磁盘,这就是大家耳熟能详的虚拟内存。 在上文中提到,虚拟地址与物理地址需要通过映射,才能使CPU正常工作。 而映射就需要存储映射表。在现代CPU架构中,映射关系通常被存储在物理内存上一个被称之为页表(page table)的地方。 如下图: 从这张图中

2.内存寻址

自闭症网瘾萝莉.ら 提交于 2020-03-16 08:09:19
内存地址 三种内存地址:1)逻辑地址(机器指令中操作数或指令的地址) 分段单元 2)线性地址(虚拟地址) 分页单元 3)物理地址(用于内存芯片级内存单元寻址 多CPU时,共享同一内存,RAM芯片由独立的CPU并发访问; 由内存仲裁器保证RAM的读写的串行执行 Linux中的分段 80X86才使用分段(把程序划分为逻辑相关的实体),Linux更喜欢使用分页(当所有进程使用相同的段Register值时,它们共享同样的一组线性地址,这样内存管理简单; RISC对分段的支持有限.). 两者都划分进程的物理地址空间:分段可以给每一个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间. 段选择符由宏__USER/KERNEL_CS/DS定义.对内核代码寻址,吧__KERNEL_CS宏产生的值装入cs寄存器即可.这样执行指令时,只需指定逻辑地址的偏移部分,段选择符已经隐含在寄存器内. 所有段(内核/用户的数据/代码段)的Base=oX0000000,即逻辑地址(的偏移量字段值)=线性地址(的值).所有进程使用相同的逻辑地址. 每个CPU一个GDT,会插入未使用的项使得经常一起访问的描述符能够处于同一32字节的硬件Cache中; 大多数用户态APP不适用局部描述符表,所以定义了一个缺省的LDT供进程共享,同时进程可以创建自己的LDT. 硬件中的分页

请求分页管理方式实现虚拟内存

老子叫甜甜 提交于 2020-03-08 03:42:19
请求分页系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。 在请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。 为了实现请求分页,系统必须提供一定的硬件支持。除了需要一定容量的内存及外存的计算机系统,还需要有页表机制、缺页中断机构和地址变换机构。 页表机制 请求分页系统的页表机制不同于基本分页系统,请求分页系统在一个作业运行之前不要求全部一次性调入内存,因此在作业的运行过程中,必然会出现要访问的页面不在内存的情况,如何发现和处理这种情况是请求分页系统必须解决的两个基本问题。为此,在请求页表项中增加了四个字段,如图1所示。 图1 请求分页系统中的页表项 增加的四个字段说明如下: 状态位P:用于指示该页是否已调入内存,供程序访问时参考。 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近己有多长时间未被访问,供置换算法换出页面时参考。 修改位M:标识该页在调入内存后是否被修改过。 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。 缺页中断机构 在请求分页系统中,每当所要访问的页面不在内存时

Linux虚拟内存相关知识

梦想与她 提交于 2020-03-07 14:15:36
Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进程的寻址空间, 虚拟地址空间内由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) ) 2、数据段:保存全局变量、静态变量的空间; 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域:如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 6、内核虚拟空间:用户代码不可见的内存区域,由内核管理(页表就存放在内核虚拟空间)。 32 位系统有4G 的地址空间:: 其中 0x08048000~0xbfffffff