Linux启动之初,内核为自己建立的是段式内存映射,而不是页式映射。
映射表(PGD)从虚拟地址0xc0004000开始,每项4字节,每项对应1M内存空间,每项的高12位就是这1M内存的高12位地址。
一开始,内核不会为所有内存建立映射,只会映射必要的一部分,这部分代码在arch/arm/kernel/head.S中由汇编代码完成。
以S3C6410为例,下面是在刚刚进入start_kernel()后打印出来的一段内核映射表。注意内核自身的映射表项是从0xc0007000地址开始。因为从0xc0004000开始的是整个4G空间的表,内核内存只占最高的那1G,所以要加一个偏移量:3G/1M * 4bytes = 0x3000。
c0007000: 0e 0c 00 50 0e 0c 10 50 0e 0c 20 50 00 00 00 00
c0007010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0007020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0007030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
由于字节序的原因,上面的每一个表项应该颠倒一下顺序来看,以第一项为例,应该是:
50 00 0c 0e
高12位地址是0x500,因为s3c6410的内存物理地址就是从0x50000000开始。
启动到C函数start_kernel()之后,在arch_setup()中会重写映射表,映射所有内存。这时的页表会如下所示:
c0007000: 0e 04 00 50 0e 04 10 50 0e 04 20 50 0e 04 30 50
c0007010: 0e 04 40 50 0e 04 50 50 0e 04 60 50 0e 04 70 50
c0007020: 0e 04 80 50 0e 04 90 50 0e 04 a0 50 0e 04 b0 50
c0007030: 0e 04 c0 50 0e 04 d0 50 0e 04 e0 50 0e 04 f0 50
......
注意,每一个表项的最后两个bit指明了映射方式,00表示段式映射。在内存重新映射之后,这一映射方式并没有变化。
再来看一段应该程序的pgd表内容,这段内容是从其pgd表开始位置打印的,所以是为用户程序虚拟进程空间建立的映射:
c0d98000: 31 c8 d8 50 31 cc d8 50 00 00 00 00 00 00 00 00
c0d98010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0d98020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0d98030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
可以看到,表项最后两位是01,这已经是二级页式映射了。
这说明,尽管内核为应用程序建立的是二级粗粒度页式映射,但Linux内核自身一直是运行在段映射模式下。两种映射在同一张pgd表里面可以同时使用,映射方式不必全表统一。
关键字:Arm Linux 内核页表 段式映射
引用地址:
Arm Linux 内核页表的段式映射
推荐阅读最新更新时间:2024-03-16 14:58
意法半导体STM32系列两周年再添新丁
意法半导体在STM32系列微控制器两周年生日之时,宣布基于ARM Cortex™-M3处理器的STM32互联系列(Connectivity Line)微控制器已全面投产,新产品如预期准时上市。自此,意法半导体STM32家族已拥有包括基本型、USB基本型、增强型以及互联型四个产品线,70个型号的产品引脚与功能相互兼容。 STM32互联系列让设计人员可以在同时需要以太网、USB、CAN和音频级I2S接口的产品设计中发挥工业标准的32位微处理器的优异性能。目前互联系列下设两个产品系列:STM32F105和 STM32F107。STM32F105系列集成一个全速USB 2.0 Host/Device/OTG接口和两个具有先进
[单片机]
MDK-ARM(Keil uVision V4.72)上STM32开发环境配置
以前我都是在Eclipse上面和arm-none-eabi交叉编译环境来开发STM32应用程序的。 现在改用MDK-ARM比较专业的工具搭建一个开发环境。 新建一个指定STM32微控制器型号的工程: 为了生成编译文件,勾选如下复选框: 配置编译项: STM32F4XX, USE_STDPERIPH_DRIVER 添加库编译符号,和语言/代码生成级别 其中最关键的头文件包含目录: 首先要添加包含工程目录,因为固件库会查找 stm32f4xx_conf.h 配置头文件,中断服务例程实现文件可能也会调用main.h中的函数。 再添加包含 xxxySTM32F4_LibLibrariesCMSISIn
[单片机]
快速学Arm(28)--存储器寻址
介绍一下LPC2300系列的存储器大小情况,看下面的表: 其中Flash为128Bit宽,可以用于代码和数据的存储,并具有预取指和缓冲技术.文档里介绍Flash为128bit宽,但我理解,其地址排列依然是按byte来进行的. 片内Flash编程方法有以下几种 1.使用JTAG方正/调试器,通过芯片的JTAG接口下载程序. 2.使用系统编程技术(即ISP),通过芯片的UART0接口下载程序. 3.使用应用编程技术(即IAP),在用户程序运行时对Flash进行擦除和/或编程操作,实现数据的存储和固件的现场升级. 对于片内的静态RAM来讲.尽管SRAM的读写速度非常快,但是相对于ARM内核类说速度还是不够,这就有可能
[单片机]
学习嵌入式ARM的步骤--对初学者
看到很多 arm的论坛里有 很多 人想学arm,但不知如何去学~现在我就 列出一下学习这方面的步骤-----基于linux系统的,还有哪位大侠觉得步骤与方法不对,请及时纠正 学习步骤如下:(一步步来哦:) 1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务 能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务 安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件?? 使用其他编辑器?? 2、S
[单片机]
基于arm920T嵌入式Linux的实验平台环境的构建
面向A R M微处理器构架的嵌入式操作系统的使用量这些年持续增长,在各种嵌入式操作系统中, L inux是获得支持最多的第三大力量。 目前,ARM L inux支持包括ARM610、A RM710、ARM720T cores、ARM920T cores、StrongARM 110、StrongARM1100、XScale等系列的arm处理器。 Gameboy是目前比较流行的8位掌上游戏机,通常被简称为GB,它的最终态Game Boy Color (GBC)是完全向后兼容的。Gnuboy是GB /GBC的软件模拟器,是一种自由软件,它是基于Qt系统的,能够运行几乎所有的黑白和彩色的GB /GBC游戏ROM,但运行复杂
[单片机]
详解嵌入式Linux的USB驱动设计
随着计算机外围硬件的扩展,各种外围设备使用不同的总线接口,导致计算机外部各种总线繁多,管理困难,USB总线可以解决这些问题,因此而诞生。USB总线提供统一的外设的接口方式,并且支持热插拔,方便了厂商开发设备和用户使用设备。USB(通用串行总线)是由Microsft,Compad,Inter和NEC等推出的外围总线接口,目前已发展到2.0标准最高支持480Mb/s的速率,最多可以支持127个外设。 嵌入式Linux是一款源代码完全免费的新兴操作系统,用户可以用户可以通过网络等其他途径免费获得,并可以任意修改其源代码,这是其他的操作系统做不到的。正是由于这一点,Linux得到了广泛的应用。
1 Linux中USB
[嵌入式]
嵌入式arm学习总结(八)--存储知识-基于MINI244
MINI2440 ram:4k , rom:没有 程序运行:sdram ,norflash 程序存放:nandflash,norflash nandflash和norflash最大区别:norflash可以片上运行程序(并行总线,引脚多),nandflash不能(串行总线,引脚少) 通常linux操作系统存放在nandflash里面 nandflash启动模式:开发板上电时,nandflash控制器把前4K代码复制到2440的内部4ksram中,然后通过硬件机制把2440内部4ksram地址映射到为0的地址开始,程序开始执行这4k代码 这4k代码包含功能:初始化sdram,复制nandflash中的代码到sdram中,然后跳
[单片机]