5-ARM-linux内核.ppt_第1页
5-ARM-linux内核.ppt_第2页
5-ARM-linux内核.ppt_第3页
5-ARM-linux内核.ppt_第4页
5-ARM-linux内核.ppt_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统开发原理与实践,陈文智 等 编著,清华大学出版社,重点大学计算机专业系列教材,ARM-Linux内核,1. ARM系统结构简介 2. ARM-Linux内存管理 3. ARM-Linux 的中断响应和处理 4. ARM-Linux系统调用 5. 系统的启动和初始化 6. ARM-Linux进程管理和调度 7. Linux的模块机制,ARM的四层含义,1、ARM是一种RISC MPU/MCU的体系结构,如同x86架构是一种CISC体系结构一样。另外,还有MIPS架构、PowerPC架构等等。 2、ARM是Advanced RISC Machine Limited公司的简称。 3、ARM

2、是Advanced RISC Machine Limited 公司的产品,该产品以IP Core(Intellectual Property Core,知识产权核)的形式提供的。 4、ARM还用以泛指许多半导体厂商买了这种设计后生产出来的“ARM处理器”系列的芯片及其衍生产品。,ARM、XScale、PXA255关系,ARM是一个体系 XSCALE是这个体系中间的一个系列 PXA255是这个体系中间的一个产品 Linux ARM-linux内核 D:sourcecodelinux_Board_DVKarcharmmach-pxa generic-pxa.c, irq-pxa.c, leds-x

3、sbase270.c, xsbase270.c D:sourcecodelinux_Board_DVKincludeasm-armarch-pxa,ARM 架构的特点,RISC 型处理器结构 变形的哈佛结构:内存和指令在逻辑上独立 提供Thumb 指令集 Thumb 指令集比通常的8 位和16 位CISC/RISC 处理 器具有更好的代码密度,而芯片面积只增加6%。可以使程序存储器更加小。 多处理器状态模式 7种运行状态 嵌入式在线仿真调试 嵌入了在线仿真 逻辑,便于通过了JTAG 来仿真调试 可以省去昂贵的在线仿真器 灵活和方便的接口 具有协处理器接口 低电压低功耗的设计,1. ARM系统结

4、构简介,ARM有7种运行状态: 用户状态(User) 中断状态(IRQ, Imterrupt Request) 快中断状态(FIQ,Fast Imterrupt Request) 监管状态(Supervisor) 终止状态(Abort) 无定义状态(Undefined) 系统状态(System),ARM系统结构中各个寄存器的使用方式,2 ARM-Linux内存管理,代码 D:sourcecodelinux_Board_DVKmm 存储管理是一个很大的范畴 存储管理机制的实现和具体的CPU以及MMU的结构关系非常紧密 操作系统内核的复杂性相当程度上来自内存管理,对整个系统的结构有着根本性的深远影

5、响,2.1内存管理和MMU,MMU,也就是“内存管理单元”,其主要作用是两个方面: 地址映射 对地址访问的保护和限制 MMU可以做在芯片中,也可以作为协处理器,2.2 冯诺依曼结构和哈佛结构,冯诺依曼结构:程序只是一种数据,对程序也可以像对数据一样加以处理,并且可以和数据存储在同一个存储器中 嵌入式系统中往往采用程序和数据两个存储器、两条总线的系统结构,称为“哈佛结构”,2.3 ARM存储管理机制,ARM系统结构中,地址映射可以是单层的按“段(section)”映射,也可以是二层的页面映射 段:1M 大页面:64KB;小页面:4KB 采用单层的段映射的时候,内存中有个“段映射表” ,当CPU访

6、问内存的时候: 其32位虚地址的高12位用作访问段映射表的下标,从表中找到相应的表项 每个表项提供一个12位的物理段地址,以及对这个段的访问许可标志,将这12位物理段地址和虚拟地址中的低20位拼接在一起,就得到了32位的物理地址,如果采用页面映射,“段映射表”就成了“首层页面映射表”,映射的过程如下: 以32位虚地址的高12位(bit20-bit31)作为访问首层映射表的下标,从表中找到相应的表项,每个表项指向一个二层映射表。 以虚拟地址中的次8位(bit12-bit19)作为访问所得二层映射表的下标,进一步从相应表项中取得20位的物理页面地址。 最后,将20位的物理页面地址和虚拟地址中的最低

