跟着韦老师学Linux学习笔记(三)-MMU

(1)、MMU介绍

a、权限管理

不同地址空间的程序是无法相互访问的,否则会发生错误。

b、地址映射

    老师在视频中关于MMU讲解不是很多,要求也只是了解MMU这个概念就行了,可以参考书上或者下面这个文章了解MMU

http://www.cnblogs.com/bigbear1385/p/5325344.html

      1、  建立表格,就是建立虚拟地址到物理地址的映射

      2、  把表格地址告诉MMU

      3、  启动MMU

(2)、程序代码

首先我们看汇编代码,因为我们的主要程序都在汇编代码里面了。

.text
.global _start
_start:
    ldr sp, =4096                       @ 设置栈指针,以下都是C函数,调用前需要设好栈
    bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启
    bl  memsetup                        @ 设置存储控制器以使用SDRAM
    bl  copy_2th_to_sdram               @ 将第二部分代码复制到SDRAM
    bl  create_page_table               @ 设置页表
    bl  mmu_init                        @ 启动MMU
    ldr sp, =0xB4000000                 @ 重设栈指针,指向SDRAM顶端(使用虚拟地址)
    ldr pc, =0xB0004000                 @ 跳到SDRAM中继续执行第二部分代码
    @ ldr pc, =main
halt_loop:
    b   halt_loop

ldr sp, =4096

bl  disable_watch_dog

bl  memsetup

这三句代码和前几集课的功能是一样的,设置栈、关看门狗、初始化SDRAM。

接下来是拷贝代码到SDRAM里面去,这个代码和之前不太一样,需要涉及到连接脚本的内容。

1 firtst    0x00000000 : { head.o init.o }
2
3 second    0xB0004000 : AT(2048) { leds.o }

首先第一段代码是从0x00000000开始的执行的没问题,但是我们的主函数的代码的地址是被放在了2048,并重定位地址为0xB0004000(这个是虚拟地址,在后面需要把它映射到一个物理地址上去)。

 1 void copy_2th_to_sdram(void)
 2 {
 3     unsigned int *pdwSrc  = (unsigned int *)2048;
 4     unsigned int *pdwDest = (unsigned int *)0x30004000;
 5
 6     while (pdwSrc < (unsigned int *)4096)
 7     {
 8         *pdwDest = *pdwSrc;
 9         pdwDest++;
10         pdwSrc++;
11     }
12 }

这段代码是拷贝第二段代码到SDRAM里面去,因为第二段代码是从个2048开始的,并且我们的内部RAM只有4096,所以我们把从2048到4096的代码全部拷贝到0x30004000处。并留出0x30000000~0x30004000的地址空间用来存放一级页表的设置内容,一级页表的基地址就是0x30000000。

设置页表:

1     virtuladdr = 0;
2     physicaladdr = 0;
3     *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | 4                                             MMU_SECDESC_WB;

这几句代码是把物理地址起始位置为0的1M地址空间映射到虚拟地址的起始地址位0的1M地址空间去。

目的是为了在开启MMU后仍然能够运行第一段代码。

为什么是1M:因为我们采用的是段描述的页表。

1     virtuladdr = 0xA0000000;
2     physicaladdr = 0x56000000;
3     *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | 4                                             MMU_SECDESC;

这几句代码是把GPIO的起始物理地址为0x56000000的1M地址空间映射到虚拟地址0xA0000000,记住,后面要使用到。

1     virtuladdr = 0xB0000000;
2     physicaladdr = 0x30000000;
3     while (virtuladdr < 0xB4000000)
4     {
5         *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | 6                                                 MMU_SECDESC_WB;
7         virtuladdr += 0x100000;
8         physicaladdr += 0x100000;
9 }

这里是完全把SDRAM的64M的地址空间完全映射到起始地址为0xB0000000虚拟地址空间里去。

设置完页表后,接着启动MMU,重设栈指针到SDRAM的顶端。最后跳到0xB0004000里去执行第二段代码。

不知道是没完全弄懂,还是怎么回事?这节课听的迷迷糊糊的。嘛,以后进入linux后再结合相关内容深入研究一下。

时间: 2024-08-29 00:53:46

跟着韦老师学Linux学习笔记(三)-MMU的相关文章

跟着韦老师学Linux学习笔记(三)-interrupt

(一)   中断体系结构 中断的触发源有两种,一种是片内外设的中断(如:UART.IIC.SPI.USB等等),即是Request sources (with sub-register).另一种是外部中断(如:GPIO中断),即是Request sources (without sub-register).这两种中断处理的过程是不太一样的. 1."Request sources (with sub-register)" 的中断源被触发后,首先会使SUBSRCPND寄存器的相应为置1,表

