s3c2410的MMU讲解
S3c2410总共有4种内存映射方式,分别是:
1.Fault (无映射)
2.Coarse Page (粗表)
3.Section (段)
4.Fine Page (细表)
我们以Section(段)进行说明。
ARM920T是一个32bit的CPU,它的虚拟地址空间为2^32=4G。而在Section模式,这4G的虚拟空间被分成一个一个称为段(Section)的单位(与我们上面讲的页在本质上其实是一致的),每个段的长度是1M (而我们之前所使用的页的长度是4K)。4G的虚拟内存总共可以被分成4096个段(1M4096=4G),因此我们必须用4096个描述符来对这组段进行描述,每个描述符占用4个Byte,故这组描述符的大小为16KB (4byte4096),这4096个描述符构为一个表格,我们称其为Tralaton Table.
一个描述符(32位)对应1M地址空间。
MMU 创建映射
void create_page_table(void)
{
unsigned long *ttb = (unsigned long *)0x20000000; //页表基地址
unsigned long vaddr, paddr;
vaddr = 0xA0000000; // 虚拟地址
paddr = 0xE0200000; //页表地址,存在内存里的
*(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC; // 虚拟地址映射 (>>20是1M的偏移)
vaddr = 0x20000000; //虚拟地址
paddr = 0x20000000; //物理地址,虚拟和物理地址一致
while (vaddr < 0x24000000)
{
*(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC_WB;
vaddr += 0x100000; //一页对应1M ,采用循环语句把64M映射好
paddr += 0x100000;
}
}