7、12位拼接在一起,就得到了32位的物理地址。,凡是支持虚存的CPU必须为有关的映射表提供高速缓存,使地址映射的过程在不访问内存的前提下完成,用于这个目的高速缓存称为TLB 高速缓存 ARM系统结构中配备了两个地址映射TLB和两个高速缓存,ARM处理器中,MMU是作为协处理器CP15的一部分实现的 MMU相关的最主要的寄存器有三个: 控制寄存器,控制MMU的开关、高速缓存的开关、写缓冲区的开关等 地址转换表基地址寄存器 域访问控制寄存器,控制寄存器中有S位(表示System)和R位(表示ROM),用于决定了CPU在当前运行状态下对目标段或者页面的访问权限:,2.4 ARM-Linux存储机制的建

8、立,ARM-Linux内核也将这4GB虚拟地址空间分为两个部分 ,系统空间和用户空间 ARM将I/O也放在内存地址空间中,所以系统空间的一部分虚拟地址不是映射到物理内存,而是映射到一些I/O设备的地址,ARM处理器上的实现和x86的既相似又有很多不同: 在ARM处理器上,如果整个段(1MB,并且和1MB边界对齐)都有映射,就采用单层映射;而在x86上总是采用二层映射 ARM处理器上所谓的“段(section)”是固定长度的,实质上就是超大型的页面;而x86上的“段(segment)”则是不定长的,Xsbase255开发系统存储管理的描述数据结构:,2.5 ARM-Linux进程的虚存空间,Li

9、nux虚拟内存的实现需要6种机制的支持: 地址映射机制 内存分配回收机制 缓存和刷新机制 请求页机制 交换机制 内存共享机制,虚拟内存,系统的虚拟内存通过在各个进程之间共享内存而使得系统看起来有多于实际内存的内存容量 虚拟内存提供以下功能 广阔的地址空间 进程的保护 内存映射 公平的物理内存分配 共享虚拟内存,系统的虚拟内存可以比实际内存大很多倍,系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的,这样一个进程的运行不会影响其他进程。并且,硬件上的虚拟内存机制是被保护的,内存不能被写入,这样可以防止迷失的应用程序覆盖代码的数据。,内存映射用来把文件映射到进程的地址空间。在内

10、存映射中,文件的内容直接连接到进程的虚拟地址空间。,虽然虚拟内存允许进程拥有自己单独的虚拟地址空间,但有时可能会希望进程共享内存。,内存管理系统允许系统中每一个运行的进程都可以公平地得到系统的物理内存。,Linux内存空间分布,内核,用户,用户,用户,4GB,3GB,2GB,1GB,0GB,均含代码和数据堆栈,系统中的每个进程都各有自己的首层映射表,这就是它的空间,没有独立的空间的就只是线程而不是进程 Linux内核需要管理所有的虚拟内存地址,每个进程虚拟内存中的内容在其task_struct结构中指向的 vm_area_struct结构中描述,task_struct结构分析图 :,由于那些虚

11、拟内存区域来源各不相同,Linux使用vm_area_struct中指向一组虚拟内存处理过程的指针来抽象此接口 为进程创建新的虚拟内存区域或处理页面不在物理内存中的情况下,Linux内核重复使用进程的vm_area_struct数据结构集合 当进程请求分配虚拟内存时,Linux并不直接分配物理内存,3 ARM-Linux 的中断响应和处理,中断是一个流程,一般来说要经过三个环节: 中断响应 中断处理 中断返回 中断响应是第一个环节,主要是确定中断源,在整个中断机制中起着枢纽的作用,使CPU在响应中断的时候能迅速的确定中断源,辅助手段主要有下列几种: 中断源通过数据总线提供一个代表具体设备的数值

