uclinux和linux的区别有哪些

85次阅读
没有评论

共计 3474 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要讲解了“uclinux 和 linux 的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“uclinux 和 linux 的区别有哪些”吧!

区别:1、uclinux 采用存储器的分页管理,linux 采用虚拟内存管理;2、uclinux 没有 fork 系统调用,使用 vfork,而 linux 使用 fork 系统调用;3、uclinux 不能运行时增加进程栈,linux 可以在运行时增加进程栈。

本教程操作环境:linux7.3 系统、Dell G3 电脑。

uclinux 和 linux 的区别是什么

在 uClinux 这个英文单词中 u 表示 Micro,小的意思,C 表示 Control,控制的意思,

所以 uClinux 就是 Micro-Control-Linux,字面上的理解就是 针对微控制领域而设计的 Linux 系统。

ucLinux 与 linux 区别

没有虚存管理

不能运行时增加进程栈

不支持分页

可执行程序不是 elf,   而是 flat

不能用 fork,   而是用 vfork

RAMDISK

uClinux 是针对控制领域的嵌入式 linux 操作系统,它从 Linux 2.0/2.4 内核派生而来,沿袭了主流 Linux 的绝大部分特性。

适合不具备内存管理单元 (MMU) 的微处理器 / 微控制器。没有 MMU 支持是 uClinux 与主流 Linux 的基本差异。

对 uCLinux 来说,其设计针对没有 MMU 的处理器,不能使用处理器的虚拟内存管理技术。uCLinux 仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有 MMU 管理,所以实际上 uCLinux 采用实存储器管理策略。

uCLinux 系统对于内存的访问是直接的,所 有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为进程分配足够的连续 地址空间,然后全部载入主存储器的连续空间中。

没有内存保护 (Memory Protection) 的操作会导致这样的结果:

即使由无特权的进程来调用一个无效指针,也会触发一个地址错误,并潜在地引起程序崩溃,甚至导致系统的挂 起。显然,在这样的系统上运行的代码必须仔细编程,并深入测试来确保健壮性和安全。

对于普通的 Linux 来说,需要运行不同的用户程序,如果没有内存保护将大大降低系统的安全性和可 * 性;然而对于嵌入式 uClinux 系统而言,由 于所运行的程序往往是在出厂前已经固化的,不存在危害系统安全的程序侵入的隐患,因此只要应用程序经过较完整的测试,出现问题的概率就可以控制在有限的范 围内。

没有虚拟内存 (Virtual Memory) 主要导致下面几个后果:

首先,由内核所加载的进程必须能够独立运行,与它们在内存中的位置无关。实现这一目标的第一种办法是一旦程序被加载到 RAM 中,那么程序的基准地址 就“固定”下来;另一种办法是产生只使用相对寻址的代码(称为“位置无关代码”,Position Independent Code,简称 PIC)。uClinux 对这两种模式都支持。

其次,要解决在扁平 (flat) 的内存模型中的内存分配和释放问题。非常动态的内存分配会造成内存碎片,并可能耗尽系统的资源。对于使用了动态内存 分配的那些应用程序来说,增强健壮性的一种办法是用预分配缓冲区池 (Preallocated buffer pool) 的办法来取代 malloc()调用。

由于 uclinux 中不使用虚拟内存,进出内存的页面交换也没有实现,因为不能保证页面会被加载到 RAM 中的同样位置。在普通计算机上,操作系统允 许应用程序使用比物理内存 (RAM) 更大的内存空间,这往往是通过在硬盘上设立交换分区来实现的。但是,在嵌入式系统中,通常都用 FLASH 存储器来代替 硬盘,很难高效地实现内存页面交换的存取,因此,对运行的应用程序都限制其可分配空间不大于系统的 RAM 空间。

多任务并没有受影响。哪些旧式的、广泛使用 fork()的网络后台程序(daemon)的确是需要修改的。由于子进程运行在和父进程同样的地 址空间内,在一些情况下,也需要修改两个进程的行为。

很多现代的程序依赖子进程来执行基本任务,使得即时在进程负载很重时,系统仍可以保持一种“可交互”的状态,这些程序可能需要实质上的修改来在 uClinux 下完成同样的任务。如果一个关键的应用程序非常依赖这样的结构,那就不得不对它重新编写了。