跟着韦老师学Linux学习笔记(二)-存储管理器

(1).CPU操作外设的基本原理图 由图可知,CPU要想访问一个外设,是要通过存储管理器来实现的.本篇中,主要是通过操作SDRAM来实现存储管理器的学习. (2).配置原理和步骤 访问一个芯片需要的配置信息: 1.  片选信号 2.  地址线 3.  数据线,即使数据宽度 4.  时钟\频率 5.  芯片相关的东西:对SDRAM来说 a)         行地址有多少位 b)         列地址有多少位 c)         BANK有多少位 操作一个SDRAM的步骤就是: a.  首先通过

Linux学习笔记三:Linux的权限处理命令

1.改变文件或目录权限  chmod 语法:chmod [{ugo} {+-=} {rwx}] [文件或目录] 或 [mode] [文件或目录] 第一种语法中: 这里的u是所有者,g是指所属组,o是指其他人 +是指增加权限,-是指减少权限,=是指赋予权限 r是指读权限,w是指写权限.x只是执行权限 第二种语法中: 在这里,r的值是4,w的值是2,x的值是1. 这里写的mode,是指一组数字.如:421.这里的421,是指所有者所拥有权限的数字总和是4,所属组所拥有权限的总和是2,其他人所拥有权限

跟啊铭学LINUX学习笔记

摘录自---跟啊铭学LINUX视频课程(如发现错误欢迎大神们指出,谢谢) 实验系统为CentOS 6.5 设置LINUX DNS地址 编辑配置文件  /etc/resolv.conf 在文件中加入nameserver DNS地址1 nameserver DNS地址2 修改LINUX开机启动项 编辑配置文件  /boot/grub/grub.conf default = 0 ---默认启动项为title0,可更改为title1.title2等 实验时因自己电脑里有一个WIN7一个centos因此g

Linux学习笔记三

前四单元笔记 ################################虚拟机控制###################### [[email protected]]$ rht=vmctl start desktop    ###打开desktop失败,语法错误 bash: start: command not found... [[email protected]]$ rht-vmctl start desktop    ###开启desktop,成功 Starting desktop.

Linux学习笔记&lt;三&gt;——常用的查看文本命令和文本处理命令

查看文本: 1.cat:连接并显示文本 tac:cat的倒置显示 -n:在每行行首添加行数显示 -E:每行显示换行符 -A:显示所有,包括文本和各种特殊符号 Linux的文本换行符为$,而Windows的文本换行符是$+Enter 2.可分屏显示的more和less more:向后翻,翻到最后就退出 less:向后翻,翻到最后不会自动退出 more和less显示窗口下操作: 向后翻一页:space键 向前翻一页:b键 退出显示窗口:q键 3.head:查看前n行 tail:查看后n行 -n 数字

Linux学习笔记(三):系统运行级与运行级的切换

1.Linux系统与其他的操作系统不同,它设有运行级别.该运行级指定操作系统所处的状态.Linux系统在任何时候都运行于某个运行级上,且在不同的运行级上运行的程序和服务都不同,所要完成的工作和所要达到的目的也都不同. 2.Linux(Red Hat 9.0)设置了7个不同的运行级,系统可以在这些运行级别之间进行切换以完成不同的工作. 3.接下来简单介绍7个系统运行级: (1).运行级0:关闭计算机. (2).运行级1:单用户模式. (3).运行级2:多用户模式(不带网络文件系统NFS支持功能).

Linux学习笔记(三):系统执行级与执行级的切换

1.Linux系统与其它的操作系统不同,它设有执行级别.该执行级指定操作系统所处的状态.Linux系统在不论什么时候都执行于某个执行级上,且在不同的执行级上执行的程序和服务都不同,所要完毕的工作和所要达到的目的也都不同. 2.Linux(Red Hat 9.0)设置了7个不同的执行级,系统能够在这些执行级别之间进行切换以完毕不同的工作. 3.接下来简介7个系统执行级: (1).执行级0:关闭计算机. (2).执行级1:单用户模式. (3).执行级2:多用户模式(不带网络文件系统NFS支持功能).

【Linux学习笔记三】文件目录管理

[注]文章中的所有截图均为centos下实验结果,亲测命令正确= ̄ω ̄= [参考资料]<Linux从入门到精通(第2版)>刘忆智 等编著 *************************************************和团队共享文件*************************************************** 1.和团队共享文件:创建工作目录,并创建一个用户组管理该目录.      $ sudo groupadd workgroup