12、,称为“中断向量” 在外部提供一个“集线器”,称为“中断控制器” 将中断控制器集成在CPU芯片中,但是设法“挪用”或“复制”原有的若干引线,而并不实际增加引线的数量,ARM是将中断控制器集成在CPU内部的,由外设产生的中断请求都由芯片上的中断控制器汇总成一个IRQ中断请求 中断控制器还向CPU提供: 一个中断请求寄存器:可以知道终端请求来自何处 一个中断控制寄存器:可以屏蔽或连通特定中断源 GPIO是一个通用的可编程的I/O接口,其接口寄存器中的每一位都可以分别在程序的控制下设置用于输入或者输出,ARM Linux将中断源分为三组: 第一组是针对外部中断源; 第二组中是针对内部中断源,它们都来

13、自集成在芯片内部的外围设备和控制器,比如LCD控制器、串行口、DMA控制器等等。 第三组中断源使用的是一个两层结构。,在Linux中,每一个中断控制器都由strcut hw_interrut_type数据结构表示:,每一个中断请求线都有一个struct irqdesc 数据结构表示:,具体中断处理程序则在数据结构 struct irqaction 三个数据结构的相互关系如图 :,irq_descNR_IRQS,在进入中断响应之前,CPU自动完成下列操作: 将进入中断响应前的内容装入r14_irq,即中断模式的lr,使其指向中断点。 将cpsr原来的内容装入spsr_irq,即中断模式的spsr

14、;同时改变cpsr的内容使CPU运行于中断模式,并关闭中断。 将堆栈指针sp切换成中断模式的sp_irq。 将pc指向0 x18。,中断流程图:,4 ARM-Linux系统调用,arm处理器有自陷指令SWI cpu遇到自陷指令后,跳转到内核态 操作系统首先保存当前运行的信息,然后根据系统调用号查找相应的函数去执行 执行完了以后恢复原先保存的运行信息返回,实验一创建和使用一个新的系统调用,在 arch/arm/kernel/目录下创建一个新的文件mysyscall.c 在 arch/arm/kernel/call.S 中添加新的系统调用,新的系统调用号0 x900000+226 修改arch/a

15、rm/kernel/目录下的Makefile文件,在obj-y后面添加mysyscall.o,实验一创建和使用一个新的系统调用(1),一个测试程序来使用新的系统调用:,实验一创建和使用一个新的系统调用(2),然后执行 启动开发板,将应用程序test通过zmodem协议下载到开发板的文件系统目录下,在板子上运行test程序所得结果如下:,5. 系统的启动和初始化,使用bootloader将内核映像载入 内核数据结构初始化(内核引导第一部分) :start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置 ,启动init过程,创建第一个内核线程 start_kernel()函

16、数中各个主要初始化函数的功能,外设初始化-内核引导第二部分:init()函数作为内核线程,首先锁定内核,然后调用do_basic_setup()完成外设及其驱动程序的加载和初始化 外设初始化的主要过程,init进程和inittab脚本 init进程是系统所有进程的起点,它的进程号是1 inittab是以行为为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:,rc启动脚本:rc.sysinit中最常见的动作就是激活交换分区,检查磁盘,加载硬件模块 Shell的启动,6 ARM-Linux进程管理和调度,Linux进程有5种状态,分别是: TASK_RUNNING TASK_INTERR

17、UPTIBLE TASK_UNINTERRUPTIBLE TASK_ZOMBIE TASK_STOPPED,6.1 Linux进程的创建、执行和消亡,1. Linux进程的创建 系统的第一个真正的进程,init内核线程(或进程)的标志符为1 新进程通过克隆老进程或当前进程来创建,系统调用fork或clone可以创建新任务 复制完成后,Linux允许两个进程共享资源而不是复制各自的拷贝,2. Linux进程的执行 要让若干新进程按照需要处理不同的事情,就必须通过系统调用exec 函数sys_execve将可执行文件的名字从用户空间取入内核空间以后就调用do_execve( )执行具体的操作,do

18、_execve( )执行的流程: 打开可执行文件,获取该文件的 file结构。 获取参数区长度,将存放参数的页面清零。 对linux_binprm结构的其它项作初始化 通过对参数和环境个数的计算来检查是否在这方面有错误 调用prepare_binprm() 对数据结构linux_binprm作进一步准备 把一些参数(文件名、环境变量、文件参数)从用户空间复制到内核空间 调用search_binary_handler(),搜寻目标文件的处理模块并执行,3. Linux进程的消亡 进程终止由可终止进程的系统调用通过调用do_exit()实现 do_exit(long code)带一个参数code,

