对uCLinux来说,其设计针对没有MMU的处理器,不能使用处理器的虚拟内存管理技术。uCLinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有MMU管理,所以实际上uCLinux采用实存储器管理策略。uCLinux系统对于内存的访问是直接的,所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。

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

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

ELF可以生成一种特殊的代码——与位置无关的代码(position-independent code,PIC)。用户对gcc使用-fPIC指示GNU编译系统生成PIC代码。它是实现共享库或共享可执行代码的基础.这种代码的特殊性在于它可以加载到内存地址空间的任何地址执行.这也是加载器可以很方便的在进程中动态链接共享库。

PIC的实现运用了一个事实,就是代码段中任何指令和数据段中的任何变量之间的距离都是一个与代码段和数据段的绝对存储器位置无关的常量。因此,编译器在数据段开始的地方创建了一个表.叫做全局偏移量表(global offset table.GOT)。GOT包含每个被这个目标模块引用的全局数据目标的表目。编译器还为GOT中每个表目生成一个重定位记录。在加载时,动态链接器会重定位GOT中的每个表目,使得它包含正确的绝对地址。PIC代码在代码中实现通过GOT间接的引用每个全局变量,这样,代码中本来简单的数据引用就变得复杂,必须加入得到GOT适当表目内容的指令。对只读数据的引用也根据同样的道理,所以,加上 IC编译成的代码比一般的代码开销大。

经常动态的内存分配会造成内存碎片,并可能耗尽系统的资源。对于使用了动态内存分配的那些应用程序来说,增强健壮性的一种办法是用预分配缓冲区池(Preallocated buffer pool)的办法来取代malloc()调用。由于uclinux中不使用虚拟内存,进出内存的页面交换也没有实现,因为不能保证页面会被加载到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把父进程唤醒,父进程继续往下执行。

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

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

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

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

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

改选项是将ELF格式转换成uClinux所能识别的FLAT格式。在做这个转换过程,我们是不能对ELF文件使用strip去除一些信息,更有甚者不能使用-O2 选项来优化代码。因为去掉的某些信息可能导致最终生成的FLAT格式文件运行出现问题。

uCLinux LINUX区别相关推荐

  1. Windows与Linux区别3

    Windows与Linux区别3 转载于:https://blog.51cto.com/241998/43673

  2. linux识别fat16还是32,FAT16 、FAT32 、NTFS、LINUX区别.doc

    FAT16 .FAT32 .NTFS.LINUX区别 1)FAT16 这是MS-DOS和最早期的WIN95操作系统中最常见的硬盘分区格式.它采用16位的文件分配表,能支持最大为2GB的硬盘,是目前应用 ...

  3. Windows与Linux区别1

    Windows与Linux区别1 转载于:https://blog.51cto.com/241998/43671

  4. 服务器运维用macos,MacOS和Linux区别_网站服务器运行维护,linux,macos

    MacOS catalina升级后Vmware黑屏的问题解决_网站服务器运行维护 macOS Catalina是苹果macOS全新版本.本文就来为大家介绍一下MacOS catalina升级后Vmwa ...

  5. solaris与linux区别,solaris与linux命令的区别

    最近使用axis2做webservice,在solaris上使用axis2生成客户端,当执行命令 export JAVA_HOME=/usr/j2se 设置环境变量时,报如下的错误: JAVA_HOM ...

  6. 关于问题vxworks与linux区别

    vxWorks                                          Linux 内核 结构 微内核, 内核只提供 了基本的服 务,如:任 务管理,内 存管理,中 断处理等 ...

  7. linux屏幕怎么放大_02|初始Linux——Windows与Linux区别

    前言 这是我个人学习分享的第二篇文章了,我今天就分享一下Windows与Linux的界面差异,了解一下Linux的目录,和一些简单的命令.文章可能长且枯燥,但满满都是干货!答应我一定看完它. Wind ...

  8. ucos 和uclinux的区别及各自的特点

    uc/os和uclinux操作系统是两种性能优良源码公开且被广泛应用的的免费嵌入式操作系统,可以作为研究实时操作系统和非实时操作系统的典范.本文通过对uc/os和uclinux的对比,分析和总结了嵌入 ...

  9. RTOS与linux区别

    一句话解释: linux是分时系统,不过可以通过配置内核改成实时. 嵌入式Linux 系统是在原来Linux的发行版本之上进行了优化和改进的,用于嵌入式的移动终端等设备的嵌入式Linux系统现在基本上 ...

最新文章

  1. Java内存模型深度剖析
  2. plsql查找不到带中文的纪录
  3. 腾讯业务监控的修炼之路
  4. python Intel Real Sense D435 异常检测与抛出(获取/打印异常详细信息 traceback.print_exc())
  5. MSSQL WITH (NOLOCK) 脏读
  6. powerdesigner使用之——从“概念模型”到“物理模型”
  7. 小程序开发过程注意事项
  8. 5月23 注册审核
  9. pycharm下打开、执行并调试scrapy爬虫程序
  10. POJ1185炮兵阵地(状态压缩 + dp)
  11. [地图SkyLine二次开发]框架(2)
  12. 【分子动力学模拟】centos7使用gmx_MMPBSA时使用gmx_MMPBSA_ana时无法调用pyqt5
  13. 阿里巴巴与山东省人民政府签署战略合作协议
  14. VS2019配置WinRT
  15. 使用selenium进行模拟登录
  16. MIMO-OFDM系统原理及其关键技术
  17. 源码编译安装LAMP
  18. windows下ping特定端口
  19. MATLAB 线性插补缺省值
  20. mysql数据库sa默认密码_SQL Server数据库sa密码相关问题的解决方法

热门文章

  1. matlab画不定积分图像实例,matlab怎么画函数图像,原来是这样的
  2. AVProVideo☀️九、“今朝若能同淋雪,此生也算共白头”。一曲《南山雪》,学习给视频做字幕。
  3. 回车、换行、空格的ASCII码值
  4. Visitor パターン
  5. AXI(Advanced eXtensible Interface)协议规范
  6. python总结(数据类型、逻辑控制、函数、类与对象、推导式、解包、类型转换、异常、上下文、jsonpath、定时器)
  7. 计算机网络常见知识点总结
  8. 电脑做照片视频的软件用哪个?3步制作高清照片视频,超多酷炫转场效果
  9. P1075 [NOIP2012 普及组] 质因数分解
  10. 数据元素、数据项、组合项、数据结构