uClinux是专为无存储器管理单元(MMU)的微控制器打造的嵌入式Linux操作系统。uClinux首先被移植到摩托罗拉的MC68328 DragonBall集成微处理器上。从那以后, uClinux越来越受到业界的青睐, 被移植到更多的无MMU芯片上。目前,uClinux已成功移植到ARM7TDMI微处理器上。 由于uClinux主要是针对无MMU 微处理器开发的,大多数内核的二进制代码和源代码都被重写,但保留了Linux 操作系统的主要优点:稳定性、优异的网络能力以及优秀的文件系统支持。 uClinux的内存管理与传统Linux区别最大的地方在标准Linux是针对有MMU的处理器设计的。在这种处理器上,虚拟地址被送到MMU,把虚拟 地址映射为物理地址。通过赋予每个任务不同的虚拟物理地址转换映射,支持不同任务之间的保护。对于uCLinux来说,其设计是针对没有MMU的处理 器,即uCLinux不能使用处理器的虚拟内存管理技术。uCLinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页,在加载应用程序时 程序分页加载。但是由于没有MMU管理,所以uCLinux实际上是采用实存储器管理策略的。这一点影响了系统工作的很多方面。uCLinux系统对于内 存的访问是直接的,所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须 为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。
多进程管理
由于uClinux没有MMU管理存储器,在实现多个进程时需要实现数据保护。uClinux的虽然支持fork函数,但其实质是和vfork:实际上uClinux所有的多进程管理都通过vfork来实现。
vfork不
拷贝父进程的页面,只是
初始化私有的
数据结构与准备足够的分页表。调用完成后父子进程事实上共享同一块存储器,因此子进程可以更改父进程的数据及堆栈信息,所有父进程进入睡眠,直到子进程执行exec。当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。这意味着uClinux系统fork调用完程后,要么子进程代替父进程执行(此时父进程已经休眠)直到子进程调用exit退出,要么调用exec执行一个新的进程。
vfork是uClinux与标准Linux应用程序的开发中最重要的不同之处,只有对vfork与fork两个函数的差异和程序处理有详细的了解才能顺利地完成从Linux到uClinux的程序移植。
标准Linux使用虚拟存储器技术,对于uClinux来说,其设计针对没有MMU(memory management unit) 的处理器。但uClinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有MMU管理,所以实际上uClinux采用实存储器管理策略(real memory management)。uClinux系统对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址。 uClinux对内存的管理从编译内核开始,从而系统将在启动的初始化阶段对内存进行分页,并且标记已使用的和未使用的内存。系统将在运行应用时使用这些分页内存。另外由于采用实存储器管理策略,用户程序同内核以及其他用户程序在一个地址空间,程序开发时要保证不侵犯其他程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其他程序的运行异常。