您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 嵌入式Linux 七步曲
嵌入式Linux学习七步曲Sailor_forever(扬帆)自由传播版权所有翻版必究八一卦-我是whon目前就职于通信行业某外企研发中心n参与校园招聘和社会招聘的技术面试工作n5年嵌入式软件开发经验,擅长嵌入式Linux开发;n接触的软硬件平台包括ARM,DSP,PowerPC,uC/OS-II,Linux,VxWorks及OSE八一卦-我是whon嵌入式Linux七步曲学习群交流讨论资源共享n群号107900817n7steps2linux@gmail.com嵌入式水平小调查n0—3个月n3—6个月n1年左右n2年以上n多少人参加过系列交流会?5嵌入式Linux学习七步曲111333444Linux主机开发环境嵌入式Linux交叉开发环境Linux系统bootloader移植Linux的内核移植555Linux的内核及驱动开发222666文件系统制作777Linux的高级应用编程6KeyToSuccessnGoogle、Baidun理论+实践(开发板)n勤于思考,善于总结n多上相关技术论坛,他山之石可以攻玉n良好的文档撰写习惯nPassion!7CHAPTERLinux的高级应用编程8主要内容111444多进程编程多线程编程网络编程应用程序的调试技巧2223339多进程编程n进程组成n进程控制n进程间的通信机制10进程组成n何谓进程?n进程和程序的区别n进程的特性11何谓进程?n定义n由代码段(text)、用户数据段(usersegment)以及系统数据段(systemsegment)共同组成的一个动态执行环境n代码段可共享n用户数据段存放全局变量n系统数据段为进程的管理控制信息12进程和程序的区别n程序n静态对象,纯粹的数据。编译后形成的可执行代码n由代码段、数据段、BSS段等组成,是进程的一部分n进程n程序的动态实例n同一个程序可以有多个动态实例,多份拷贝13进程的特性n进程的状态n根据OS的调度处在不同的状态n进程的地址空间n用户空间n内核空间n独立栈1415进程控制n父子进程nforknExecnsystemn孤儿进程n僵尸进程16父子进程n亲缘关系n描述了系统进程创建的关系n祖先进程nLinuxrc启动脚本n/sbin/initn1号进程nps-ef17forkn功能n创建一个子进程nFork的返回值是父子进程的分岔点n对于父进程,返回值为子进程的pidn子进程,返回值0nFork产生的父子进程的关系n共享代码段n拷贝数据段和堆栈段n子进程继承父进程的所有资源n只有在数据段发生变化时才从物理上进行分离18execn功能n改变当前进程的行为,替换为另一个进程nexec产生的进程与原进程的关系n进程id不变,只留下躯壳n更新代码段,创建新的数据段和堆栈19systemn功能n在父进程里面启动一个新的命令,并等待该命令执行完成n流程n函数先调用fork()n然后再调用exec()来执行用户的登录shell,通过它来查找可执行文件的命令并分析参数nwait()函数族之一来等待子进程的结束20孤儿进程n定义n父进程先于子进程消亡,子进程即变为孤儿进程n解决办法n对系统无影响n孤儿进程将被init进程(进程号为1)所收养21僵尸进程n定义n子进程消亡时,父进程未回收task_struct资源,只剩下空壳,故为僵尸n原因n子进程结束后向父进程发出SIGCHLD信号,父进程忽略了它n父进程没有调用wait()或waitpid()函数来等待子进程的结束n解决方案n父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息n杀死父进程可以让init进程回收僵尸进程的资源2223进程间的通信机制n进程间的约束关系n通信机制的来源n通信机制的类型24进程间的约束关系n同步n指系统中一些进程需要相互合作,共同完成一项任务n互斥n由于各进程要求共享资源,但某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性n临界区n访问共享资源的代码n死锁n指多个进程互不相让,都得不到足够的资源n各进程按照相同的顺序获取互斥资源可以防止死锁25通信机制的来源26通信机制的来源nUnixIPCn管道、FIFO、信号nSystemVIPCn消息队列、信号灯、共享内存nPosixIPCn消息队列、信号灯、共享内存nsocket27通信机制的类型n管道pipen管道FIFOn共享内存n消息队列n信号灯n信号nsocket28管道pipen特点n是一种单向的数据流,一个进程写入数据另外一个进程读取数据,典型的生产者消费者模型n基于文件系统,但是其仅存在于内存中,无文件实体n在最后一个访问管道的进程终止后,管道就被自动删除n适用场合n具有亲缘关系的进程n单处理器29管道pipe30管道FIFOn特点n类似普通文件,存在文件实体n不支持lseek文件定位操作nMkfifo命令或者函数建立n可以使用路径来指示FIFOn严格的先进先出,从开始处返回数据,写入时总是将数据添加到末尾n适用场合n任意进程间的通信n单处理器31共享内存n特点n内核的专用内存区n需要访问的进程将其映射到私有地址空间n多进程直接读取内存,无需拷贝数据n因为共享,所以需要互斥,通常和信号灯配合使用n可以通过使用shmctl函数设置共享存储内存的某些标志位如SHM_LOCK、SHM_UNLOCK等来实现n适用场合n任意进程间的快速通信n单处理器32消息队列n特点n一个消息列表,用户可以添加及读取消息n类似FIFO,但可以根据msg类型实现随机读取n可根据消息类型实现不同的功能n操作类型包括创建、发送、接收及控制n消息存在于内核中,由队列id标识n适用场合n任意进程间的通信n单处理器33信号灯n特点n实现资源的互斥访问n无法携带其他更多的辅助信息n适用场合n任意进程间的互斥通信n单处理器34信号n特点n是一种异步机制,是软件层次上对中断的一种模拟n每一个进程可以自定义对信号的处理流程,甚至改变信号的行为n忽略、捕捉、默认行为nSigkill和sigstop不能忽略n适用场合n任意进程间的通信,通常用于内核向进程发送消息n单处理器35信号36socketn特点n基于套接字的编程,利用TCP/IP协议栈n可以实现任意类型的通信,消息可以自由定义n适用场合n任意进程间的通信n单处理器及多机3738主要内容111444多进程编程多线程编程网络编程应用程序的调试技巧22233339多线程编程n线程的特点nLinux的线程模型n线程的通信机制40进程和用户线程的区别n线程n进程的子集,由线程库调度,程序执行的最小单位n多线程模型设计使程序更简洁明了n更好的支持SMP以及减小上下文切换开销n进程n资源分配和管理的最小单位n具备独立的地址空间n创建销毁慢n内核调度的基本单位n上下文切换开销大41进程和用户及内核线程的区别n进程n内核调度的基本单位n包括用户空间和内核空间两部分n用户线程n线程库调度,只有用户空间n内核线程n内核调度,只有内核空间n其他和进程一样42Linux的线程模型n一对多模型43线程间的通信机制nThread-specificDatan仅供本线程使用的全局变量n互斥锁npthread_mutex_tn实现线程间的互斥访问n条件变量npthread_cond_tn利用共享的全局变量进行同步n需要和线程锁配合使用以防止竞态n信号灯n可以有多个值,主要用于同步操作n即使没有人等待灯,释放灯也是有意义的4445主要内容111444多进程编程多线程编程网络编程应用程序的调试技巧22233346网络编程n网络编程的基本流程n并发服务器的设计模型47网络编程的基本流程nTCPn演示nUDPn演示48并发服务器的设计模型n多进程n每个进程服务一个客户端。优势是有各自独立的地址空间,可靠性高,但进程调度开销大,无法资源共享,进程间通信机制复杂n多线程n每个线程服务一个客户端。优势是开销小,通信机制简单,可共享内存。但共享地址空间,可靠性低,一个服务器出现问题时可能导致系统崩溃,同时全局共享可能带来竞争,共享资源需要互斥,对编程要求高49并发服务器的设计模型n单进程selectn占有的进程及线程资源少,通信机制简单。但监听服务器及各个子服务器揉和在一起,程序结构复杂不清晰,编程麻烦5051主要内容111444多进程编程多线程编程网络编程应用程序的调试技巧22233352应用程序的调试技巧n错误打印n内存泄露检查nCoredumpn自动调用GDBn自动显示调用栈53错误打印nAbortn异常终止程序,不做清除工作nExitn正常终结目前进程的执行,并把参数status返回给父进程nAtexitn注册程序正常终止时要被调用的函数nStrerrorn返回错误原因的描述字符串nperrorn返回错误原因的描述字符串,并把它输出到标准错误输出流54错误打印n__FILE__nLog对应的源文件名n__LINE__nLog对应的行号n__FUNCTION__nLog对应的函数名55内存泄露检查n功能n检查是否有不对称的动态内存申请释放以及指针越界操作ntoolsnMtracenmemwatch56Coredumpn功能n当出现非法地址访问时会出现segmentationfault,使能coredump后会自动记录程序崩溃时的内存现场至log文件n可以利用gdb工具读取该log文件获得程序崩溃的位置及原因ntoolsnsysctl-w“kernel.core_pattern=/xx/%e-core.%p”设置产生的coredump文件的路径及命名规则ngdbEXECUTALBE_FILECORE_FILE分析coredump文件nbt打印出错的栈调用信息57自动调用GDBn功能n当出现非法地址访问时会出现segmentationfault,内核会向对应的进程发送SIGSEGV,其默认行为是打印segmentationfaultn可以改变SIGSEGV信号的默认行为,在处理函数里自动调用gdb启动调试ntoolsnGetpid获得当前运行进程的pid号n根据/proc/pidxxx/cmdline获得gdb启动时的参数n获得SIGSEGV信号自动调用“gdbaxxx”nbt打印出错的栈调用信息58自动显示调用栈n功能n嵌入式平台上一般没有gdb等调试工具,另外单步调试对于多进程多线程程序的调试不方便n当出现非法地址访问时会出现segmentationfault,可以改变SIGSEGV信号的默认行为,在处理函数里自动打印栈信息,模拟bt命令ntoolsnBacktrace获得当前函数调用的级别nbacktrace_symbols获得部分符号化的调用栈nObjdump反汇编程序,分析栈中返回地址对应的上一条指令地址5960
本文标题:嵌入式Linux 七步曲
链接地址:https://www.777doc.com/doc-5398639 .html