这种机制是纯粹的高速硬件操作,
并不需要操作系统来完成。
操作系统只要提供内存转换表
就可以了,但是需要符合一定的格式。
ARM9
的
MMU
映射表分为两种,一级页表的变换和二级页表变换。两者的不同之处就是实现
的变换地址空间大小不同。一级页表变换支持
1 M
大小的存储空间的映射,而二级可以支
持
64
kB
,
4
kB
和
1
kB
大小地址空间的映射。在
LINUX
中最终使用了
1
M
一级页表和
4
kB
的二级页表(即
1M
段区和
4KB
页面)
内核中地址转换表建立过程
地址转换表建立是和内核的启动一起完成的,页表的建立也可以分为三个阶段:
第一阶段是发生在内核解压缩、自引导时,也就内核镜像
zimage
的文件头部分。相关
代码从某种意义上来讲不属于内核,它是
BSP
代码中的一部分,是需要根据不同的架构来
分别实现的。
通过平面映射的方式建立了
256M
空间节描述表。
但是,
这个映射表是临时的,
是为了提高内核解压缩时的速度而实现的。
在解压缩结束之后,
进入内核代码之前,
MMU
功
能就被关闭了,随之的映射表也被废弃不用。
当
decompress_kernel
函数实现内核的解压缩之后,那么内核启动的第一阶段工作就
完成了。接下来就准备启动真正的内核,但是内核启动时必须要先关闭
MMU
,以至于刚才的
第一阶段映射表不能使用了。
第二阶段是的页表创建是非常关键的。
同样也是使用汇编语言来实现。
在代码中,
有个