作为一颗很给力的Cortex-M3芯片,为何LPC1788不能移植Linux呢。因为和ARM7一样,LPC1788也不含MMU -----内存管理单元。MMU是高级操作系统(Windows,Linux)所必须的。简单来说MMU的作用是为线程提供更安全的存储空间。
ARM9,ARM11这类cpu都包含了
当然也不是没办法,针对LPC17xx这类没有MMU的CPU可以使用uCLinux。只是目前移植uCLinux到LPC17xx的资料还比较少。
借百度科普下MMU
完整词条:http://baike.baidu.com/link?url=eOwAmbW0dXaXsQh1ylxcKFI8vxWQ54o_tAmfv1OAu51hB-Nv3mo1EowL8Er4TciT
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
将线性地址映射为物理地址
现代的多用户
多进程操作系统,需要MMU,才能达到每个用户进程都拥有自己独立的
地址空间的目标。使用MMU,
操作系统划分出一
段地址区域,在这块地址区域中,每个进程看到的内容都不一定一样。例如MICROSOFT
WINDOWS操作系统将地址范围4M-2G划分为用户
地址空间,进程A在地址0X400000(4M)映射了
可执行文件,进程B同样在地址0X400000(4M)映射了可执行文件,如果A进程读地址0X400000,读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0X400000时,则读到的是B的可执行文件映射到RAM的内容。
这就是MMU在当中进行
地址转换所起的作用。
提供硬件机制的内存访问授权
多年以来,
微处理器一直带有片上
存储器管理单元(MMU),MMU能使单个
软件线程工作于硬件保护
地址空间。但是在许多商用
实时操作系统中,即使系统中含有这些硬件也没采用MMU。
当
应用程序的所有线程共享同一
存储器空间时,任何一个线程将有意或无意地破坏其它线程的代码、数据或
堆栈。异常线程甚至可能破坏内核代码或内部
数据结构。例如线程中的指针错误就能轻易使整个
系统崩溃,或至少导致系统工作异常。
就安全性和可靠性而言,基于进程的
实时操作系统(RTOS)的性能更为优越。为生成具有单独
地址空间的进程,RTOS只需要生成一些基于RAM的
数据结构并使MMU加强对这些数据结构的保护。基本思路是在每个关联转换中“接入”一组新的
逻辑地址。MMU利用当前映射,将在指令调用或数据读写过程中使用的
逻辑地址映射为
存储器物理地址。MMU还标记对非法
逻辑地址进行的访问,这些非法逻辑地址并没有映射到任何
物理地址。
这些进程虽然增加了利用查询表访问
存储器所固有的
系统开销,但其实现的效益很高。在进程边界处,疏忽或错误操作将不会出现,
用户接口线程中的缺陷并不会导致其它更关键线程的代码或数据遭到破坏。目前在可靠性和安全性要求很高的复杂
嵌入式系统中,仍然存在采无
存储器保护的
操作系统的情况,这实在有些不可思议。
采用MMU还有利于选择性地将页面映射或解映射到
逻辑地址空间。物理存储器页面映射至逻辑空间,以保持当前进程的代码,其余页面则用于数据映射。类似地,物理存储器页面通过映射可保持进程的线程
堆栈。RTOS可以在每个线程
堆栈解映射之后,很容易地保留逻辑地址所对应的页面内容。这样,如果任何线程分配的
堆栈发生溢出,将产生硬件
存储器保护故障,内核将挂起该线程,而不使其破坏位于该地址空间中的其它重要存储器区,如另一线程堆栈。这不仅在
线程之间,还在同一地址空间之间增加了
存储器保护。
存储器保护(包括这类
堆栈溢出检测)在
应用程序开发中通常非常有效。采用了
存储器保护,
程序错误将产生异常并能被立即检测,它由
源代码进行跟踪。如果没有
存储器保护,
程序错误将导致一些细微的难以跟踪的故障。实际上,由于在扁平
存储器模型中,RAM通常位于
物理地址的零页面,因此甚至NULL指针引用的解除都无法检测到。