ARM-Linux (临时,正式) 建立页表的比较【转】

转自:http://blog.csdn.net/edwardlulinux/article/details/38967521

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

很久没有写博客了,由于之前的写关于OMAP3530文章还没有整理。再加上一直在找工作,找到工作后又投入到另外的平台去工作。始终在忙忙碌碌,但是对于代码确实渐渐疏远。

在做项目的时候要使用DDR3分配内存,不经意间使用要和MMU以及TLB打交道。因此特地写下这篇文章以备后用。(工作就是在和遗忘作斗争)!

 

Linux在启动之初会建立临时页表,但是在start_kerne函数中setup_arch又会建立正真的页表和页目录。那么两套方案是如何过渡的?假如在MMU开启的时候把之前的临时页表给覆盖了或者修改了,会不会影响后续的启动过程?带着这些问题分析一下。

 

首先来看一下基于ARM的页表管理和MMU的行为分析:

 

Arm上的linux(正式)页表采用的是一级粗页表结合二级小页表实现4G空间的访问。如上图说明。

 

一级表 (1024 Entrys)

 

二级表 (1024 Entrys)

 

虚拟地址后12位Offset寻址空间是4096B 4k的空间

 

Arm上的linux(临时)页表采用的是段式页表,每一个entry可以映射1M的空间,结合后面的20bits位(寻址空间正好是1M)

 

一级表 (4096 Entrys)

 

虚拟地址的后20位offset寻址空间是1M

接着来看一下linux如何建立页表的过程。

 

Head.S中有一段使用汇编编写的初始化代码。Mmu.c中有一段使用c语言写的建立页表的代码。C语言的代码很经典,可能汇编更经典。这里不多分析了。可以百度文章很多分析。

 

关键问题在于一个变量swap_pgdir

 

1..macro    pgtbl, rd  

 

2.  

 

3.       ldr   \rd, =(KERNEL_RAM_PADDR - 0x4000)  

 

4.  

 

5..endm  

 

KERNEL_RAM_PADDR = 0 x XXXXXXXX这是内存的物理地址,那么页表的建立也在这物理地址相关的区域内。

 

临时页表使用的是段式映射,也称之为平坦映射。那么4G的空间划分为1M为单位的访问单元,需要4096个Entrys。应为Arm采用32位的数据线,因此每一个Entry占用一个32位的区段,也就是4B。

 

正式页表建立的过程分为二级映射也寻找index的过程。每次把线性地址划分为两段,每一段都作为索引根据TLB BASE的便宜寻找下一级的索引项。最后结合虚拟地址的最后偏移(10 bit)作为依据在4K的空间内寻址。

 

 

问题来了,这两种映射会不会应为后一种映射的建立把之前的映射破坏掉,导致linux一个复杂的寻址系统无法正常工作呢?答案肯定不会。

 

图示比文字描述来的直接,还是直接上两张图说明问题:

 

由上图可知:临时页表建立的空间和正式页表建立的空间分别部署于不同的空间,因此不会出现覆盖或者修改等现象。同时一二级页表项目录中的内容页值得研究。最后两位同时表现出来的控制逻辑,让MMU翻译地址的过程中有章可循。结合MMU中的AP位规定了访问空间的属性,是否可以访问拒绝访问等。

 

    最后希望图示可以帮助读者理解映射的意图。文中难免有些地方会引起歧义或者不足之初,希望linux大侠指正点评。

时间: 2024-12-24 08:39:27

ARM-Linux (临时,正式) 建立页表的比较【转】的相关文章

嵌入式arm linux蓝牙文件传输移植

嵌入式arm linux蓝牙文件传输移植目前,蓝牙技术已经比较成熟,特别是基于手机和PC得蓝牙文件传输. 本文主要讲述基于嵌入式arm linux的蓝牙文件传输.    现行2.6.x的linux内核都已经集成了bluez蓝牙驱动,对于2.4版本内核的需要到bluez官方网站下载并安装bluez蓝牙驱动.http://www.bluez.org/download/    本为基于2.6版本的内核讲述.对于2.4下载bluez后安装即可.有了bluez蓝牙驱动还需要安装bluez-libs库和bl

