计算机基本知识0.docx

上传人:b****1 文档编号:2393717 上传时间:2022-10-29 格式:DOCX 页数:36 大小:162.85KB
下载 相关 举报
计算机基本知识0.docx_第1页
第1页 / 共36页
计算机基本知识0.docx_第2页
第2页 / 共36页
计算机基本知识0.docx_第3页
第3页 / 共36页
计算机基本知识0.docx_第4页
第4页 / 共36页
计算机基本知识0.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

计算机基本知识0.docx

《计算机基本知识0.docx》由会员分享,可在线阅读,更多相关《计算机基本知识0.docx(36页珍藏版)》请在冰豆网上搜索。

计算机基本知识0.docx

计算机基本知识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个段描述符

   *虚拟地址的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1