第5章嵌入式Linux操作系统概述内容摘要Linux的诞生与发展Linux的内核结构Linux存储管理Linux进程管理Linux内核启动与初始化进程Linux的诞生与发展Linux的诞生与版本历史–Linux的诞生–Linux的版本发展历史–Linux的应用领域Linux在嵌入式领域的延伸–Linux嵌入式系统开发平台–嵌入式Linux系统开发模式–嵌入式Linux面临的挑战–嵌入式Linux的发展及应用前景Linux的诞生UNIX操作系统是美国贝尔实验室于1969年夏在DECPDP-7小型计算机上开发的一个分时操作系统Linux操作系统的诞生、发展和成长过程始终依赖着以下五个重要支柱:MINIX系统是由AndrewS.Tanenbaum(AST)1987年开发的,主要用于学生学习操作系统原理GNU计划旨在开发一个类似Unix、并且是自由软件的完整操作系统:GNU系统。POSIX可移植操作系统接口标准是由IEEE开发的,由ISO/IEC标准化的一簇标准。该标准是基于现有的UNIX实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。如果没有Internet网,那么Linux绝对不可能发展到现在的水平。Linux的版本发展历史从Linux诞生开始,Linux内核就从来没有停止过升级,从0.02版本到1999年具有里程碑意义的2.2版本,一直到我们现在看到的2.6版本。Linux内核版本有两种:--稳定版和开发版Linux内核的命名机制:num.num.num。--第一个数字是主版本号--第二个数字是次版本号--第三个数字是修订版本号从未停止过升级Linux的应用领域Linux服务器桌面系统嵌入式应用Linux嵌入式系统开发平台系统软件平台系统硬件平台嵌入式Linux系统需要下面三个基本元素:系统引导工具——用于机器加电后的系统定位引导Linux微内核——内存管理、程序管理初始化进程但如果要它成为完整的操作系统并且继续保持小型化,还必须加上硬件驱动程序、硬件接口程序和应用程序组。选定硬件平台前,首先要确定系统的应用功能和所需要的速度,并制定好外接设备和接口标准。这样才能准确地定位所需要的硬件方案,得到性价比最高的系统。应用功能速度1外接设备接口标准2=性价比嵌入式Linux开发模式建立交叉开发环境交叉编译和链接交叉调试系统测试嵌入式Linux开发模式——建立交叉开发环境商业类型ARMSoftwareDevelopmentToolkitWindRiverTornadoMicrosoftEmbedded交叉开发环境GNU工具链交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链开放类型嵌入式Linux开发模式——交叉编译和链接在完成嵌入式软件的编码之后,就是进行编译和链接,以生成可执行代码。由于开发过程大多是在Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器这就要求在建立好的交叉开发环境中进行交叉编译和链接。建立交叉开发环境交叉编译和链接交叉调试系统测试嵌入式Linux开发模式——交叉调试硬件调试:如果不采用在线仿真器,可以让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。软件调试:在Linux内核中设置一个调试桩用作调试过程中和宿主机之间的通信服务器。然后在宿主机中通过调试器的串口与调试桩进行通信应用软件的调试:嵌入式上层应用软件的调试可以使用本地调试和远程调试两种方法。嵌入式Linux交叉调试天嵌入式Linux开发模式——系统测试测试技术指的是软件测试的专门途径,以及能够更加有效地运用这些途径的特定方法。在嵌入式软件测试中,常常要在基于目标机的测试和基于宿主机的测试之间做出折衷。基于目标机的测试需要消耗较多的时间和经费,而基于宿主机的测试虽然代价较小,毕竟是在仿真环境中进行的。嵌入式软件测试中经常用到的测试工具:内存分析工具性能分析工具覆盖分析工具缺陷跟踪工具嵌入式Linux面临的挑战Linux的实时扩充性改变Linux内核体系结构完善Linux的集成开发环境123Solution扩展Linux的实时性能向外扩展向上扩展Linux的内核体系采用的是Monolithic内核体系结构Microkernel一个完整的嵌入式系统的集成开发环境一般需要提供的工具是:编译/连接器内核调试/跟踪器集成图形界面开发平台•编辑器•调试器•软件仿真器•监视器整体集成开发环境还有待提高和完善嵌入式Linux的发展及应用前景由于Linux具有对各种设备的广泛支持性,因此,能方便地应用于机顶盒、IA设备、PDA、掌上电脑、WAP手机、寻呼机、车载盒以及工业控制等智能信息产品中。与PC相比,手持设备、IA设备以及信息家电的市场容量要高得多,而Linux嵌入式系统的强大的生命力和利用价值,使越来越多的企业和高校表现出对它极大的研发热情。Linux嵌入式操作系统所具有的技术优势和独特的开发模式给业界以新异,有理由相信,它能成为Internet时代嵌入式操作系统中的最强音。内容摘要Linux的诞生与发展Linux的内核结构Linux存储管理Linux进程管理Linux内核启动与初始化进程Linux内核结构Linux内核概述–Linux内核特点–Linux2.6内核新特性–Linux内核的组成存储与进程管理–存储管理–进程调度内核源代码目录结构Linux内核特点Linux内核编程容易可移植性可量测性模块化稳定性和可靠性安全性标准化和互用性完善的网络支持Linux内核既能支持32位体系结构又能支持64位体系结构。Linux内核全部源代码是遵守GPL软件许可的免费软件开发者可以免费得到社区的贡献、支持、检查代码和测试。驱动程序可以免费发布给其他人,可以静态编译进内核。以源码形式发布驱动程序,可以不必为每一个内核版本和补丁版本都提供二进制的程序Linux2.6内核新特性Linux2.4Linux2.6新的调度器内核抢占新的线程模型文件系统声音总线电源管理网络用户界面层统一的设备模型Linux内核的组成进程调度程序(SCHED)负责控制进程访CPU。保证进程能够公平地访问CPU,同时保证内核可以准时执行一些必需的硬件操作;内核管理程序(MM)使多个进程可以安全地共享机器的主存系统,并支持虚拟内存;虚拟文件系统(VFS)通过提供一个所有设备的公共文件接口,VFS抽象了不同硬件设备的细节。此外,VFS支持与其他操作系统兼容的不同的文件系统格式;网络接口(NET)提供对许多建网标准和网络硬件的访问;进程间通信(IPC)子系统为进程与进程之间的通信提供了一些机制。这5部分之间是相互依赖的关系存储管理内存管理任务屏蔽各种硬件的内存结构并向上层返回统一的访问界面页式存储管理机制每个页面的大小随处理机芯片而异支持虚拟内存硬件无关部分进程的映射和逻辑内存的对换硬件相关部分为内存管理硬件提供了虚拟接口分类页表每个进程保留一张页表,用于将本进程空间中的虚拟地址变换成物理地址。进程调度当需要选择下一个进程运行时,由调度程序选择最值得运行的进程,依据每个进程的task_struct结构policypriorityrt-prioritycounterpolicy是进程的调度策略两类Linux进程:普通进程与实时进程实时进程的优先级高于其他进程priority是调度管理器分配给进程的优先级是进程允许运行的时间rt_priority用于实时进程间的选择调度器使用这个域给每个实时进程一个相对优先级可以通过系统调用来改变实时进程的优先级。counter是进程剩余的时间片内核源代码目录结构documentationscriptslibnetfskernelipcdriversmminitincludearch内核源代码目录结构arch目录包含了体系结构相关部分的内核代码include目录包括编译核心所需要的大部分头文件init目录包含核心的初始化代码mm此目录包含了所有的内存管理代码drivers目录中是系统中所有的设备驱动程序ipc此目录包含了Linux操作系统核心的进程间通讯代码这部分内容包括进程调度及创建和撤销进程的代码该目录下列出了Linux支持的所有文件系统这个目录是核心的网络部分代码lib目录包含了核心的库代码scripts目录下没有代码,包含用于配置核心的脚本文件documentation目录是对每个目录作用的具体说明,起参考作用内容摘要Linux的诞生与发展Linux的内核结构Linux存储管理Linux进程管理Linux内核启动与初始化进程Linux存储管理进程虚存空间的管理虚存空间的映射和虚存区域的建立Linux的分页式存储管理物理内存空间的管理内存的分配与释放–内存分配与释放的数据结构–内存分配函数kmalloc()–虚拟内存的申请和释放进程虚存空间的管理每一个进程,用一个mm-struct结构体来定义它的虚存用户区。mm_struct结构体首地址在任务结构体task-struct成员项mm中:structmm-struct*mm。Linux的存储管理主要是管理进程虚拟内存的用户区Linux操作系统采用了请求式分页存储管理方法。系统为每个进程提供4GB的虚拟内存空间。各个进程的虚拟内存彼此独立。进程运行时能访问的存储空间只是它的虚拟内存空间。对当前该进程而言只有属于它的虚拟内存是可见的。mm_struct结构定义在/include/linux/schedul.h中进程虚存空间的管理structmm_struct{intcount;pgd_t*pgd;unsignedlongcontext;unsignedlongstart_code,end_code,start_data,end_data;unsignedlongstart_brk,brk,start_stack,start_mmap;unsignedlongarg_start,arg_end,env_start,env_end;unsignedlongrss,total_vm,locked_vm;unsignedlongdef_flags;structvm_area_struct*mmap;structvm_area_struct*mmap_avl;structsemaphoremmap_sem;};mm_struct结构定义在/include/linux/schedul.h中进程虚存空间的管理structvm_area_struct{structmm_struct*vm_mm;unsignedlongvm_start;unsignedlongvm_end;pgprot_tvm_page_prot;unsignedshortvm_flags;shortvm_avl_height;structvm_area_struct*vm_avl_left;structvm_area_struct*vm_avl_right;structvm_area_struct*vm_next;structvm_area_struct*vm_next_share;structvm_area_struct*vm_prev_share;structvm_operations_struct*vm_ops;unsignedlongvm_offset;structinode*vm_inode;unsignedlongvm_pte;};定义在/include/linux/mm.h中每个虚拟区域用一个vm-area-stru