Cloud Foundry正式建立一个开放监管且独立运作的基金会

前言:Pivotal为开源的PaaS项目Cloud Foundry正式建立一个开放监管且独立运作的基金会,推动建立PaaS的全球标准.Linux 基金会为Cloud Foundry 基金会提供管理,运营和行业内的推广宣传.CloudFoundry 基金会目前已超过40家成员公司, 我国的Anchora/MoPaaS (魔泊云)成为首批会员,并且是中国区的唯一基金会成员.作为开放的PaaS技术,Cloud Foundry 也在不断的演化 , 并融合包括Docker在内的其它开放的技术. Cloud

ARM Linux 3.x的设备树(Device Tree)【转】

转自:http://blog.csdn.net/21cnbao/article/details/8457546 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ARM Device Tree起源 Device Tree组成和结构 DTS device tree source DTC device tree compiler Device Tree Blob dtb Binding Bootloader Device Tree引发的BSP和驱动变更 常用OF API 总

zynq-Vivado HLS做的opencv IP核怎么在arm linux中编程使用?

问题描述 Vivado HLS做的opencv IP核怎么在arm linux中编程使用? 小弟本是做软件的,现在学习在Xilinx zynq中的opencv hls加速.官方的文档只找到怎么生成ip核和怎么集成到fpga中,并没有找到集成后怎么在软件中使用的指导.我做了xapp1167和xapp890的工程,想用xapp890的sobel核做个小demo,zc702trd中也已经集成了这个核,可是我就是不知道软件怎么编,一开始用opencv获取到图像后怎么传给ip核并触发其工作?请教有没有会的

如何在ARM linux嵌入式环境下配置Arduino的开发环境

问题描述 如何在ARM linux嵌入式环境下配置Arduino的开发环境 因为某些原因需要在ARM linux下设置一个arduino的开发环境,需要在获得代码之后将代码编译并且将代码下载到板子上.之前我有看到过arduino官网上有放出linux32 的源程序,不知道支不支持arm环境,还是要通过源代码编译文件后才能用? 解决方案 你改一下它的MakeFile,把gcc改成交叉编译试试~

eclipse + cdt + gdb 进行arm linux 交叉调试 (

原文:http://blog.chinaunix.net/space.php?uid=20671208&do=blog&id=1580649 eclipse + cdt + gdb 进行arm linux 交叉调试     如何使用eclipse进行嵌入式Linux的开发 习惯了在windows环境下开发的程序员在转到Linux平台时经常会抱怨没有一个好用的集成开发环境.和windows下常用的一些开发软件相比,Linux自带的一些开发环境使用起来要么界面和操作不够方便.友好,要么功能不全

php web 中文 乱吗-在linux系统中建立文件夹名为中文的如:”爱提问题“,怎么在web前台页面显示呢,一直乱码

问题描述 在linux系统中建立文件夹名为中文的如:"爱提问题",怎么在web前台页面显示呢,一直乱码 php处理函数mb_convert_encoding()和iconv()都不管用__ 解决方案 注意汉字编码,后天,前段编码格式要一致 解决方案二: http://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html 看看这个 解决方案三: 关键是你拼接产生的文件名要和整个html的编码匹配,否则肯定是乱码 参考:http:/

如何使arm linux下mjpg-streamer支持多摄像头

问题描述 如何使arm linux下mjpg-streamer支持多摄像头 tiny6410开发板,想要使用mjpg-streamer同时打开多个摄像头(两个就好),在网上很少有相关资料只是有人说需要做一些修改,有大神可以具体的指教一下么 解决方案 树莓派+mjpg-streamer+usb摄像头

嵌入式arm linux 下glibc 断言死机要怎么查?

嵌入式arm linux 下glibc 断言死机要怎么查? armv7  资源有限,用不了valgrind 工具.