`

uClinux和Linux的具体异同

阅读更多
http://www.mculover.com/post/57.html
引用
uCLinux是针对控制领域的嵌入式linux操作系统,它从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。适合不具备内存管理单元(MMU)的微处理器/微控制器。没有MMU支持是uClinux与主流Linux的基本差异。
  标准Linux是针对有MMU的处理器设计的。在这种处理器上,虚拟地址被送到MMU,把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟-物理地址转换映射,支持不同任务之间的保护。
  对uCLinux 来说,其设计针对没有MMU的处理器,不能使用处理器的虚拟内存管理技术。uCLinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有MMU管理,所以实际上uCLinux采用实存储器管理策略。uCLinux系统对于内存的访问是直接的,所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。
  同时,uClinux有着特别小的内核和用户软件空间。熟悉主流Linux的开发者会注意到在 uClinux下工作的微小差异,但同样也可以很快熟悉uclinux的一些特性。对于设计内核或系统空间的应用程序的开发者,要特别注意uClinux 既没有内存保护,也没有虚拟内存模型,另外,有些内核系统调用也有差异。
  1.1 内存保护
  没有内存保护(Memory Protection)的操作会导致这样的结果:即使由无特权的进程来调用一个无效指针,也会触发一个地址错误,并潜在地引起程序崩溃,甚至导致系统的挂起。显然,在这样的系统上运行的代码必须仔细编程,并深入测试来确保健壮性和安全。
  对于普通的Linux来说,需要运行不同的用户程序,如果没有内存保护将大大降低系统的安全性和可*性;然而对于嵌入式uClinux系统而言,由于所运行的程序往往是在出厂前已经固化的,不存在危害系统安全的程序侵入的隐患,因此只要应用程序经过较完整的测试,出现问题的概率就可以控制在有限的范围内。
  1.2 虚拟内存
  没有虚拟内存(Virtual Memory)主要导致下面几个后果:
  首先,由内核所加载的进程必须能够独立运行,与它们在内存中的位置无关。实现这一目标的第一种办法是一旦程序被加载到RAM中,那么程序的基准地址就“固定”下来;另一种办法是产生只使用相对寻址的代码(称为“位置无关代码”,Position Independent Code,简称PIC)。uClinux对这两种模式都支持。
  其次,要解决在扁平(flat)的内存模型中的内存分配和释放问题。非常动态的内存分配会造成内存碎片,并可能耗尽系统的资源。对于使用了动态内存分配的那些应用程序来说,增强健壮性的一种办法是用预分配缓冲区池(Preallocated buffer pool)的办法来取代malloc()调用。
  由于uclinux中不使用虚拟内存,进出内存的页面交换也没有实现,因为不能保证页面会被加载到RAM中的同样位置。在普通计算机上,操作系统允许应用程序使用比物理内存(RAM)更大的内存空间,这往往是通过在硬盘上设立交换分区来实现的。但是,在嵌入式系统中,通常都用FLASH存储器来代替硬盘,很难高效地实现内存页面交换的存取,因此,对运行的应用程序都限制其可分配空间不大于系统的RAM空间。
  最后,uClinux目标板处理器缺乏内存管理的硬件单元,使得Linux的系统接口需要作些改变。有可能最大的不同就是没有fork()和brk()系统调用。调用fork()将复制出进程来创建一个子进程。在Linux下,fork()是使用copy-on-write页面来实现的。由于没有MMU, uclinux不能完整、可*地复制一个进程,也没有对copy-on-write的存取。为了弥补这一缺陷,uClinux实现了vfork(),当父进程调用vfork()来创建子进程时,两个进程共享它们的全部内存空间,包括堆栈。子进程要么代替父进程执行(此时父进程已经sleep)直到子进程调用exitI()退出,要么调用exec()执行一个新的进程,这个时候将产生可执行文件的加载。即使这个进程只是父进程的拷贝,这个过程也不能避免。当子进程执行exit()或exec()后,子进程使用wakeup把父进程唤醒,父进程继续往下执行。
  注意,多任务并没有受影响。哪些旧式的、广泛使用fork()的网络后台程序(daemon)的确是需要修改的。由于子进程运行在和父进程同样的地址空间内,在一些情况下,也需要修改两个进程的行为。
  很多现代的程序依赖子进程来执行基 本任务,使得即时在进程负载很重时,系统仍可以保持一种“可交互”的状态,这些程序可能需要实质上的修改来在uCLinux下完成同样的任务。如果一个关键的应用程序非常依赖这样的结构,那就不得不对它重新编写了。
  假设有一个简单的网络后台程序(daemon),大量使用了fork()。这个daemon总*一个知名端口(或套接字)等待网络客户端来连接。当客户端连接时,这个daemon给它一个新的连接信息(新的socket编号),并调用fork()。子进程接下来就会和客户端在新的socket上进行连接,而父进程被释放,可以继续*新的连接。
  uClinux 既没有自动生长的堆栈,也没有brk()函数,这样,用户空间的程序必须使用mmap() 命令来分配内存。为了方便,在uclinux的C语言库中所实现的malloc()实质上就是一个mmap()。在编译时,可以指定程序的堆栈大小。
分享到:
评论

相关推荐

    嵌入式系统/ARM技术中的uClinux和Linux的具体异同

    嵌入式系统和ARM技术是现代电子设备设计中不可或缺的部分,而uClinux和Linux作为其中的操作系统选择,各自有着独特的特点。本文将深入探讨这两者之间的异同。 uClinux是针对嵌入式环境特别是那些不配备内存管理单元...

    嵌入式linux应用教程 uclinux

    嵌入式Linux应用教程主要关注的是在嵌入式设备上使用Linux操作系统进行应用程序开发和系统设计的技术。UCLinux是这个领域的一个重要分支,它是一个专门为没有MMU(Memory Management Unit,内存管理单元)的处理器...

    uclinux在linux环境下配置编译全程录像.rar

    uclinux在linux环境下配置编译全程录像.rar

    uCOS和uClinux的比较

    uClinux是一种专门为嵌入式系统设计的Linux版本,它是标准Linux内核的一个子集,主要用于没有内存管理单元(MMU)的微控制器。uClinux通过采用特殊的页表实现方式来模拟MMU的功能,从而使得Linux能够在低端嵌入式...

    嵌入式uclinux具体操作实例

    uCLinux内核的模块化设计使得用户可以根据具体需求选择编译哪些功能,从而实现定制化和优化,减少不必要的资源消耗。 在编译内核时,需要配置内核选项,确保只编译与硬件系统兼容和需要的功能模块。这通常通过make ...

    UCOS和uClinux的比较.rar

    3. **软件生态**:uClinux的Linux兼容性使其拥有大量现成的库和应用程序,而UC/OS则需要自行开发或寻找专门为该系统编写的软件。 4. **开发成本**:如果团队熟悉Linux,uClinux可能减少学习曲线;反之,UC/OS的简单...

    uclinux-server.rar_linux 服务器_uclinux_uclinux server

    UCLinux是Linux内核的一个分支,它主要针对微处理器和嵌入式设备进行了优化。与传统的Linux相比,UCLinux不需要MMU(内存管理单元),这使得它能够在没有硬件内存保护的CPU上运行,极大地降低了对硬件的要求。同时,...

    nios2架构uclinux(nios2-linux-20080619开发包)的过程

    Nios II架构与UCLinux结合使用,是嵌入式系统设计中的一种常见方案,尤其在需要高效能、低功耗以及高度...Nios II的可配置性和UCLinux的开源特性使得开发人员可以根据具体应用进行深度定制,实现最佳性能和资源利用率。

    关uclinux的移植LinuxKernel核心中文手册

    uCLinux是Linux操作系统的一个特殊版本,设计用于微控制器和其他资源有限的嵌入式系统,不支持内存管理单元(MMU)。这份手册详细介绍了如何将Linux内核适配到这些特定硬件环境中,对理解和实践Linux内核移植有着极...

    uclinux4skyeye

    《uClinux下SkyEye的网络驱动详解》 在嵌入式系统开发领域,uClinux以其轻量级、高效的特点被广泛应用...在实际操作中,应结合具体的处理器型号、硬件配置和应用需求,灵活调整和优化网络驱动,以实现最佳的仿真效果。

    12路串口3路Socket口的数据收发程序foucLinux.zip_linux socket_uclinux_串口 linux

    标题中的“12路串口3路Socket口的数据收发程序foucLinux.zip_linux socket_uclinux_串口 linux”表明这是一个专为Linux环境设计的软件,具体来说是针对ucLinux这种嵌入式操作系统。这个程序实现了12个串行端口(串口...

    Armlinux资料大合集,uClinux,中文手册,源代码,等等

    uClinux的编译和运行.pdf uclinux-arm.tar.gz Uclinux-Write-Framebuffer-Driver.pdf uClinux_Compile.pdf uclinux_introduction(1).pdf uclinux_introduction.pdf uClinux_ready_Microblaze_design.pdf uClinux_use...

    uclinux内核配置傻瓜教程

    uclinux是一种嵌入式Linux系统,专为资源有限的微处理器设计,特别适用于嵌入式设备和物联网(IoT)应用。以下是对该主题的深入探讨: 1. **uclinux概述**:uclinux是Linux内核的一个分支,它去除了对硬件MMU(内存...

    pppd.zip_linux ppp_uclinux_uclinux ppp_uclinux pppd_www.100.ppp.

    在Linux和uCLinux中,pppd用于拨号上网,配置网络连接,并处理认证和加密等任务。 4. **PPPoE**:PPPoE是PPP在以太网上的扩展,常用于DSL(Digital Subscriber Line)宽带服务,允许用户通过以太网接口进行拨号上网...

    Linux/uClinux+MiniGUI

    通过本书的学习,读者不仅可以掌握Linux/uClinux和MiniGUI的基础知识,还能了解到嵌入式系统开发的整个过程和技术细节,非常适合从事嵌入式系统开发的专业人士以及对此领域感兴趣的学生和研究人员。

    uclinux核心手册-中文

    14. **第十四章:案例研究** - 通过具体的实例展示uCLinux在不同嵌入式系统项目中的应用,如工业控制、消费电子产品和物联网设备。 15. **第十五章:未来和发展** - 展望uCLinux的发展趋势,以及新兴技术如物联网、...

    Linux下搭建SkyEye uClinux环境.pdf

    本文主要介绍了在Linux下搭建SkyEye uClinux环境的方法,包括安装Red Hat Linux 9、交叉编译工具链的安装、SkyEye的安装和uClinux的编译方法等。 Linux操作系统 Linux操作系统是一种开源的操作系统,具有源码开放...

Global site tag (gtag.js) - Google Analytics