⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm芯片s3c2410内存管理单元mmu基础实验 - china linux forum.htm

📁 ARM芯片S3C2410内存管理单元MMU基础实验及源代码
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            @计算返回地址 <BR>41 stmdb sp!, { r0-r12,lr } @保存使用到的寄存器 <BR><BR>42 ldr 
            lr, =int_return @设置返回地址 <BR>43 ldr pc,=EINT_Handle 
            @调用中断处理函数,在interrupt.c中 <BR>44 int_return: <BR>45 ldmia sp!, { 
            r0-r12,pc }^ @中断返回, <BR>@^表示将spsr的值复制到cpsr 
            <BR><BR>请注意第12、15行,我们将IRQ中断向量由以前的“b HandleIRQ”换成了: <BR>12 ldr pc, 
            HandleIRQAddr <BR>15 HandleIRQAddr: <BR>16 .long HandleIRQ 
            <BR>这是因为b跳转指令只能前后跳转32M的范围,而本实验中中断向量将重新放在VA=0xffff0000开始处(而不是通常的0x00000000),到HandleIRQAddr的距离远远超过了32M。将中断向量重新定位在0xffff0000处,是因为MMU使能后,中断发生时: 
            <BR>1、如果中断向量放在0x00000000处,则对于不同的进程(PID),中断向量的MVA将不同 
            <BR>2、如果中断向量放在0xffff0000处,则对于不同的进程(PID),中断向量的MVA也相同 
            <BR>显然,如果使用1,则带来的麻烦非常大——对于每个进程,都得设置自己的中断向量。所以MMU使能后,处理中断的方法应该是2。 
            <BR><BR>第22行copy_vectors_from_nand_to_sdram函数将中断向量复制到内存物理地址0x33ff0000处,在mmu_tlb_init函数中会把0x33ff0000影射为虚拟地址0xffff0000。 
            <BR>第23行copy_process_from_nand_to_sdram函数将存在nand 
            flash开头的4K代码全部复制到0x30004000处(本实验的连接地址为0x30004000)。请注意SDRAM起始地址为0x30000000,前面的16K空间用来存放一级页表(在mmu_tlb_init中设置)。 
            <BR>第27行mmu_tlb_init函数设置页表。本实验以段的方式使用内存,所以仅使用一级页表,且页表中所有页表项均为段描述符。 
            <BR>mmu_tlb_init代码(在mmu.c中)如下: <BR>1 void mmu_tlb_init() <BR>2 { 
            <BR>3 unsigned long entry_index; <BR><BR>4 /*SDRAM*/ <BR>5 
            for(entry_index = 0x30000000; entry_index &lt; 0x34000000; 
            <BR>entry_index+=0x100000){ <BR>6 /*section table's 
            entry:AP=0b11,domain=0,Cached,write-through mode(WT)*/ <BR>7 
            *(mmu_tlb_base+(entry_index&gt;&gt;20)) = <BR>entry_index 
            |(0x03&lt;&lt;10)|(0&lt;&lt;5)|(1&lt;&lt;4)|(1&lt;&lt;3)|0x02; <BR>8 
            } <BR><BR>9 /*SFR*/ <BR>10 for(entry_index = 0x48000000; entry_index 
            &lt; 0x60000000; <BR>entry_index += 0x100000){ <BR>11 /*section 
            table's entry:AP=0b11,domain=0,NCNB*/ <BR>12 
            *(mmu_tlb_base+(entry_index&gt;&gt;20)) = <BR>entry_index 
            |(0x03&lt;&lt;10)|(0&lt;&lt;5)|(1&lt;&lt;4)| 0x02; <BR>13 } 
            <BR><BR>14 /*exception vector*/ <BR>15 /*section table's 
            entry:AP=0b11,domain=0,Cached,write-through mode(WT)*/ <BR>16 
            *(mmu_tlb_base+(0xffff0000&gt;&gt;20)) = <BR>(VECTORS_PHY_BASE) 
            |(0x03&lt;&lt;10)|(0&lt;&lt;5)|(1&lt;&lt;4)|(1&lt;&lt;3)|0x02; 
            <BR>17 } <BR>第4-8行令64M 
            SDRAM的虚拟地址和物理地址相等——从0x30000000到0x33ffffff,这样可以使得在head.s中第28行调用mmu_init使能MMU前后的地址一致。 
            <BR>第9-13行设置特殊功能寄存器的虚拟地址,也让它们的虚拟地址和物理地址相等——从0x48000000到0x5fffffff。并且不使用cache和write 
            buffer。 <BR>第14-17行设置中断向量的虚拟地址,虚拟地址0xfff00000对应物理地址0x33f00000。 
            <BR><BR>回到head.s中第28行,调用mmu.c中的mmu_init函数使能MMU,此函数代码为: <BR>1 void 
            mmu_init() <BR>2 { <BR>3 unsigned long ttb = MMU_TABLE_BASE; 
            <BR><BR>4 __asm__( <BR>5 "mov r0, #0\n" <BR>6 /* invalidate I,D 
            caches on v4 */ <BR>7 "mcr p15, 0, r0, c7, c7, 0\n" <BR><BR>8 /* 
            drain write buffer on v4 */ <BR>9 "mcr p15, 0, r0, c7, c10, 4\n" 
            <BR><BR>10 /* invalidate I,D TLBs on v4 */ <BR>11 "mcr p15, 0, r0, 
            c8, c7, 0\n" <BR><BR>12 /* Load page table pointer */ <BR>13 "mov 
            r4, %0\n" <BR>14 "mcr p15, 0, r4, c2, c0, 0\n" <BR><BR>15 /* Write 
            domain id (cp15_r3) */ <BR>16 "mvn r0, #0\n" 
            /*0b11=Manager,不进行权限检查*/ <BR>17 "mcr p15, 0, r0, c3, c0, 0\n" 
            <BR><BR>18 /* Set control register v4 */ <BR>19 mrc p15, 0, r0, c1, 
            c0, 0\n" <BR><BR>20 /* Clear out 'unwanted' bits */ <BR>21 "ldr r1, 
            =0x1384\n" <BR>22 "bic r0, r0, r1\n" <BR><BR>23 /* Turn on what we 
            want */ <BR>24 /*Base location of exceptions = 0xffff0000*/ <BR>25 
            "orr r0, r0, #0x2000\n" <BR>26 /* Fault checking enabled */ <BR>27 
            "orr r0, r0, #0x0002\n" <BR>28 #ifdef CONFIG_CPU_D_CACHE_ON /*is not 
            set*/ <BR>29 "orr r0, r0, #0x0004\n" <BR>30 #endif <BR>31 #ifdef 
            CONFIG_CPU_I_CACHE_ON /*is not set*/ <BR>32 "orr r0, r0, #0x1000\n" 
            <BR>33 #endif <BR>34 /* MMU enabled */ <BR>35 "orr r0, r0, 
            #0x0001\n" <BR><BR>36 /* write control register *//*write control 
            register P545*/ <BR>37 "mcr p15, 0, r0, c1, c0, 0\n" <BR>38 : /* no 
            outputs */ <BR>39 : "r" (ttb) ); <BR>40 } 
            <BR><BR>此函数使用嵌入汇编的方式,第29行的"r" 
            (ttb)表示变量ttb的值赋给一个寄存起作为输入参数,这个寄存器由编译器自动分配;第13行的“%0”表示这个寄存器。MMU控制寄存器C1中各位的含义(第18-37行),可以参考539页“Table 
            2-10. Control Register 1-bit 
            Functions”。如果想详细了解本函数用到的操作协处理器的指令,可以参考数据手册529页“Appendix 2 
            PROGRAMMER'S MODEL”。 
            <BR>本实验代码在CLOCK目录下,运行make命令后将可执行文件mmu下载、运行。然后将mmu.h文件中如下两行的注释去掉,重新make后下载运行mmu,可以发现LED闪烁的速度变快了很多——这是因为使用了cache(见上面代码28-33行): 
            <BR>#define CONFIG_CPU_D_CACHE_ON 1 <BR>#define 
            CONFIG_CPU_I_CACHE_ON 1 
            <BR><BR><BR><BR>--------------------<BR>代理www.hfrk.com S3C2410开发板 
            <BR>提供嵌入式技术支持 
            <P class=small>文章选项: <A 
            href="http://www.linuxforum.net/forum/printthread.php?Cat=&amp;Board=embedded&amp;main=586661&amp;type=post" 
            target=_blank><IMG alt=打印 
            src="ARM芯片S3C2410内存管理单元MMU基础实验 - China Linux Forum.files/print.gif" 
            align=absMiddle border=0></A> 