假设有一个简单的网络后台程序(daemon),大量使用了 fork()。这个 daemon 总监听一个知名端口(或套接字)等待网络客户端来连接。当客户端连接时,这个 daemon 给它一个新的连接信息(新的 socket 编号),并调用 fork()。子进程接下来就会和客户端在新的 socket 上进 行连接,而父进程被释放,可以继续监听新的连接。

uClinux 既没有自动生长的堆栈,也没有 brk()函数,这样,用户空间的程序必须使用 mmap() 命令来分配内存。为了方便,在 uclinux 的 C 语言库中所实现的 malloc()实质上就是一个 mmap()。在编译时,可以指定程序的堆栈大小。

最后,uClinux 目标板处理器缺乏内存管理的硬件单元,使得 Linux 的系统接口需要作些改变。有可能最大的不同就是没有 fork()和 brk()系统调用。调用 fork()将复制出进程来创建一个子进程。在 Linux 下,fork()是使用 copy-on-write 页面来实现的。由于 没有 MMU,uclinux 不能完整、可 * 地复制一个进程,也没有对 copy-on-write 的存取。为了弥补这一缺陷,uClinux 实现了 vfork(),当父 进程调用 vfork()来创建子进程时,两个进程共享它们的全部内存空间,包括堆栈。子进程要么代替父进程执行(此时父进程已经 sleep)直到子进程调 用 exitI()退出,要么调用 exec()执行一个新的进程,这个时候将产生可执行文件的加载。即使这个进程只是父进程的拷贝,这个过程也不能避免。当 子进程执行 exit()或 exec()后,子进程使用 wakeup 把父进程唤醒,父进程继续往下执行。

通用架构的内核变化:

在 uCLinux 的发布中,/linux/mmnommu 目录取代了 /linux/mm 目录. 前者是修改后的内存管理子系统 被修改, 去除了 MMU 的硬件依赖, 并在内核软件自身提供基本的内管理函数.

很多子系统需要重新修改, 添加或重写. 内核和用户内存分配及释放进程 必须重新实现, 对透明交互 / 页面调度的支持也被去除. 内核中, 加入了支持 内核无关代码(PIC) 的程序支持模块, 并使用了新的二进制目标代码 格式, 称扁平格式, 用来支持 PIC(有非常紧凑的头部).

内核也提供了支持 ELF 格式的程序加载模块, 用来支持使用固定基准地址的可执行程序. 两种模式各 有利弊, 传统的 PIC 运行快, 代码紧凑, 但有代码大小限制. 例如 Motorola 68K 架构的 16 位相对跳转限制了 PIC 程序不能超过 32KB 大小, 而采用运行期固定基准地址的方法上市的程序代码没有了大小限制, 但当陈旭被内核加载后 导致了较多的系统开销. 对于内核开发者来说,uCLinux 基本上与 Linux 没有区别, 唯一的区别就是不能利用 MMU 提供的内存管理. 实际上这对内核并 没有影响. Linux 下所有标准的可执行文件的格式在 uCLinux 并不被支持, 因为这些格式也用到了虚拟内存的一些功能.uCLinux 使用的 是另外一种扁平格式. 扁平格式是一种简洁高效的可执行文件格式, 它值包含可执行的代码和数据, 还有一些把可执行文件加载到内存任意位置所需要的可重定位的 信息.

总结:在应用程序移植到 uClinux,以及自己写代码的过程中,我们将始终围绕这几个特性来做:

1、在 configure 时,如果可能则需要在 configure 时,选上—disable-shared 和—enable-static.

2、将 源代码中所有出现的 fork()改成 vfork();

3、在 Makefile 中 的交叉编译器和编译选项,链接选项里加上 -Wl,-elf2flt。尽管这只是一个链接选项,但我 还是小心地在 LDFLAGS 和 CFLAGS,甚至在 CC 中指定了该选项。

感谢各位的阅读,以上就是“uclinux 和 linux 的区别有哪些”的内容了,经过本文的学习后,相信大家对 uclinux 和 linux 的区别有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计3474字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)