计算机基本知识0.docx
- 文档编号:2393717
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:36
- 大小:162.85KB
计算机基本知识0.docx
《计算机基本知识0.docx》由会员分享,可在线阅读,更多相关《计算机基本知识0.docx(36页珍藏版)》请在冰豆网上搜索。
计算机基本知识0
计算机基本知识标签:
MMU
MMU工作原理
1.MMU的工作原理我这里就不阐述了。
网上有篇关于S3C2410MMU的讲解,很详细。
我就看了韦东山大哥的书的实验代码就写一些体会,并把源代码发出来。
具体的代码如下:
////////////////////////////////////head.S//////////////////////////////////////////////////////////////////////
@*************************************************************************
@File:
head.S
@功能:
设置SDRAM,将第二部分代码复制到SDRAM,设置页表,启动MMU,
@ 然后跳到SDRAM继续执行
@*************************************************************************
.text
.global_start
_start:
ldrsp,=4096 @设置栈指针,以下都是C函数,调用前需要设好栈
bldisable_watch_dog @关闭WATCHDOG,否则CPU会不断重启
blmemsetup @设置存储控制器以使用SDRAM
blcopy_2th_to_sdram @将第二部分代码复制到SDRAM
blcreate_page_table @设置页表
blmmu_init @启动MMU
ldrsp,=0xB4000000 @重设栈指针,指向SDRAM顶端(使用虚拟地址)
ldrpc,=0xB0004000 @跳到SDRAM中继续执行第二部分代码
halt_loop:
b halt_loop
//////////////////////////////////init.c//////////////////////////////////////////////
/*
*init.c:
进行一些初始化,在Steppingstone中运行
*它和head.S同属第一部分程序,此时MMU未开启,使用物理地址
*/
/*WATCHDOG寄存器*/
#defineWTCON (*(volatileunsignedlong*)0x53000000)
/*存储控制器的寄存器起始地址*/
#defineMEM_CTL_BASE 0x48000000
/*
*关闭WATCHDOG,否则CPU会不断重启
*/
voiddisable_watch_dog(void)
{
WTCON=0;//关闭WATCHDOG很简单,往这个寄存器写0即可
}
/*
*设置存储控制器以使用SDRAM
*/
voidmemsetup(void)
{
/*SDRAM13个寄存器的值*/
unsignedlongconst mem_cfg_val[]={0x22011110, //BWSCON
0x00000700, //BANKCON0
0x00000700, //BANKCON1
0x00000700, //BANKCON2
0x00000700, //BANKCON3
0x00000700, //BANKCON4
0x00000700, //BANKCON5
0x00018005, //BANKCON6
0x00018005, //BANKCON7
0x008C07A3, //REFRESH
0x000000B1, //BANKSIZE
0x00000030, //MRSRB6
0x00000030, //MRSRB7
};
int i=0;
volatileunsignedlong*p=(volatileunsignedlong*)MEM_CTL_BASE;
for(;i<13;i++)
p[i]=mem_cfg_val[i];
}
/*
*将第二部分代码复制到SDRAM,32位CPU的虚拟地址空间达到4GB。
一级页表中使用4096个描述服来表示4GB空间,则每个描述符对应1MB的虚拟地址,每个描述符占用4字节,所以一级页表占16KB。
所以SDRAM的16k来存放一级页表,所以剩下的内存开始物理地址为0x30004000.
*/
voidcopy_2th_to_sdram(void)
{
unsignedint*pdwSrc=(unsignedint*)2048;
unsignedint*pdwDest=(unsignedint*)0x30004000;
while(pdwSrc<(unsignedint*)4096)
{
*pdwDest=*pdwSrc;
pdwDest++;
pdwSrc++;
}
}
/*
*设置页表,这个函数就是创建页表的过程。
页表里存放是虚拟地址对应的物理地址,CPU处理
*一个虚拟地址,是通过MMU来进行转换,也就是在相应的页表里找到对应的物理地址,我们就是需要创建*这个页表,具体参看S3C2410MMU这篇文章。
很详细!
!
!
*/
voidcreate_page_table(void)
{
/*
*用于段描述符的一些宏定义
*/
#defineMMU_FULL_ACCESS (3<<10) /*访问权限*/
#defineMMU_DOMAIN (0<<5) /*属于哪个域*/
#defineMMU_SPECIAL (1<<4) /*必须是1*/
#defineMMU_CACHEABLE (1<<3) /*cacheable*/
#defineMMU_BUFFERABLE (1<<2) /*bufferable*/
#defineMMU_SECTION
(2) /*表示这是段描述符*/
#defineMMU_SECDESC (MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|\
MMU_SECTION)
#defineMMU_SECDESC_WB (MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|\
MMU_CACHEABLE|MMU_BUFFERABLE|MMU_SECTION)
#defineMMU_SECTION_SIZE 0x00100000
unsignedlongvirtuladdr,physicaladdr;
unsignedlong*mmu_tlb_base=(unsignedlong*)0x30000000;
/*
*Steppingstone的起始物理地址为0,第一部分程序的起始运行地址也是0,
*为了在开启MMU后仍能运行第一部分的程序,
*将0~1M的虚拟地址映射到同样的物理地址
*/
virtuladdr=0;
physicaladdr=0;
*(mmu_tlb_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|\
MMU_SECDESC_WB;
//从SDRAM的开始存放页表,将虚拟地址0对应的物理地址0的页表创建好,当我们以后对这个虚拟地址操作的时候,MMU可以为我们在这个页表也找到相应的物理地址。
/*
*0x56000000是GPIO寄存器的起始物理地址,
*GPBCON和GPBDAT这两个寄存器的物理地址0x56000010、0x56000014,
*为了在第二部分程序中能以地址0xA0000010、0xA0000014来操作GPBCON、GPBDAT,
*把从0xA0000000开始的1M虚拟地址空间映射到从0x56000000开始的1M物理地址空间
*/
virtuladdr=0xA0000000;
physicaladdr=0x56000000;
*(mmu_tlb_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|\
MMU_SECDESC;
/*
*SDRAM的物理地址范围是0x30000000~0x33FFFFFF,
*将虚拟地址0xB0000000~0xB3FFFFFF映射到物理地址0x30000000~0x33FFFFFF上,
*总共64M,涉及64个段描述符
*虚拟地址的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 基本知识