</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=4 width="95%" align=center border=0>
  <TBODY>
  <TR>
    <TD class=small align=left>&nbsp; </TD>
    <TD class=small align=right><A 
      href="http://www.linuxforum.net/forum/printthread.php?Cat=&amp;Board=embedded&amp;main=586661&amp;type=thread" 
      target=_blank><IMG 
      src="ARM芯片S3C2410内存管理单元MMU基础实验 - China Linux Forum.files/printthread.gif" 
      align=top border=0> 打印</A> </TD></TR></TBODY></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
  <TBODY>
  <TR>
    <TD class=tableborders>
      <TABLE cellSpacing=1 cellPadding=3 width="100%" border=0>
        <TBODY>
        <TR class=darktable>
          <TD align=right>
            <TABLE border=0>
              <TBODY>
              <TR>
                <TD class=navigation noWrap><IMG alt=* 
                  src="ARM芯片S3C2410内存管理单元MMU基础实验 - China Linux Forum.files/greyflat.gif" 
                  align=absMiddle>平坦模式&nbsp; </TD>
                <TD class=navigation noWrap><A 
                  href="http://www.linuxforum.net/forum/showthreaded.php?Cat=&amp;Board=embedded&amp;Number=586661&amp;page=0&amp;view=collapsed&amp;sb=5&amp;o=0&amp;vc=1"><IMG 
                  alt=树状模式,一封一封读 
                  src="ARM芯片S3C2410内存管理单元MMU基础实验 - China Linux Forum.files/threaded.gif" 
                  align=absMiddle border=0>树状模式</A>&nbsp; 
        </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
  <TBODY>
  <TR>
    <TD align=right>
      <FORM action=http://www.linuxforum.net/forum/jumper.php method=post><INPUT 
      type=hidden name=Cat> <SPAN class=onbody>前往讨论区 </SPAN><SELECT 
      class=formboxes name=board> <OPTION value=-CATJUMP-1>*Linux 社区和文化* 
        -----<OPTION value=new>&nbsp;&nbsp;&nbsp;社区公告栏<OPTION 
        value=uglyduck>&nbsp;&nbsp;&nbsp;社区服务台<OPTION 
        value=linuxnews>&nbsp;&nbsp;&nbsp;业界新闻与评论<OPTION 
        value=linuxtalk>&nbsp;&nbsp;&nbsp;自由软件杂谈<OPTION 
        value=software>&nbsp;&nbsp;&nbsp;Linux软件快递<OPTION 
        value=Tworkshop>&nbsp;&nbsp;&nbsp;翻译作坊<OPTION 
        value=tcl>&nbsp;&nbsp;&nbsp;Linux图书与评论<OPTION 
        value=job>&nbsp;&nbsp;&nbsp;招聘和求职<OPTION value=-CATJUMP-2>*Linux 
        桌面与办公自动化* -----<OPTION value=vim>&nbsp;&nbsp;&nbsp;GNU 
        Emacs/XEmacs<OPTION value=chinese>&nbsp;&nbsp;&nbsp;Linux 
        中文环境和中文化<OPTION value=office>&nbsp;&nbsp;&nbsp;Linux桌面与办公软件<OPTION 
        value=game>&nbsp;&nbsp;&nbsp;Linux 多媒体与娱乐版<OPTION 
        value=mozilla>&nbsp;&nbsp;&nbsp;自由之窗Mozilla<OPTION 
        value=laptop>&nbsp;&nbsp;&nbsp;笔记本电脑上的Linux<OPTION 
        value=-CATJUMP-3>*Linux 入门及网络应用* -----<OPTION 
        value=gentoo>&nbsp;&nbsp;&nbsp;Gentoo<OPTION 
        value=debian>&nbsp;&nbsp;&nbsp;Debian 一族<OPTION 
        value=nm>&nbsp;&nbsp;&nbsp;网络管理技术<OPTION 
        value=newbie>&nbsp;&nbsp;&nbsp;Linux 安装与入门<OPTION 
        value=web>&nbsp;&nbsp;&nbsp;WEB服务器和FTP服务器<OPTION 
        value=dns>&nbsp;&nbsp;&nbsp;域名服务器和邮件服务器<OPTION 
        value=proxy>&nbsp;&nbsp;&nbsp;Linux防火墙和代理服务器应用<OPTION 
        value=samba>&nbsp;&nbsp;&nbsp;文件及打印服务器<OPTION 
        value=training>&nbsp;&nbsp;&nbsp; 技术培训与认证<OPTION value=-CATJUMP-4>*Linux 
        高级应用* -----<OPTION value=linuxK>&nbsp;&nbsp;&nbsp;Linux内核技术<OPTION 
        value=embedded selected>&nbsp;&nbsp;&nbsp;Linux 嵌入技术<OPTION 
        value=driver>&nbsp;&nbsp;&nbsp;Linux设备驱动程序<OPTION 
        value=cluster>&nbsp;&nbsp;&nbsp;Linux 集群技术<OPTION 
        value=db>&nbsp;&nbsp;&nbsp;LINUX平台数据库<OPTION 
        value=security>&nbsp;&nbsp;&nbsp;系统和网络安全<OPTION 
        value=cpu>&nbsp;&nbsp;&nbsp;CPU 与 编译器<OPTION 
        value=school>&nbsp;&nbsp;&nbsp;系统计算研究所专栏<OPTION value=-CATJUMP-5>*Linux 
        环境下的程序设计* -----<OPTION 
        value=kylix>&nbsp;&nbsp;&nbsp;Linux下的GUI软件开发<OPTION 
        value=program>&nbsp;&nbsp;&nbsp;C/C++编程版<OPTION 
        value=php3>&nbsp;&nbsp;&nbsp;PHP 技 术<OPTION 
        value=java>&nbsp;&nbsp;&nbsp;Java&amp;jsp技术<OPTION 
        value=vrml>&nbsp;&nbsp;&nbsp;Shell编程技术<OPTION 
        value=perl>&nbsp;&nbsp;&nbsp;Perl 编 程<OPTION 
        value=python>&nbsp;&nbsp;&nbsp;Python 编 程<OPTION 
        value=xml>&nbsp;&nbsp;&nbsp;XML/Web Service 技术<OPTION 
        value=-CATJUMP-6>*永远的 UNIX* -----<OPTION 
        value=unix>&nbsp;&nbsp;&nbsp;永远的Unix<OPTION 
        value=bsd>&nbsp;&nbsp;&nbsp;FreeBSD世界<OPTION value=-CATJUMP-7>*IT 人生* 
        -----<OPTION value=life>&nbsp;&nbsp;&nbsp;IT 人生</OPTION></SELECT> <INPUT class=buttons type=submit value=出发 name=Jump> 
</FORM></TD></TR></TBODY></TABLE>
<P>
<TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
  <TBODY>
  <TR>
    <TD class=tableborders>
      <TABLE cellSpacing=1 cellPadding=3 width="100%" border=0>
        <TBODY>
        <TR class=darktable>
          <TD>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD align=left><A 
                  href="mailto:david99deng%20at%20yahoo.com">Contact Us</A> </TD>
                <TD align=right><A 
                  href="http://www.linuxforum.net/">LINUXFORUM.NET</A> 
              </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -