linux
Linux是一套免费运用和自在传达的类Unix操作体系,是一个依据POSIX和UNIX的多用户、多任务、支撑多线程和多CPU的操作体系。它能运转首要的UNIX东西软件、应用程序和网络协议。它支撑32位和64位硬件。Linux承继了Unix以网络为中心的规划思维,是一个功能安稳的多用户网络操作体系。
Linux操作体系诞生于1991 年10 月5 日(这是第一次正式向外发布时刻)。Linux存在着许多不同的Linux版别,但它们都运用了Linux内核。Linux可安装在各种计算机硬件设备中,比方手机、平板电脑、路由器、视频游戏操控台、台式计算机、大型机和超级计算机。严厉来讲,
Linux这个词自身只表明Linux内核,但实践上人们现已习惯了用Linux来描述整个依据Linux内核,而且运用GNU 工程各种东西和数据库的操作体系。
uclinux
uclinux表明micro-control linux.即“微操控器范畴中的Linux体系”,是Lineo公司的主打产品,一起也是开放源码的嵌入式Linux的模范之作。uCLinux首要是针对方针处理器没有存储办理单元MMU(Memory Management Unit)的嵌入式体系而规划的。它现已被成功地移植到了许多平台上。因为没有MMU,其多任务的完成需求必定技巧。
Linux是一种很受欢迎的操作体系,它与UNIX体系兼容,开放源代码。它原本被规划为桌面体系,现在广泛应用于服务器范畴。而更大的影响在于它正逐渐的应用于嵌入式设备。uClinux正是在这种氛围下发生的。在uClinux这个英文单词中u表明Micro,小的意思,C表明Control,操控的意思,所以uClinux便是Micro-Control-Linux,字面上的了解便是“针对微操控范畴而规划的Linux体系”。
uClinux是嵌入式Linux范畴非常重要的分支,已成功应用于路由器、机顶盒、PDA等范畴,与规范Linux在内存办理方面有着实质的差异。
uclinux和linux的差异
对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中指定了该选项。