博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mmu页表机制
阅读量:3558 次
发布时间:2019-05-20

本文共 1090 字,大约阅读时间需要 3 分钟。

给个链接


1. 段, 大页, 小页, 极小页的划分

     4种映射长度:段(1MB)、大页(64KB)、小页(4KB)、极小页(1KB)。

 

ok, 以这个为前提, 我们设计mmu 两级页表的方式。


假设, 需要寻址 0x12345678这个虚拟地址。

已知它对应的页是0x56789000页,  即真实的物理地址为0x56789678。

我们考虑二级页表该如何设计。

以二级页表方式寻址。

将0~4G空间 4K 一页为单位, 分成1024*1024个页。

256个页组成1M 称之为段。(Section)

4K 的大小为0x0 1000

1M 的大小为0x10 0000

 

4K 一页, 分页后

0x0000 0000

0x0000 1000

0x0000 2000

0x0000 3000

....

 

1M 一段, 分段后

0x0000 0000

0x0010 0000

0x0020 0000

0x0030 0000

0x0040 0000

....

 

共计4096个段, 

故虚拟地址前12字节, 0x123 可以作为段的寻址序号。

即以及页表的第0x123个就是我要找的段地址页表。

 

这个页表在哪里,  首先需要找到段页表地址的基地址, 这个存在cp15协处理器的某个寄存器中(忘记是C1还是C2啥的了)

ok, 读取段页表基地址, 假设是0xC100 0000, 其中每个页表项是32位整数, 即4byte

所以, 寻找到第0x123个页表项, 地址为 0xC100  0| 0100 | 1000 | 1100, 即为 0xC100 048C

ok, 找到一级段地址页表项了。 我们就能找到实际的映射的段物理地址了。 是的0xC100 048C中存放的32位数中,

我们想想这个32位段页表项该存放写什么??

没错, 要存放二级页表的基地址。 假设是0xC300 0000....

ok, 二级页表项的具体位置该如何明确呢??


先说结论, 虚拟地址的第12位到第19位这8位数据就是页表项的序号。

1). 二级页表应该有256个。

2). 前12位0x123为段地址的序号。

3). 中间8位0x45是页表项的序号。

     中间8位数字, 刚好可以表示0x00 ~ 0xFF共256个页表项目的序号


ok, 我们找到0xC300 0000的第0x45号页表项。

里面存放这最终的物理页地址。即0x56789000页, 该页表的基地址为就是0x56789

总共5字节,  即20位数据。


ok, 最后12位数据为真实的页偏移地址/序列号。

故拼接最终的物理地址, 0x56789678。


寻址成功。

转载地址:http://opcrj.baihongyu.com/

你可能感兴趣的文章
Java基础入门 Math类
查看>>
Java基础入门 Random类
查看>>
Java基础入门 Date类
查看>>
Java基础入门 Calendar类
查看>>
Java基础入门 DateFormat类
查看>>
Java基础入门 Window类及Panel类
查看>>
Java基础入门 AWT事件处理
查看>>
Java基础入门 鼠标事件
查看>>
Java基础入门 键盘事件
查看>>
Java基础入门 GridLayout
查看>>
JavaEE Bean的两种常用作用域 singleton(单例)和prototype(原型)
查看>>
MySQL 数据库索引
查看>>
JavaEE Spring与MyBatis的整合之传统DAO方式整合(教材学习笔记)
查看>>
JavaEE MyBatis与Spring的整合——基于mapper接口方式开发(教材学习笔记)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(五)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(六)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(七)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(八)
查看>>
Java发送邮件 注册成功发送邮件
查看>>
Mybatis的简单使用(增删改查),解决数据库字段名和实体类映射属性名不一致的问题
查看>>