Linux和uClinux比较分析 _uclinux tinylinux-程序员宅基地

技术标签: OS  网络  linux  存储  socket  嵌入式  任务  

Linux和uClinux比较分析

  标准Linux是针对有MMU的处理器设计的。在这种处理器上,虚拟地址被送到MMU,把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟-物理地址转换映射,支持不同任务之间的保护。        uClinux是针对控制领域的嵌入式linux操作系统,它从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。适合不具备内存管理单元(MMU)的微处理器/微控制器。没有MMU支持是uClinux与主流Linux的基本差异。   

uClinux有着特别小的内核和用户软件空间。熟悉主流Linux的开发者会注意到在 uClinux下工作的微小差异,但同样也可以很快熟悉uclinux的一些特性。对于设计内核或系统空间的应用程序的开发者,要特别注意uClinux 既没有内存保护,也没有虚拟内存模型,另外,有些内核系统调用也有差异。   对uCLinux 来说,其设计针对没有MMU的处理器,不能使用处理器的虚拟内存管理技术。uCLinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有MMU管理,所以实际上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空间。

   注意,多任务并没有受影响。哪些旧式的、广泛使用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把父进程唤醒,父进程继续往下执行。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liukun321/article/details/5678349

智能推荐

SpringMVC深度探险(四) —— SpringMVC核心配置文件详解-程序员宅基地

文章浏览阅读56次。在上一篇文章中,我们从DispatcherServlet谈起,最终为读者详细分析了SpringMVC的初始化主线的全部过程。整个初始化主线的研究,其实始终围绕着DispatcherServlet、WebApplicationContext和组件这三大元素之间的关系展开。在文章写完之后,也陆续收到了一些反馈,其中比较集中的问题,是有关WebApplicationContext对组件进行初始化..._springmvc#++#string mappedinterceptorname = readercontext.registerwithgenera

关于cometd的一些使用经验-程序员宅基地

