ARM嵌入式LINUX应用程序设计课程介绍嵌入式程序设计是嵌入式系统概论后修课程。该课程基于ARM+linux硬软件平台进行程序开发,具体的开发平台是EDUK4;该课程重点是在掌握嵌入式系统开发流程的基础上,搭建嵌入式交叉编译平台,实现基于平台的基本应用程序设计,接口驱动程序设计和高级应用程序设计。2020/1/112教材弓雷.ARM嵌入式Linux系统开发详解(第2版).清华大学出版社.2014,2.2020/1/113参考资料基于S3C2410嵌入式Linux开发实验与实践,实验开发平台的实验指导书,深圳市英蓓特信息技术有限公司从实践中学嵌入式LINUX应用程序设计,华清远见嵌入式学院,培训规划教材ARM嵌入式linux培训班视频教学(14.4G)深入LINUX设备驱动程序内核机制嵌入式linux系统工程师培训标准教材2020/1/114第1章LINUX开发基础2020/1/115内容摘要Linux的诞生与发展Linux的内核结构Linux存储管理Linux进程管理Linux内核启动与初始化进程2020/1/116Linux的诞生与发展2020/1/117UNIX操作系统是美国贝尔实验室于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版本,一直到我们现在看到的4.0版本。2020/1/118Linux内核版本有两种:--稳定版和开发版Linux内核的命名机制:num.num.num--第一个数字是主版本号--第二个数字是次版本号--第三个数字是修订版本号从未停止过升级Linux的应用领域2020/1/119服务器桌面系统嵌入式应用LinuxLinux嵌入式系统开发平台2020/1/1110系统软件平台系统硬件平台嵌入式Linux系统需要下面三个基本元素:系统引导工具——用于机器加电后的系统定位引导。Linux微内核——内存管理、程序管理。始化进程但如果要它成为完整的操作系统并且继续保持小型化,还必须加上硬件驱动程序、硬件接口程序和应用程序组。选定硬件平台前,首先要确定系统的应用功能和所需要的速度,并制定好外接设备和接口标准。这样才能准确地定位所需要的硬件方案,得到性价比最高的系统。应用功能速度1外接设备接口标准2=性价比第1节Linux操作系统概述2020/1/1111建立交叉开发环境交叉编译和链接交叉调试系统测试建立交叉开发环境2020/1/1112商业类型ARMSoftwareDevelopmentToolkitSDSCrosscompilerMetrowerksCodeWarrior交叉开发环境GNU工具链交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链。开放类型交叉编译和链接在完成嵌入式软件的编码之后,就是进行编译和链接,以生成可执行代码。由于开发过程大多是在Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器这就要求在建立好的交叉开发环境中进行交叉编译和链接。2020/1/1113建立交叉开发环境交叉编译和链接交叉调试系统测试交叉调试2020/1/1114硬件调试:如果不采用在线仿真器,可以让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。软件调试:在Linux内核中设置一个调试桩用作调试过程中和宿主机之间的通信服务器。然后在宿主机中通过调试器的串口与调试桩进行通信应用软件的调试:嵌入式上层应用软件的调试可以使用本地调试和远程调试两种方法。嵌入式Linux交叉调试系统测试2020/1/1115测试技术指的是软件测试的专门途径,以及能够更加有效地运用这些途径的特定方法。在嵌入式软件测试中,常常要在基于目标机的测试和基于宿主机的测试之间做出折衷。基于目标机的测试需要消耗较多的时间和经费,而基于宿主机的测试虽然代价较小,毕竟是在仿真环境中进行的。嵌入式软件测试中经常用到的测试工具:内存分析工具性能分析工具覆盖分析工具缺陷跟踪工具嵌入式Linux面临的挑战2020/1/1116Linux的实时扩充性改变Linux内核体系结构完善Linux的集成开发环境123Solution扩展Linux的实时性能向外扩展向上扩展Linux的内核体系采用的是Monolithic内核体系结构Microkernel一个完整的嵌入式系统的集成开发环境一般需要提供的工具是:编译/连接器内核调试/跟踪器集成图形界面开发平台•编辑器•调试器•软件仿真器•监视器整体集成开发环境还有待提高和完善嵌入式Linux的发展及应用前景由于Linux具有对各种设备的广泛支持性,因此,能方便地应用于机顶盒、IA设备、PDA、掌上电脑、WAP手机、寻呼机、车载盒以及工业控制等智能信息产品中。与PC相比,手持设备、IA设备以及信息家电的市场容量要高得多,而Linux嵌入式系统的强大的生命力和利用价值,使越来越多的企业和高校表现出对它极大的研发热情。Linux嵌入式操作系统所具有的技术优势和独特的开发模式给业界以新异,有理由相信,它能成为Internet时代嵌入式操作系统中的最强音。2020/1/1117Linux内核特点2020/1/1118Linux内核编程容易可移植性可量测性模块化稳定性和可靠性安全性标准化和互用性完善的网络支持Linux内核既能支持32位体系结构又能支持64位体系结构。Linux内核全部源代码是遵守GPL软件许可的免费软件开发者可以免费得到社区的贡献、支持、检查代码和测试。驱动程序可以免费发布给其他人,可以静态编译进内核。以源码形式发布驱动程序,可以不必为每一个内核版本和补丁版本都提供二进制的程序Linux内核的组成2020/1/1119进程调度程序(SCHED)负责控制进程访CPU。保证进程能够公平地访问CPU,同时保证内核可以准时执行一些必需的硬件操作;内存管理程序(MM)使多个进程可以安全地共享机器的主存系统,并支持虚拟内存;虚拟文件系统(VFS)通过提供一个所有设备的公共文件接口,VFS抽象了不同硬件设备的细节。此外,VFS支持与其他操作系统兼容的不同的文件系统格式;网络接口(NET)提供对许多建网标准和网络硬件的访问;进程间通信(IPC)子系统为进程与进程之间的通信提供了一些机制。这5部分之间是相互依赖的关系存储管理2020/1/1120内存管理任务屏蔽各种硬件的内存结构并向上层返回统一的访问界面页式存储管理机制每个页面的大小随处理机芯片而异支持虚拟内存硬件无关部分进程的映射和逻辑内存的对换硬件相关部分为内存管理硬件提供了虚拟接口分类页表每个进程保留一张页表,用于将本进程空间中的虚拟地址变换成物理地址。进程调度2020/1/1121当需要选择下一个进程运行时,由调度程序选择最值得运行的进程,依据每个进程的task_struct结构policypriorityrt-prioritycounterpolicy是进程的调度策略两类Linux进程:普通进程与实时进程实时进程的优先级高于其他进程priority是调度管理器分配给进程的优先级是进程允许运行的时间rt_priority用于实时进程间的选择调度器使用这个域给每个实时进程一个相对优先级可以通过系统调用来改变实时进程的优先级。counter是进程剩余的时间片内核源代码目录结构2020/1/1122documentationscriptslibnetfskernelipcdriversmminitincludearch内核源代码目录结构Linux存储管理2020/1/1123进程虚存空间的管理虚存空间的映射和虚存区域的建立Linux的分页式存储管理物理内存空间的管理内存的分配与释放•内存分配与释放的数据结构•内存分配函数kmalloc()•虚拟内存的申请和释放进程虚存空间的管理2020/1/1124每一个进程,用一个mm-struct结构体来定义它的虚存用户区。mm_struct结构体首地址在任务结构体task-struct成员项mm中:structmm-struct*mm。Linux的存储管理主要是管理进程虚拟内存的用户区Linux操作系统采用了请求式分页存储管理方法。系统为每个进程提供4GB的虚拟内存空间。各个进程的虚拟内存彼此独立。进程运行时能访问的存储空间只是它的虚拟内存空间。对当前该进程而言只有属于它的虚拟内存是可见的。mm_struct结构定义在/include/linux/schedul.h中进程虚存空间的管理2020/1/1125structmm_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中进程虚存空间的管理2020/1/1126structvm_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-struct结构体进行描述虚存空间的映射和虚存区域的建立2020/1/1127虚拟存储技术•用户的代码和数据(可执行映像)等并不是完整地装入物理内存,而是全部映射到虚拟内存空间。