19、用于传递终止进程的原因,以下情况要调用do_exit()函数: 具体对应的系统调用出错,不得不终止进程 ,如: do_page_fault() sys_sigreturn() setup_frame() save_v86_state() 其他终止进程的情况,通过调用以下函数实现终止:sys_exit() sys_reboot() do_signal(),LINUX系统进程的切换包括三个层次: 用户数据的保存 寄存器数据的保存 系统层次的保存,6.2 ARM-Linux进程的调度,Linux进程调度由函数schedule()实现的,其基本流程可以概括为五步: 清理当前运行中的进程 选择下一个投入

20、运行的进程 设置新进程的运行环境 执行进程上下文切换 后期整理 Linux调度的时机有两种: 在内核应用中直接调用schedule() 等待内核时间而需要将进出那个挂起 被动调用schedule() 系统调用结束,内核态-用户态,且need_resched1,7. Linux的模块机制,模块机制的好处 编译成内核的一部分,会增加内核的大小。 如果编译成单独的子模块,可以实现按需进行加裁,模块机制(Module),Linux的单块结构(monolithic)使得其可扩展性较差 模块机制(Linux Kernel Module,LKM)提高了linux内核的可扩展性 利用linux源码编译生成内核

21、时,如某功能允许“m”选项(其他为“y”, “ n”),说明可以以模块形式存在 多数设备驱动程序以模块的方式挂接到内核 系统启动时已将若干模块挂入了内核 用户只要有权限,就可以编写模块挂入内核 模块的缺点:增加了内核管理代价,模块的设计,两个基本函数 : int init_module(void) /*used for all initialization stuff*/ . void cleanup_module(void) /*used for a clean shutdown*/ . 安装模块命令 #insmod module.o #modprobe module.o 卸载模块命令 #r

22、mmod module.o 查询系统中已装入的模块 #lsmod,Linux中的可加载模块(Module)是 Linux内核支持的动态可加载模块 insmod rmmod Linux module载入内核后,它就成为内核代码的一部分 若某个module空闲,用户便可将它卸载出内核,与module相关的命令有: lsmod 把现在 kernel 中已经安装的modules 列出来 insmod 把某个 module 安装到 kernel 中 rmmod 把某个没在用的 module 从kernel中卸载 depmod 制造 module dependency file,以告诉将来的 insmod

23、 要去哪儿找modules 来安装,module 相关的数据结构主要有 : module的声明如下:,symbol_table的声明如下:,和module相关的系统调用有:,7.1 Module的使用,Module的装入有两种方法 : 通过insmod命令手工将module载入内核 根据需要载入module(demand loaded module) kerneld 卸载module有两种方法 用户使用rmmod命令卸载module kerneld自动卸载,2.4系列内核的insmod工作的主要流程是: insmod先调用系统调用sys_get_kernel_syms,将当前加到系统中的模块和

24、内核的符号表全部输出到kernel_sym结构中,为后面使用。 将Mymodule目标文件读进insmod用户进程空间,成为一个映像。 根据第一步得到的信息,将Mymodule映像中的地址没有确定的函数和变量一一修正过来。 调用系统调用sys_create_module、sys_init_module,将Mymodule链入到系统中去,模块设计注意事项,模块设计与应用程序设计 模块是装入内核的,运行时CPU处于核心态 应用程序运行时CPU处于用户态 编译模块 设计应用程序使用的include文件:/usr/include 设计内核模块使用的include文件:/usr/src/linux-2.

25、4/include 两者如果不一致,在编译内核模块时要用-I指明include路径 设计的模块可以调用Linux内核及其他模块已经输出(exported)的函数,不能利用标准C提供的库函数如printf #more /proc/ksyms或,模块调试,printk 利用/proc文件系统或ioctl; ksyms 使用调试器 gdb kdebug 远程调试,实验二 Linux2.6内核移植,2.4.18内核、2.6内核和LynuxOS 4.0在最好情况、平均情况下和最坏情况下任务的响应时间比较:,实验二 Linux2.6内核移植(1),Linux内核移植大致可以归纳成以下几个步骤: 准备工作,