文章浏览阅读334次。关于cometd的一些使用经验一:js端使用方式===================================================第一步 :初始化cometd配置, $.cometd.configure({ url: cometdURL, logLevel: 'debug'..._public class bayeuxservice extends abstractservice

ASA系统管理与日志_02-程序员宅基地

文章浏览阅读291次。域名DNSASA1(config)#hostnameASA1ASA1(config)#domain-namejava.localASA1(config)#showrunning-configdnsdnsdomain-lookupDMZ//dns解析都从DMZ口出去DNSserver-groupDef..._asa 登录日志

接入网络的计算机之间的共同语言是,初三信息技术考核复习提纲-程序员宅基地

文章浏览阅读264次。初三信息A资格提纲2013年初三信息技术试题库试题一、填空题1.计算机硬件系统由运算器、控制器、(存储器)、输入设备、输出设备、五大功能部分组成,这种计算机结构被称为冯·诺依曼结构。2.第一台电子数字计算ENIAC诞生于(1946)年。 3.计算机网络按其所涉及的范围大小和计算机之间互联距离的不同,其类型 可分为局域网、城域网、(广域网)。4.JPEG是(图片)文件格式5.1GB=(1024)MB..._互联网上的计算机进行互连时需要有一种共同语言,即网络通信协议,这种被互联网

IPFS私有集群的安装部署_ipfs swarm peers-程序员宅基地

文章浏览阅读1.5k次,点赞11次,收藏8次。IPFS的安装部署(私有集群)利用docker部署环境golangdocker生成搭建私有网络所需的swarm.key密钥go get github.com/Kubuxu/go-ipfs-swarm-key-gencd $GOPATHgo build./ipfs-swarm-key-gen > swarm.key创建挂载目录:ipfs 的 export 和 data 目录挂载到主机上,这里做下准备,每个不同是私链节点的挂载目录不一样。以node0为例/home/_ipfs swarm peers

CSS 三种基础选择器_简述css三中基础选择器-程序员宅基地

文章浏览阅读6.3k次,点赞5次,收藏10次。本节我们来学习 CSS 中的选择器,选择器是 CSS 里面一个很重要的概念,HTML 中的所有标签样式,都是通过不同的 CSS 选择器进行控制的。我们只需要通过选择器,就可以对不同的 HTML 标签进行选择,并指定各种样式声明。在 CSS 中三三种最基本的选择器,分别是标签选择器、类选择器(class)、ID选择器。我们知道在 HTML 页面中引入 CSS 样式最好的方法是引入外部样式,也就是将 CSS 代码单独放置到一个 .css 文件内,然后再引入这个 CSS 文件。标签选择器我们知道一个 HT_简述css三中基础选择器

随便推点

STM32——库函数版——12864点阵显示屏驱动_stm32驱动12864-程序员宅基地

文章浏览阅读6.6k次,点赞17次,收藏102次。12864点阵显示屏驱动我用的主控是STM32F103ZET6程序里面有两种发法:一个是并行发送数据,另一个是串行发送数据完整工程链接:12864完整驱动工程12864学习资料和取模软件链接:12864学习资料和取模软件引脚连接看led12864.h里面的设置程序运行效果图:1.并行发送数据效果图2.串行发送数据效果图程序如下:main.c#include "sys.h"#include "delay.h"#include "led12864.h"/*2020.11.20*_stm32驱动12864

vb.net 如何实现报表打印_如何实现流水条码的特殊排版打印-程序员宅基地

文章浏览阅读232次。今天遇到一个关于打印流水条码问题,是在手腕标签上打印流水条码,一张标签纸张有十个手腕标签,左边每隔一张打印一个流水条码(第一个标签开始条码数据2、4、6、8、10这样递增),右边也是五个流水条码(第二个标签开始条码数据1、3、5、7、9这样递增),右边的流水条码被旋转了180度。然后就是这样流水条码一张一张的批量打印,标签纸效果如下图。像这种特殊排版的流水条码打印,是可以用中琅条码打印软件实现,操..._vb.net 报表打印

2021年危险化学品经营单位主要负责人考试技巧及危险化学品经营单位主要负责人模拟考试题库_企业要充分利用和整合调度-程序员宅基地

文章浏览阅读750次。题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:危险化学品经营单位主要负责人考试技巧根据新危险化学品经营单位主要负责人考试大纲要求,安全生产模拟考试一点通将危险化学品经营单位主要负责人模拟考试试题进行汇编,组成一套危险化学品经营单位主要负责人全真模拟考试试题,学员可通过危险化学品经营单位主要负责人模拟考试题库全真模拟,进行危险化学品经营单位主要负责人自测。1、【单选题】《安全生产法》规定,生产经营单位的安全生产管理人员应当根据本单位的生产经营特点,对安全生产状况进行经常性检查_企业要充分利用和整合调度

锟斤拷?UTF-8与GBK互转,为什么会乱码?-程序员宅基地

文章浏览阅读2.4w次,点赞5次,收藏11次。[置顶] 锟斤拷?UTF-8与GBK互转,为什么会乱码?标签: UTF-8GBK编码乱码中文2016-10-18 21:50 7927人阅读 评论(0) 收藏 举报 分类:java基础(5) 版权声明:本文为博主原创文章,转载请注明出处。作为一名程序员,肯定有被乱码困扰的时候,真到了百思不得其解的时候,就会觉得:英文程序员真幸

Sqoop将数据从oracle导入到hive时,数据错位的问题解决_sqoop数据错列-程序员宅基地

文章浏览阅读1.6k次。问题一:导入的列有换行符等其他字符如何解决在使用sqoop将数据从oracle导入hive时,对数据进行验证,发现hive中的数据比oracle的多,然后发现多出来的数据严重错位,大量字段为null怀疑是某些字段含有了hive默认的分隔符,如“\n”,“\r”,“\01”解决办法是增加参数--hive-drop-import-delims来解决Hive will have prob..._sqoop数据错列

一文读懂PRBS定义、生成办法、作用-程序员宅基地

文章浏览阅读1.7w次,点赞8次,收藏85次。对于眼图测试、误码率和抖动容限测试,最常用的测试码是PRBS,主要有PRBS7、PRBS15、PRBS23和PRBS31。本文主要解释了PRBS的定义,生成方法以及简单应用。PRBS定义二进制序列指的是,a0, ..... , aN-1的N bit的序列,其中 aj∈{0,1},j=0, 1, ..., N-1。一个二进制序列中,包含m=∑aj个1, 以及N-M个0。如果一..._prbs检测

推荐文章

热门文章

相关标签