📄 arm芯片s3c2410内存管理单元mmu基础实验 - china linux forum.htm
字号:
@计算返回地址 <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 < 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>>20)) = <BR>entry_index
|(0x03<<10)|(0<<5)|(1<<4)|(1<<3)|0x02; <BR>8
} <BR><BR>9 /*SFR*/ <BR>10 for(entry_index = 0x48000000; entry_index
< 0x60000000; <BR>entry_index += 0x100000){ <BR>11 /*section
table's entry:AP=0b11,domain=0,NCNB*/ <BR>12
*(mmu_tlb_base+(entry_index>>20)) = <BR>entry_index
|(0x03<<10)|(0<<5)|(1<<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>>20)) = <BR>(VECTORS_PHY_BASE)
|(0x03<<10)|(0<<5)|(1<<4)|(1<<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=&Board=embedded&main=586661&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> </TD>
<TD class=small align=right><A
href="http://www.linuxforum.net/forum/printthread.php?Cat=&Board=embedded&main=586661&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>平坦模式 </TD>
<TD class=navigation noWrap><A
href="http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=embedded&Number=586661&page=0&view=collapsed&sb=5&o=0&vc=1"><IMG
alt=树状模式,一封一封读
src="ARM芯片S3C2410内存管理单元MMU基础实验 - China Linux Forum.files/threaded.gif"
align=absMiddle border=0>树状模式</A>
</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> 社区公告栏<OPTION
value=uglyduck> 社区服务台<OPTION
value=linuxnews> 业界新闻与评论<OPTION
value=linuxtalk> 自由软件杂谈<OPTION
value=software> Linux软件快递<OPTION
value=Tworkshop> 翻译作坊<OPTION
value=tcl> Linux图书与评论<OPTION
value=job> 招聘和求职<OPTION value=-CATJUMP-2>*Linux
桌面与办公自动化* -----<OPTION value=vim> GNU
Emacs/XEmacs<OPTION value=chinese> Linux
中文环境和中文化<OPTION value=office> Linux桌面与办公软件<OPTION
value=game> Linux 多媒体与娱乐版<OPTION
value=mozilla> 自由之窗Mozilla<OPTION
value=laptop> 笔记本电脑上的Linux<OPTION
value=-CATJUMP-3>*Linux 入门及网络应用* -----<OPTION
value=gentoo> Gentoo<OPTION
value=debian> Debian 一族<OPTION
value=nm> 网络管理技术<OPTION
value=newbie> Linux 安装与入门<OPTION
value=web> WEB服务器和FTP服务器<OPTION
value=dns> 域名服务器和邮件服务器<OPTION
value=proxy> Linux防火墙和代理服务器应用<OPTION
value=samba> 文件及打印服务器<OPTION
value=training> 技术培训与认证<OPTION value=-CATJUMP-4>*Linux
高级应用* -----<OPTION value=linuxK> Linux内核技术<OPTION
value=embedded selected> Linux 嵌入技术<OPTION
value=driver> Linux设备驱动程序<OPTION
value=cluster> Linux 集群技术<OPTION
value=db> LINUX平台数据库<OPTION
value=security> 系统和网络安全<OPTION
value=cpu> CPU 与 编译器<OPTION
value=school> 系统计算研究所专栏<OPTION value=-CATJUMP-5>*Linux
环境下的程序设计* -----<OPTION
value=kylix> Linux下的GUI软件开发<OPTION
value=program> C/C++编程版<OPTION
value=php3> PHP 技 术<OPTION
value=java> Java&jsp技术<OPTION
value=vrml> Shell编程技术<OPTION
value=perl> Perl 编 程<OPTION
value=python> Python 编 程<OPTION
value=xml> XML/Web Service 技术<OPTION
value=-CATJUMP-6>*永远的 UNIX* -----<OPTION
value=unix> 永远的Unix<OPTION
value=bsd> FreeBSD世界<OPTION value=-CATJUMP-7>*IT 人生*
-----<OPTION value=life> 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 + -