嵌入式系统 第5章 ARMLinux内核

上传人:真** 文档编号:243094970 上传时间:2024-09-15 格式:PPT 页数:59 大小:607KB
返回 下载 相关 举报
嵌入式系统 第5章 ARMLinux内核_第1页
第1页 / 共59页
嵌入式系统 第5章 ARMLinux内核_第2页
第2页 / 共59页
嵌入式系统 第5章 ARMLinux内核_第3页
第3页 / 共59页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,提纲,1. ARM,系统结构简介,2. ARM-Linux,内存管理,3. ARM-Linux,的中断响应和处理,4. ARM-Linux,系统调用,5.,系统的启动和初始化,6. ARM-Linux,进程管理和调度,7. Linux,的模块机制,1,1. ARM,系统结构简介,ARM,有,7,种运行状态,:,用户状态(,User,),中断状态(,IRQ, Imterrupt,Request,),快中断状态(,FIQ,Fast Imterrupt,Request,),监管状态(,Supervisor,),终止状态(,Abort,),无定义状态(,Undefined,),系统状态(,System,),2,ARM,系统结构中各个寄存器的使用方式,寄存器,使用方式,程序计数器,pc,(,r15,),由所有运行状态共用,通用寄存器,r0-r7,由所有运行状态共用,通用寄存器,r8-r12,除快中断以外所有其他运行状态共用(快中断状态有自己专用的,r8-r12,),当前程序状态寄存 器,CPSR,由所有运行状态共用,保存程序状态寄存器,SPSR,除用户状态以外的,6,种运行状态,各有自己的保存程序状态寄存器,SPSR,堆栈指针,sp,(,r13,)和链接寄存器,lr,(,r14,),7,种运行状态各有自己的,sp,和,lr,3,2 ARM-Linux,内存管理,存储管理是一个很大的范畴,存储管理机制的实现和具体的,CPU,以及,MMU,的结构关系非常紧密,操作系统内核的复杂性相当程度上来自内存管理,对整个系统的结构有着根本性的深远影响,4,2.1,内存管理和,MMU,MMU,,也就是“内存管理单元”,其主要作用是两个方面:,地址映射,对地址访问的保护和限制,MMU,可以做在芯片中,也可以作为协处理器,5,2.2,冯,诺依曼结构和哈佛结构,冯,诺依曼结构:程序只是一种数据,对程序也可以像对数据一样加以处理,并且可以和数据存储在同一个存储器中,嵌入式系统中往往采用程序和数据两个存储器、两条总线的系统结构,称为“哈佛结构”,6,2.3 ARM,存储管理机制,ARM,系统结构中,地址映射可以是单层的按“段(,section,)”映射,也可以是二层的页面映射,采用单层的段映射的时候,内存中有个“段映射表” ,当,CPU,访问内存的时候:,其,32,位虚地址的高,12,位用作访问段映射表的下标,从表中找到相应的表项,每个表项提供一个,12,位的物理段地址,以及对这个段的访问许可标志,将这,12,位物理段地址和虚拟地址中的低,20,位拼接在一起,就得到了,32,位的物理地址,7,如果采用页面映射,“段映射表”就成了“首层页面映射表”,映射的过程如下:,以,32,位虚地址的高,12,位(,bit20-bit31,)作为访问首层映射表的下标,从表中找到相应的表项,每个表项指向一个二层映射表。,以虚拟地址中的次,8,位(,bit12-bit19,)作为访问所得二层映射表的下标,进一步从相应表项中取得,20,位的物理页面地址。,最后,将,20,位的物理页面地址和虚拟地址中的最低,12,位拼接在一起,就得到了,32,位的物理地址。,8,凡是支持虚存的,CPU,必须为有关的映射表提供高速缓存,使地址映射的过程在不访问内存的前提下完成,用于这个目的高速缓存称为,TLB,高速缓存,ARM,系统结构中配备了两个地址映射,TLB,和两个高速缓存,9,ARM,处理器中,,MMU,是作为协处理器,CP15,的一部分实现的,MMU,相关的最主要的寄存器有三个:,控制寄存器,控制,MMU,的开关、高速缓存的开关、写缓冲区的开关等,地址转换表基地址寄存器,域访问控制寄存器,10,控制寄存器中有,S,位(表示,System,)和,R,位(表示,ROM,),用于决定了,CPU,在当前运行状态下对目标段或者页面的访问权限:,S,R,CPU,运行在特权状态,CPU,运行在用户状态,0,0,不能访问,不能访问,1,0,只读,不能访问,0,1,只读,只读,1,1,不确定,不确定,11,2.4 ARM-Linux,存储机制的建立,ARM-Linux,内核也将这,4GB,虚拟地址空间分为两个部分 ,系统空间和用户空间,ARM,将,I/O,也放在内存地址空间中,所以系统空间的一部分虚拟地址不是映射到物理内存,而是映射到一些,I/O,设备的地址,12,ARM,处理器上的实现和,x86,的既相似又有很多不同:,在,ARM,处理器上,如果整个段(,1MB,,并且和,1MB,边界对齐)都有映射,就采用单层映射;而在,x86,上总是采用二层映射,ARM,处理器上所谓的“段(,section,)”是固定长度的,实质上就是超大型的页面;而,x86,上的“段(,segment,)”则是不定长的,Linux,在启动初始化的时候依次调用:,start_kernel()setup_arch()pageing_init()memtable_init()create_mapping,(),13,Xsbase255,开发系统存储管理的描述数据结构:,static struct map_desc xsbase255_io_desc _initdata,= ,/* virtual physical length domain r w c b */, 0xE8000000, 0x00000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 , /,片选,0 CS0 : Intel Strata Flash 32M, 0xF0000000, 0x04000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 , /,片选,1CS1 : CS8900A, 0xf0110000, 0x08000000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 , /,片选,2 CS2 : Extend PORT0,扩充的,GPIO, 0xf0120000, 0x08100000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 , / CS2 : Extend PORT1, 0xf1000000, 0x0C700000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 , /,片选,CS3 : USB Host(Ez,-Host),;,14,2.5 ARM-Linux,进程的虚存空间,Linux,虚拟内存的实现需要,6,种机制的支持:,地址映射机制,内存分配回收机制,缓存和刷新机制,请求页机制,交换机制,内存共享机制,15,系统中的每个进程都各有自己的首层映射表,这就是它的空间,没有独立的空间的就只是线程而不是进程,Linux,内核需要管理所有的虚拟内存地址,每个进程虚拟内存中的内容在其,task_struct,结构中指向的,vm_area_struct,结构中描叙,16,task_struct,结构分析图,:,17,由于那些虚拟内存区域来源各不相同,,Linux,使用,vm_area_struct,中指向一组虚拟内存处理过程的指针来抽象此接口,为进程创建新的虚拟内存区域或处理页面不在物理内存中的情况下,,Linux,内核重复使用进程的,vm_area_struct,数据结构集合,当进程请求分配虚拟内存时,,Linux,并不直接分配物理内存,18,3 ARM-Linux,的中断响应和处理,中断是一个流程,一般来说要经过三个环节:,中断响应,中断处理,中断返回,中断响应是第一个环节,主要是确定中断源,在整个中断机制中起着枢纽的作用,19,使,CPU,在响应中断的时候能迅速的确定中断源,辅助手段主要有下列几种:,中断源通过数据总线提供一个代表具体设备的数值,称为“中断向量”,在外部提供一个“集线器”,称为“中断控制器”,将中断控制器集成在,CPU,芯片中,但是设法“挪用”或“复制”原有的若干引线,而并不实际增加引线的数量,20,ARM,是将中断控制器集成在,CPU,内部的,由外设产生的中断请求都由芯片上的中断控制器汇总成一个,IRQ,中断请求,中断控制器还向,CPU,提供一个中断请求寄存器和一个中断控制寄存器,GPIO,是一个通用的可编程的,I/O,接口,其接口寄存器中的每一位都可以分别在程序的控制下设置用于输入或者输出,21,ARM Linux,将中断源分为三组:,第一组是针对外部中断源;,第二组中是针对内部中断源,它们都来自集成在芯片内部的外围设备和控制器,比如,LCD,控制器、串行口、,DMA,控制器等等。,第三组中断源使用的是一个两层结构。,22,在,Linux,中,每一个中断控制器都由,strcut hw_interrut_type,数据结构表示:,struct hw_interrupt_type,const char * typename,;,unsigned int (*startup)(unsigned int irq,);,void (*shutdown)(unsigned int irq,);,void (*enable)(unsigned int irq,);,void (*ack)(unsigned int irq,);,void (*end)(unsigned int irq,);,void (*set_affinity)(unsiged int irq,unsigned,long mask);,;,23,每一个中断请求线都有一个,struct irqdesc,数据结构表示:,typedef struct,unsigned int,status; /* IRQ status */,hw_irq_controller,*handler;,struct irqaction,*action; /*IRQ action list */,unsigned int depth; /* nested irq,disables */,spinlock_t,lock;,_cacheline_aligned irq_desc_t,;,24,具体中断处理程序则在数据结构,struct irqaction,三个数据结构的相互关系如图 :,struct hw_interrupt_type,Struct irqacton,指向具体的中断服务函数,irq_descNR_IRQS,25,在进入中断响应之前,,CPU,自动完成下列操作:,将进入中断响应前的内容装入,r14_irq,,即中断模式的,lr,,使其指向中断点。,将,cpsr,原来的内容装入,spsr_irq,,即中断模式的,spsr,;同时改变,cpsr,的内容使,CPU,运行于中断模式,并关闭中断。,将堆栈指针,sp,切换成中断模式的,sp_irq,。,将,pc,指向,0x18,。,26,中断流程图:,27,4 ARM-Linux,系统调用,arm,处理器有自陷指令,SWI,cpu,遇到自陷指令后,跳转到内核态,操作系统首先保存当前运行的信息,然后根据系统调用号查找相应的函数去执行,执行完了以后恢复原先保存的运行信息返回,28,实验一创建和使用一个新的系统调用,在,arch/arm/kernel/,目录下创建一个新的文件,mysyscall.c,在,arch/arm/kernel/call.S,中添加新的系统调用,新的系统调用号,0x900000+226,修改,arch/arm/kernel/,目录下的,Makefile,文件,在,obj-y,后面添加,mysyscall.o,29,实验一创建和使用一个新的系统调用,(1),一个测试程序来使用新的系统调用:,test.h,:,#definesys_hello()_asm_ _volatile_ (swi,0x900000+226nt)while(0),test.c,:,#include ,#include “test.h,”,int main(void,),printf(start,hellon);,sys_hello,();,printf(end,hellon);,30,实验一创建和使用一个新的系统调用,(2),然后执行,启动开发板,将应用程序,test,通过,zmodem,协议下载到开发板的文件系统目录下,在板子上运行,test,程序所得结果如下:,# arm-linux-gcc test.c,-o test,# ./test,start hello,hello world,end hello,31,5.,系统的启动和初始化,使用,bootloader,将内核映像载入,内核数据结构初始化(内核引导第一部分) :,start_kernel,(),中调用了一系列初始化函数,以完成,kernel,本身的设置 ,启动,init,过程,创建第一个内核线程,start_kernel,(),函数中各个主要初始化函数的功能,32,外设初始化,-,内核引导第二部分:,init(),函数作为内核线程,首先锁定内核,然后调用,do_basic_setup,(),完成外设及其驱动程序的加载和初始化,外设初始化的主要过程,33,init,进程和,inittab,脚本,init,进程是系统所有进程的起点,它的进程号是,1,inittab,是以行为为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:,id:runlevel:action:process,34,rc,启动脚本:,rc.sysinit,中最常见的动作就是激活交换分区,检查磁盘,加载硬件模块,Shell,的启动,35,6 ARM-Linux,进程管理和调度,Linux,进程有,5,种状态,分别是:,TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_UNINTERRUPTIBLE,TASK_ZOMBIE,TASK_STOPPED,36,6.1 Linux,进程的创建、执行和消亡,1. Linux,进程的创建,系统的第一个真正的进程,,init,内核线程(或进程)的标志符为,1,新进程通过克隆老进程或当前进程来创建,系统调用,fork,或,clone,可以创建新任务,复制完成后,,Linux,允许两个进程共享资源而不是复制各自的拷贝,37,2. Linux,进程的执行,要让若干新进程按照需要处理不同的事情,就必须通过系统调用,exec,函数,sys_execve,将可执行文件的名字从用户空间取入内核空间以后就调用,do_execve,( ),执行具体的操作,38,do_execve,( ),执行的流程,:,打开可执行文件,获取该文件的,file,结构。,获取参数区长度,将存放参数的页面清零。,对,linux_binprm,结构的其它项作初始化,通过对参数和环境个数的计算来检查是否在这方面有错误,调用,prepare_binprm,(),对数据结构,linux_binprm,作进一步准备,把一些参数,(,文件名、环境变量、文件参数,),从用户空间复制到内核空间,调用,search_binary_handler,(),,搜寻目标文件的处理模块并执行,39,3. Linux,进程的消亡,进程终止由可终止进程的系统调用通过调用,do_exit,()实现,do_exit(long,code),带一个参数,code,,用于传递终止进程的原因,40,以下情况要调用,do_exit,(),函数:,具体对应的系统调用出错,不得不终止进程 ,如:,do_page_fault,(),sys_sigreturn,(),setup_frame,(),save_v86_state,(),其他终止进程的情况,通过调用以下函数实现终止:,sys_exit,(),sys_reboot() do_signal,(),41,LINUX,系统进程的切换包括三个层次,:,用户数据的保存,寄存器数据的保存,系统层次的保存,42,6.2 ARM-Linux,进程的调度,Linux,进程调度由函数,schedule(),实现的,其基本流程可以概括为五步:,清理当前运行中的进程,选择下一个投入运行的进程,设置新进程的运行环境,执行进程上下文切换,后期整理,Linux,调度的时机有两种:,在内核应用中直接调用,schedule(),被动调用,schedule(),43,7. Linux,的模块机制,Linux,中的可加载模块,(Module),是,Linux,内核支持的动态可加载模块,Insmod,rmmod,Linux module,载入内核后,它就成为内核代码的一部分,若某个,module,空闲,用户便可将它卸载出内核,44,与,module,相关的命令有:,lsmod,把现在,kernel,中已经安装的,modules,列出来,insmod,把某个,module,安装到,kernel,中,rmmod,把某个没在用的,module,从,kernel,中卸载,depmod,制造,module dependency file,,以告诉将来的,insmod,要去哪儿找,modules,来安装,45,module,相关的数据结构,主要有,:,module,的声明如下:,struct,module ,struct,module *next;,struct module_ref,*ref; /* the list of modules that refer to me */,struct symbol_table *symtab,;,const char *name;,int,size; /* size of module in pages */,void* addr,; /* address of module */,int,state;,void (*cleanup)(void,); /* cleanup routine */,;,46,symbol_table,的声明如下:,struct symbol_table,int,size; /* total, including string table! */,int n_symbols,;,int n_refs,;,struct internal_symbol symbol0; /* actual size defined by n_symbols,*/,struct module_ref ref0; /* actual size defined by n_refs,*/,;,47,和,module,相关的系统调用有:,系统调用,说明,Sys_create_module,为模块分配空间,将模块链入系统的模块链中,Sys_init_module,初始化模块,修正指针使模块正常工作,Sys_delete_module,从系统模块链中删除模块,释放内存空间,Sys_get_kernel_syms,将系统的所有符号表全部取出到用户空间,48,7.1 Module,的使用,Module,的装入有两种方法 :,通过,insmod,命令手工将,module,载入内核,根据需要载入,module(demand,loaded module),卸载,module,有两种方法,用户使用,rmmod,命令卸载,module,kerneld,自动卸载,49,2.4,系列内核的,insmod,工作的主要流程是:,insmod,先调用系统调用,sys_get_kernel_syms,,将当前加到系统中的模块和内核的符号表全部输出到,kernel_sym,结构中,为后面使用。,将,Mymodule,目标文件读进,insmod,用户进程空间,成为一个映像。,根据第一步得到的信息,将,Mymodule,映像中的地址没有确定的函数和变量一一修正过来。,调用系统调用,sys_create_module,、,sys_init_module,,将,Mymodule,链入到系统中去,50,实验二,Linux2.6,内核移植,2.4.18,内核、,2.6,内核和,LynuxOS,4.0,在最好情况、平均情况下和最坏情况下任务的响应时间比较:,51,实验二,Linux2.6,内核移植(,1,),Linux,内核移植大致可以归纳成以下几个步骤:,准备工作,下载,Linux2.6,内核源代码和编译器源代码等,建立交叉编译环境,制作,Boot Loader,修改和编译内核,制作文件系统,编写相应的设备驱动,编写应用程序,52,实验二,Linux2.6,内核移植(,2,),1.,准备工作,下载,Linux2.6.10,内核源代码,可以到,ftp:/ftp.kernel.org,下载,ARM Linux,是基于标准,Linux,内核为,ARM,做的补丁,可以在,ftp:/ftp.arm.linux.org.uk,上下载,53,实验二,Linux2.6,内核移植(,3,),2.,编译交叉编译工具,编译,linux2.6,内核需要,gcc3.2,以上的版本 ,在这次实验中在主机平台上编译,arm-linux-gcc3.4.2,修改,t-linux,文件,在,TARGET_LIBGCC2_CFLAGS,加上,-D_gthr_posix_h,和,-Dinhibit_libc,编译安装,$cd,gcc-3.4.2,$./configure -target=arm-linux -prefix=/arm-linux,-with-headers=/root/linux-2.6.10/include -enable-languages=c -disable-shared -disable-threads,$make,$make install,54,实验二,Linux2.6,内核移植(,4,),3.,配置,Linux2.6.10,内核,首先修改,Makefile,,把里面的,SUBARCH :=(shell uname m | sed,e s/i.86/i386/ -es/sun4u/sparc64/ -e s/arm. */arm/ -e s/sa110/arm/),这一行去掉,改成,SUBARCH : =arm,修改编译器选项,:CROSS_COMPILE =arm-linux,-,55,实验二,Linux2.6,内核移植(,5,),4.,编译内核,使用,make menuconfig,配置内核,在,SYSTEM TYPE,目录中选择正确的,CPU,,在,Intel Imlementations,选项中选择,Intel DBPXA25X Development Platform,。,56,在,Character Devices,下的选上,PXA Serial Port Support,选项,在,General Setup,下的,Default Kernel command string,选项中填入正确的串口名字,ttyS0,或,ttyS1,和波特率,115200,57,实验二,Linux2.6,内核移植(,6,),使用,make zImage,命令来编译内核,编译好的二进制的文件,zImage,在,/linux-2.6.10/arch/arm/boot,下,把,zImage,拷贝到,/tftpboot,目录下,并下载到,Xsbase255,板子中运行,这时应该可以在,minicom,中看到有系统启动信息输出,58,可以看到,Linux2.6,内核在,XSBase255,开发系统跑起来:,59,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!