26、下载Linux2.6内核源代码和编译器源代码等 建立交叉编译环境 制作Boot Loader 修改和编译内核 制作文件系统 编写相应的设备驱动 编写应用程序,实验二 Linux2.6内核移植(2),1.准备工作 下载Linux2.6.10内核源代码,可以到 下载 ARM Linux是基于标准Linux内核为ARM做的补丁,可以在 .uk上下载,实验二 Linux2.6内核移植(3),2.编译交叉编译工具 编译linux2.6内核需要gcc3.2以上的版本 ,在这次实验中在主机平台上编译arm-linux-gcc3

27、.4.2 修改t-linux文件,在TARGET_LIBGCC2_CFLAGS加上-D_gthr_posix_h和-Dinhibit_libc 编译安装,实验二 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-,实验二 Linux2.6

28、内核移植(5),4.编译内核 使用make menuconfig配置内核 在SYSTEM TYPE目录中选择正确的CPU ,在Intel Imlementations选项中选择Intel DBPXA25X Development Platform。,在Character Devices下的选上PXA Serial Port Support选项 在General Setup下的Default Kernel command string选项中填入正确的串口名字ttyS0或ttyS1和波特率115200,实验二 Linux2.6内核移植(6),使用make zImage命令来编译内核,编译好的二进制

29、的文件zImage在/linux-2.6.10/arch/arm/boot下 把zImage拷贝到/tftpboot目录下,并下载到Xsbase255板子中运行 这时应该可以在minicom中看到有系统启动信息输出,可以看到Linux2.6内核在XSBase255开发系统跑起来:,ARM-Linux内核 编译,目的 生成一个linux内核(kernel)。 由于嵌入式系统仅有有限的内存和flash容量,需要进行裁剪,生成一个具备足够功能,而且大小又足够小的内核。,编译内核的常用命令(51),make config 内核配置,调用./scripts/Configure按照arch/i386/co

30、nfig.in来配置。 命令执行后产生文件.config,其中保存着配置信息。 下次再做该指令时,将产生新的.config文件,原文件更名为config.old,编译内核的常用命令(52),make dep 寻找依存关系。 产生两个文件.depend和.hdepend。其中,.hdepend表示每个.h文件都包含其他哪些嵌入文件。而.depend文件有多个,在每个会产生目标文件(.o)文件的目录下均有,它表示每个目标文件都依赖于哪些嵌入文件(.h)。,编译内核的常用命令(53),make clean 清除以前构核过程所产生的所有目标文件,模块文件,核心以及一些临时文件等,不产生任何文件,编译内

31、核的常用命令(54),make rmproper 删除所有以前在构核过程所产生的所有文件,即除了做make clean之外,还要删除.config,.depend等文件,把核心源码恢复到最原始的状态。下次构核的时候必须进行重新配置。,编译内核的常用命令(55),make 构核。通过各目录的Makefile文件进行,会在各目录下产生一大堆目标文件。 如果核心代码没有错误,将产生文件vmlinux,这就是所构的核心 make zImage 在Make的基础上产生压缩的核心映像文件./arch/$(ARCH)/boot/zImage。 make bzImage 在make的基础上产生压缩比例更大的核

32、心映像文件./arch/$(ARCH)/boot/bzImage。,内核编译过程,在Linux源代码的目录下: Make rmproper Make menuconfig Make dep Make zImage,内核配置项介绍,(1)code maturity level options 选择kernel代码的成熟度的部分,帮助选择开发版本层次的程序,此项提问是否将alpha版本包含到kernel中。,内核配置项介绍,(2)Loadable module support * Enable Loadable module support 利用模块可将不常用的设备驱动或功能作为模块放在内核外部,

33、必要的时候动态调用。这样可以有效地使用内存,同时减少内核的大小。 模块可以自行编译并具有独立的功能,即使需要改变模块的功能,也不用对整个内核进行修改。文件系统、设备驱动等均支持模块。 一定要选择*,(3)System Type 选择PXA270/210-based,(4)General setup 网络,总线协议,节电功能等影响整个系统的设置。 (5)Memory Technology Devies(MTD) 在嵌入式设备中为了组成固态文件系统能够(solid state filesystem)而需要的闪存、RAM和其他类似的芯片组等存储装置。 * MTD partitioning support 选择xscale270的flash设置,(6)block de

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论