MIPS 在linux中的内存映射

如图:




一些说明:

1.内核从什么地方开始运行:MIPS Linux内核的代码构建为在kseg0区运行;虚拟地址从0x80000000向上。这个范围的地址仅仅是一个到物理内存低512MB的窗口,无需TLB管理。

2.异常入口点:大多数MIPS CPU中,这都是由硬件布线固化到kseg0底部附近。最新的CPU可以提供EBase寄存器,对异常入口重新定位。主要是让多个共享内存的CPU能用不同的异常处理程序而不用费力去作特殊的存储器译码。在linux内核中,就算有多个CPU也都运行同一个异常处理代码,所以这个特性在linux中不大可能用到。

3.用户程序从什么地方开始运行:MIPS Linux应用程序(运行与低特权级的用户态)虚拟地址从0到0x7FFF FFFF。该区的地址在用户态可以访问,要经过TLB地址转换。

应用程序的主程序构建时自接近0的地址开始运行。不会真为零-----从虚拟0地址开始的一两页不做地址映射,这样企图使用空指针就会被当作内存管理错误捕获。应用程序的库函数部分,在加载或者更晚的时候递增加载到用户空间。这样做可以是因为库函数构建为位置无关类型,可以根据实际被加载的地址空间自动调整。

4.用户堆和栈:应用程序的栈初始设置到用户可以访问的空间(约2G虚拟空间)的顶部而且向下增长。操作系统检测到对已分配的最低栈空间附近未映射的存储器访问时,会自动映射更多的页已满足栈的增长。

同时,新的共享库或者直接用malloc()分配的用户数据及其后代从用户空间底部向上增长。只要这些空间的总和不超过2GB,什么事都没有:除了最大型的服务器以外,这个限制基本不成问题。

5.512MB以内的存储器:可以通过kseg()经过高速缓存访问或者通过kseg1不用高速缓存访问。历史上,linux内核假定自己可以直接访问机器的全部屋里内存。对于用512MB或者更少物理内存范围的小MIPS系统,这是对的;在这种情况下,全部内存都可以在kseg0(用高速缓存)和kseg1(不用高速缓存)区访问。

6.512MB以上的高位存储器:现在512MB即使对于嵌入式系统也已经不够了,Linux有一个独立于硬件体系结构的高位存储器概念----要用特殊的、依赖于硬件体系结构的方式处理的物理存储器,对于32位linux/mips系统,512MB以上的屋里内存就是高位存储器。当我们要访问时,需要创建适当的地址转换数据项并且即使复制到TLB。



你可能感兴趣的:(linux内核驱动,学习笔记)