,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式操作系统原理,嵌入式操作系统原理,1,嵌入式LINUX操作系统开发,体系结构概览,进程与调度管理,内存管理,文件系统,系统调用,嵌入式LINUX操作系统开发体系结构概览,2,体系结构概览,体系结构概览,3,体系结构概览,内核的功能,进程控制(process management),内存管理(Memory management),文件系统管理(Filesystem management),设备驱动程序(Device control),网络(Networking),体系结构概览内核的功能,4,内核层次,内核在系统中的位置,用户进程,系统调用接口,内核,硬件,什么是Linux内核?,从程序员的角度,从用户的角度,内核层次内核在系统中的位置,5,系统调用,内核提供的一套C语言函数库称为系统调用,应用程序使用系统调用完成编程任务,系统调用分类,进程管理,进程间通信(IPC),文件系统管理,网络编程(Socket),系统调用内核提供的一套C语言函数库称为系统调用,6,Linux结构,Linux结构,7,Linux进程管理,Linux是一个多任务多用户操作系统,一个任务(task)就是一个进程(process),每一个进程都具有一定的功能和权限,它们都运行在各自独立的虚拟地址空间。,在Linux中,进程是系统资源分配的基本单位,也是使用CPU运行的基本调度单位。,Linux进程管理Linux是一个多任务多用户操作系统,8,Linux进程概述,程序映像,存放在磁盘上的可执行文件的代码和数据的集合称为可执行映象(Executable Image),即程序,当一个程序(可执行映象)装入系统中运行时,它就形成了一个进程,进程映像,进程是由正文段(text)、用户数据段(user segment)和系统数据段(system segment)组成的一个动态实体。,正文段中存放着进程要执行的指令代码,具有只读的属性,,用户数据段是进程在运行过程中处理数据的集合,它们是进程直接进行操作的所有数据,以及进程使用的进程堆栈。,系统数据段存放着进程的控制信息。其中包括进程控制块PCB。,Linux进程概述 程序映像,9,进程控制块PCB,进程控制块PCB是名字为task_struct的数据结构,称为任务结构体,任务结构体中容纳了一个进程的所有信息,是系统对进程进行管理和控制的有效手段,是系统实现进程调度的主要依据,当一个进程被创建时,系统就为该进程建立一个task_struct任务结构体。当进程运行结束时,系统撤消该进程的任务结构体,Linux在内存空间中开辟了一个专门的区域存放所有进程的任务结构体,在操作系统的内核空间设置了一个task数组,该数组的每一个元素是一个指向任务结构体的指针,所以task数组又称为task向量。,进程的任务结构体是进程存在的唯一标志,调度程序维护current指针,它指向当前正在运行的进程。,进程控制块PCB进程控制块PCB是名字为task_struc,10,Linux调度分析,Linux进程的状态变化,Linux调度分析Linux进程的状态变化,11,进程状态,运行态:进程正在使用CPU运行的状态。处于运行态的进程又称为当前进程(current process),可运行态:进程已分配到除CPU外所需要的其它资源,等待系统把CPU分配给它之后即可投入运行,等待态:又称睡眠态,它是进程正在等待某个事件或某个资源时所处的状态。等待态进一步分为可中断的等待态和不可中断的等待态。处于可中断等待态的进程可以由信号(signal)解除其等待态。处于不可中断等待态的进程,一般是直接或间接等待硬件条件。它只能用特定的方式来解除,例如使用唤醒函数wake_up()等,暂停态:进程需要接受某种特殊处理而暂时停止运行所处的状态。通常进程在接受到外部进程的某个信号进入暂停态,例如,正在接受调试的进程就处于这种状态。,僵死态:进程的运行已经结束,但它的任务结构体仍在系统中。,进程状态运行态:进程正在使用CPU运行的状态。处于运行态的进,12,核心态和用户态,Linux的进程处理机上运行时,处理机提供了两种不同的的执行状态,核心态(kernel mode)和用户态(user mode)。,核心态又称系统态,它具有较高的特权,能执行所有的机器指令,包括由操作系统执行的特权指令,能访问所有的寄存器和存储区域,能直接控制所有的系统资源。Linux在执行内核程序时是处于核心态下。,用户态是进程的普通执行状态,在用户态下进程具有较低的特权,只能执行规定的机器指令,不能执行特权指令。进程在用户态下只能访问进程的存储空间。在用户态下进程不能与系统硬件相互作用,不能访问系统资源。,核心态和用户态Linux的进程处理机上运行时,处理机提供了两,13,Linux进程调度方式,Linux系统采用抢占调度方式,又称可剥夺调度方式。采用这种调度方式时,对于当前运行的进程而言,当有更紧急的进程到来时,系统将剥夺当前进程使用处理机的权利,立即停止它在处理机上的运行,而把处理机分配给那个更紧急的进程。,Linux采用时间片轮转法。对某个运行中的进程,当它的时间片用完时,系统将停止它的运行并把处理机分配给其它进程。,Linux进程调度方式Linux系统采用抢占调度方式,又称可,14,Linux进程调度方法,Linux进程调度采用动态优先级法,调度对象是可运行队列,,可运行队列中优先级大的进程首先得到CPU投入运行。,进程在运行中,counter的代表进程的动态优先级。,Linux采取了加权的方法来保证实时进程优先于普通进程。,Linux进程调度方法Linux进程调度采用动态优先级法,调,15,进程调度时机,时机1进程状态发生变化时。,处于运行态下的进程要等待某种资源,,运行态下的进程在程序执行完毕后,一般通过调用内核函数do_exit()终止运行并转入僵死态。,处于等待态的进程被唤醒后,将加入到可运行队列中时。,进程从运行态转入暂停态时。,进程从暂停态成为可运行态时。,时机2当前进程时间片用完时。,时机3进程从系统调用返回到用户态时。,时机4中断处理后,进程返回到用户态时。,进程调度时机时机1进程状态发生变化时。,16,Linux内存管理模式,MMU内存管理,MMU是内存管理单元,内存的管理单位是页(page),通常是4K或8K,虚拟地址与物理地址,物理地址可以位于RAM/FLASH/DISK,经过MMU,虚拟地址可以转化成物理地址,MMU可以在转换过程中检查权限,以保护内存不受非法访问,如果没有MMU,进程与内核之间无法隔离和保护,系统容易崩溃,17,Linux内存管理模式MMU内存管理,17,Linux的三级目录,Linux采用三级目录底层MMU支持实现存储管理,可以适应64/32位CPU,三级目录是页面目录、中间目录和页表,Linux的三级目录Linux采用三级目录底层MMU支持实,18,进程空间和内核空间,进程名义上有4G的空间,实际上只有3G属于进程本身,虚拟系统空间占据高位1G,进程空间和内核空间进程名义上有4G的空间,19,Linux内核启动分析,搭建开发环境,宿主机和目标机,交叉编译,编译引导程序(u-boot或者vivi),编译内核(mizi linux),编译根文件系统,使用JTAG将编译好的映像写入目标板,可以写入到Nor Flash当中,可以写入到Nand Flash当中,Linux内核启动分析搭建开发环境,20,Linux内核启动分析,上电,CPU根据设置读取Flash中的Bootloader,Bootloader作两段式加载,Bootload将控制权移交给内核,Bootloader事先检测硬件参数,例如物理地址,Bootloader加载压缩的内核映像,内核自解压,内核将自身定位到正确的物理地址,Linux内核启动分析上电,21,内核启动流程,执行init初始化进程,启动一个shell,执行启动脚本文件,显示登录提示符等待登录,内核启动流程执行init初始化进程,22,嵌入式LINUX操作系统内核,选择内核,内核配置,编译内核,安装内核,嵌入式LINUX操作系统内核选择内核,23,Linux内核源码,内核目录结构:,/usr/src/Linux-*,/arch(重点),/drivers,/fs,/include,/init,/ipc,/kernel,/mm,/net,Linux内核源码内核目录结构:,24,内核配置,进入到内核源代码目录,cd/usr/src/linux-2.*,make config,make xconfig,make menuconfig,make,内核配置进入到内核源代码目录,25,编译生成的文件,vmlinux,未压缩的Linux内核,varch/boot/zImage,经zlib压缩后的Linux内核,varch/boot/bzImage,经zlib压缩后的Linux内核,b是指big,压缩狠,/boot/vmlinuz-,经zlib压缩后的Linux内核,编译生成的文件vmlinux,26,编译生成的文件,v/boot/System.map-,内核符号地址,/boot/initrd-.img,ramdisk,要挂载的根文件系统,/lib/modules/,模块,vmodules.dep,模块依赖文件,编译生成的文件v/boot/System.map-vers,27,裁剪Linux,目的是创建嵌入式Linux,嵌入式硬件资源有限,所以要裁剪软件,裁剪的对象包括:,Linux内核,库,守护进程,GUI,裁剪Linux目的是创建嵌入式Linux,28,裁剪Linux,选择合适的文件系统,ext2,ext3,jffs2,模块机制,网络协议,无用的驱动程序,调试信息,裁剪的技术要求,能省就省,能小就小,能快就快,裁剪Linux选择合适的文件系统,29,安装内核,移植相关的文件,相关文件和目录,arch/arm/config.in,arch/arm/Makefile,arch/arm/boot/Makefile,arch/arm/mach-s3c2410/*,include/asm-arm/arch-s3c2410/*,arch/arm/tools/mach-types,arch/arm/boot/compressed/head-s3c2410.S,arch/arm/boot/compressed/Makefile,安装内核移植相关的文件,30,嵌入式Linux内核调试,Printk(),Oops消息,/proc文件系统,Kgdb,追踪工具(strace,ltt,gprof,gcov,memwatch),嵌入式Linux内核调试Printk(),31,Linux调试工具,Linux系统察看和调参,/proc文件系统,用户空间工具,:,内存工具:MEMWATCH 和 YAMD,strace,GNU 调试器(gdb),内核工具,:,内核源代码级调试器(kgdb),内建内核调试器(kdb),Oops,Linux调试工具Linux系统察看和调参,32,/proc文件系统,/proc内存文件系统,记录系统相关信息,可以直接使用cat得到相关信息,也可以编程通过文件方式得到相关信息,/proc文件系统/proc内存文件系统,记录系统相关信息,33,通过/proc获取进程信息,找到相关进程号,找到相关/proc子目录,获取特定参数,通过/proc获取进程信息找到相关进程号,34,通过/proc获取硬件信息,找到相关硬件标识,在/proc中找到相关硬件目录,查找特定硬件信息,通过/proc获取硬件信息找到相关硬件标识,35,通过/proc获取内核信息,内核信息一般存放于/proc/sys,可以读取相关内核信息,也可以修改内核参数来对内核调优,修改内核一定要慎重!,通过/proc获取内核信息内核信息一般存放于/proc/sy,36,/proc获取文件系统信息