第5章ARMLinux内核

上传人:无*** 文档编号:178827134 上传时间:2022-12-29 格式:PPT 页数:60 大小:550.03KB
收藏 版权申诉 举报 下载
第5章ARMLinux内核_第1页
第1页 / 共60页
第5章ARMLinux内核_第2页
第2页 / 共60页
第5章ARMLinux内核_第3页
第3页 / 共60页
资源描述:

《第5章ARMLinux内核》由会员分享,可在线阅读,更多相关《第5章ARMLinux内核(60页珍藏版)》请在装配图网上搜索。

1、1ARMLinux 内核 陈文智 浙江大学计算机学院2005年5月2提纲l1.ARM系统结构简介 l2.ARM-Linux内存管理 l3.ARM-Linux 的中断响应和处理 l4.ARM-Linux系统调用l5.系统的启动和初始化 l6.ARM-Linux进程管理和调度 l7.Linux的模块机制 31.ARM系统结构简介lARM有7种运行状态:l用户状态(User)l中断状态(IRQ,Imterrupt Request)l快中断状态(FIQ,Fast Imterrupt Request)l监管状态(Supervisor)l终止状态(Abort)l无定义状态(Undefined)l系统状态(

2、System)4lARM系统结构中各个寄存器的使用方式 寄存器使用方式程序计数器pc(r15)由所有运行状态共用通用寄存器r0-r7由所有运行状态共用通用寄存器r8-r12除快中断以外所有其他运行状态共用(快中断状态有自己专用的r8-r12)当前程序状态寄存 器CPSR由所有运行状态共用保存程序状态寄存器SPSR除用户状态以外的6种运行状态,各有自己的保存程序状态寄存器SPSR堆栈指针sp(r13)和链接寄存器lr(r14)7种运行状态各有自己的sp和lr52 ARM-Linux内存管理 l存储管理是一个很大的范畴 l存储管理机制的实现和具体的CPU以及MMU的结构关系非常紧密 l操作系统内核

3、的复杂性相当程度上来自内存管理,对整个系统的结构有着根本性的深远影响 62.1内存管理和内存管理和MMU lMMU,也就是“内存管理单元”,其主要作用是两个方面:l地址映射 l对地址访问的保护和限制 lMMU可以做在芯片中,也可以作为协处理器 72.2 冯冯诺依曼结构和哈佛结构诺依曼结构和哈佛结构 l冯诺依曼结构:程序只是一种数据,对程序也可以像对数据一样加以处理,并且可以和数据存储在同一个存储器中 l嵌入式系统中往往采用程序和数据两个存储器、两条总线的系统结构,称为“哈佛结构”82.3 ARM存储管理机制存储管理机制 lARM系统结构中,地址映射可以是单层的按“段(section)”映射,也

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

5、步从相应表项中取得20位的物理页面地址。l最后,将20位的物理页面地址和虚拟地址中的最低12位拼接在一起,就得到了32位的物理地址。10l凡是支持虚存的CPU必须为有关的映射表提供高速缓存,使地址映射的过程在不访问内存的前提下完成,用于这个目的高速缓存称为TLBl高速缓存 lARM系统结构中配备了两个地址映射TLB和两个高速缓存 11lARM处理器中,MMU是作为协处理器CP15的一部分实现的 lMMU相关的最主要的寄存器有三个:l控制寄存器,控制MMU的开关、高速缓存的开关、写缓冲区的开关等l地址转换表基地址寄存器 l域访问控制寄存器 12l控制寄存器中有S位(表示System)和R位(表示

6、ROM),用于决定了CPU在当前运行状态下对目标段或者页面的访问权限:SRCPU运行在特权状态CPU运行在用户状态00不能访问不能访问10只读不能访问01只读只读11不确定不确定132.4 ARM-Linux存储机制的建立存储机制的建立 lARM-Linux内核也将这4GB虚拟地址空间分为两个部分,系统空间和用户空间 lARM将I/O也放在内存地址空间中,所以系统空间的一部分虚拟地址不是映射到物理内存,而是映射到一些I/O设备的地址 14lARM处理器上的实现和x86的既相似又有很多不同:l在ARM处理器上,如果整个段(1MB,并且和1MB边界对齐)都有映射,就采用单层映射;而在x86上总是采

7、用二层映射 lARM处理器上所谓的“段(section)”是固定长度的,实质上就是超大型的页面;而x86上的“段(segment)”则是不定长的lLinux在启动初始化的时候依次调用:start_kernel()setup_arch()pageing_init()memtable_init()create_mapping()15lXsbase255开发系统存储管理的描述数据结构:static struct map_desc xsbase255_io_desc _initdata=/*virtual physical length domain r w c b*/0 xE8000000,0 x0

8、0000000,0 x02000000,DOMAIN_IO,0,1,0,0,/片选0 CS0:Intel Strata Flash 32M 0 xF0000000,0 x04000000,0 x00100000,DOMAIN_IO,0,1,0,0,/片选1CS1:CS8900A 0 xf0110000,0 x08000000,0 x00010000,DOMAIN_IO,0,1,0,0,/片选2 CS2:Extend PORT0,扩充的GPIO 0 xf0120000,0 x08100000,0 x00010000,DOMAIN_IO,0,1,0,0,/CS2:Extend PORT1 0 xf

9、1000000,0 x0C700000,0 x00010000,DOMAIN_IO,0,1,0,0,/片选CS3:USB Host(Ez-Host);162.5 ARM-Linux进程的虚存空间 lLinux虚拟内存的实现需要6种机制的支持:l地址映射机制l内存分配回收机制l缓存和刷新机制l请求页机制l交换机制l内存共享机制 17l系统中的每个进程都各有自己的首层映射表,这就是它的空间,没有独立的空间的就只是线程而不是进程 lLinux内核需要管理所有的虚拟内存地址,每个进程虚拟内存中的内容在其task_struct结构中指向的 vm_area_struct结构中描叙 18ltask_stru

10、ct结构分析图:19l由于那些虚拟内存区域来源各不相同,Linux使用vm_area_struct中指向一组虚拟内存处理过程的指针来抽象此接口 l为进程创建新的虚拟内存区域或处理页面不在物理内存中的情况下,Linux内核重复使用进程的vm_area_struct数据结构集合 l当进程请求分配虚拟内存时,Linux并不直接分配物理内存 203 ARM-Linux 的中断响应和处理的中断响应和处理 l中断是一个流程,一般来说要经过三个环节:l中断响应l中断处理l中断返回 l中断响应是第一个环节,主要是确定中断源,在整个中断机制中起着枢纽的作用 21l使CPU在响应中断的时候能迅速的确定中断源,辅助

11、手段主要有下列几种:l中断源通过数据总线提供一个代表具体设备的数值,称为“中断向量”l在外部提供一个“集线器”,称为“中断控制器”l将中断控制器集成在CPU芯片中,但是设法“挪用”或“复制”原有的若干引线,而并不实际增加引线的数量 22lARM是将中断控制器集成在CPU内部的,由外设产生的中断请求都由芯片上的中断控制器汇总成一个IRQ中断请求l中断控制器还向CPU提供一个中断请求寄存器和一个中断控制寄存器 lGPIO是一个通用的可编程的I/O接口,其接口寄存器中的每一位都可以分别在程序的控制下设置用于输入或者输出 23lARM Linux将中断源分为三组:l第一组是针对外部中断源;l第二组中是

12、针对内部中断源,它们都来自集成在芯片内部的外围设备和控制器,比如LCD控制器、串行口、DMA控制器等等。l第三组中断源使用的是一个两层结构。24l在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

13、);void(*end)(unsigned int irq);void(*set_affinity)(unsiged int irq,unsigned long mask);25l每一个中断请求线都有一个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;

14、_cacheline_aligned irq_desc_t;26l具体中断处理程序则在数据结构 struct irqactionl三个数据结构的相互关系如图:struct hw_interrupt_typeStruct irqacton指向具体的中断服务函数irq_descNR_IRQS 27l在进入中断响应之前,CPU自动完成下列操作:l将进入中断响应前的内容装入r14_irq,即中断模式的lr,使其指向中断点。l将cpsr原来的内容装入spsr_irq,即中断模式的spsr;同时改变cpsr的内容使CPU运行于中断模式,并关闭中断。l将堆栈指针sp切换成中断模式的sp_irq。l将pc指向

15、0 x18。28l中断流程图:294 ARM-Linux系统调用系统调用 larm处理器有自陷指令SWI lcpu遇到自陷指令后,跳转到内核态l操作系统首先保存当前运行的信息,然后根据系统调用号查找相应的函数去执行l执行完了以后恢复原先保存的运行信息返回 30实验一创建和使用一个新的系统调用 l在 arch/arm/kernel/目录下创建一个新的文件mysyscall.c l在 arch/arm/kernel/call.S 中添加新的系统调用,新的系统调用号0 x900000+226 l修改arch/arm/kernel/目录下的Makefile文件,在obj-y后面添加mysyscall.

16、o 31实验一创建和使用一个新的系统调用(1)l一个测试程序来使用新的系统调用:test.h:#definesys_hello()_asm_ _volatile_(swi 0 x900000+226nt)while(0)test.c:#include#include “test.h”int main(void)printf(start hellon);sys_hello();printf(end hellon);32实验一创建和使用一个新的系统调用(2)l然后执行 l启动开发板,将应用程序test通过zmodem协议下载到开发板的文件系统目录下,在板子上运行test程序所得结果如下:#arm-

17、linux-gcc test.c-o test#./teststart hellohello worldend hello335.系统的启动和初始化系统的启动和初始化 l使用bootloader将内核映像载入 l内核数据结构初始化(内核引导第一部分):start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置,启动init过程,创建第一个内核线程 lstart_kernel()函数中各个主要初始化函数的功能 34l外设初始化-内核引导第二部分:init()函数作为内核线程,首先锁定内核,然后调用do_basic_setup()完成外设及其驱动程序的加载和初始化l外设初始

18、化的主要过程 35linit进程和inittab脚本linit进程是系统所有进程的起点,它的进程号是1 linittab是以行为为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:id:runlevel:action:process36lrc启动脚本:rc.sysinit中最常见的动作就是激活交换分区,检查磁盘,加载硬件模块lShell的启动 376 ARM-Linux进程管理和调度进程管理和调度 lLinux进程有5种状态,分别是:lTASK_RUNNING lTASK_INTERRUPTIBLE lTASK_UNINTERRUPTIBLE lTASK_ZOMBIE lTASK_ST

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

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

21、调用do_exit()函数:l具体对应的系统调用出错,不得不终止进程,如:ldo_page_fault()lsys_sigreturn()lsetup_frame()lsave_v86_state()l其他终止进程的情况,通过调用以下函数实现终止:sys_exit()sys_reboot()do_signal()43lLINUX系统进程的切换包括三个层次:l用户数据的保存 l寄存器数据的保存 l系统层次的保存 446.2 ARM-Linux进程的调度 lLinux进程调度由函数schedule()实现的,其基本流程可以概括为五步:l清理当前运行中的进程l选择下一个投入运行的进程l设置新进程的运

22、行环境l执行进程上下文切换l后期整理lLinux调度的时机有两种:l在内核应用中直接调用schedule()l被动调用schedule()457.Linux的模块机制 lLinux中的可加载模块(Module)是 Linux内核支持的动态可加载模块 lInsmodlrmmod lLinux module载入内核后,它就成为内核代码的一部分 l若某个module空闲,用户便可将它卸载出内核 46l与module相关的命令有:llsmod 把现在 kernel 中已经安装的modules 列出来linsmod 把某个 module 安装到 kernel 中lrmmod 把某个没在用的 module

23、 从kernel中卸载ldepmod 制造 module dependency file,以告诉将来的 insmod 要去哪儿找modules 来安装 47lmodule 相关的数据结构主要有:lmodule的声明如下: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;/*addr

24、ess of module*/int state;void(*cleanup)(void);/*cleanup routine*/;48lsymbol_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*/;49

25、l和module相关的系统调用有:系统调用说明Sys_create_module为模块分配空间,将模块链入系统的模块链中Sys_init_module初始化模块,修正指针使模块正常工作Sys_delete_module从系统模块链中删除模块,释放内存空间Sys_get_kernel_syms将系统的所有符号表全部取出到用户空间50 7.1 Module的使用 lModule的装入有两种方法:l通过insmod命令手工将module载入内核 l根据需要载入module(demand loaded module)l卸载module有两种方法l用户使用rmmod命令卸载modulelkerneld自

26、动卸载 51l2.4系列内核的insmod工作的主要流程是:linsmod先调用系统调用sys_get_kernel_syms,将当前加到系统中的模块和内核的符号表全部输出到kernel_sym结构中,为后面使用。l将Mymodule目标文件读进insmod用户进程空间,成为一个映像。l根据第一步得到的信息,将Mymodule映像中的地址没有确定的函数和变量一一修正过来。l调用系统调用sys_create_module、sys_init_module,将Mymodule链入到系统中去 52实验二 Linux2.6内核移植 l2.4.18内核、2.6内核和LynuxOS 4.0在最好情况、平均情

27、况下和最坏情况下任务的响应时间比较:53实验二 Linux2.6内核移植(1)lLinux内核移植大致可以归纳成以下几个步骤:l准备工作,下载Linux2.6内核源代码和编译器源代码等l建立交叉编译环境l制作Boot Loaderl修改和编译内核l制作文件系统l编写相应的设备驱动l编写应用程序 54实验二 Linux2.6内核移植(2)l1.准备工作l下载Linux2.6.10内核源代码,可以到ftp:/ftp.kernel.org 下载 lARM Linux是基于标准Linux内核为ARM做的补丁,可以在 ftp:/ftp.arm.linux.org.uk上下载 55实验二 Linux2.6

28、内核移植(3)l2.编译交叉编译工具 l编译linux2.6内核需要gcc3.2以上的版本,在这次实验中在主机平台上编译arm-linux-gcc3.4.2 l修改t-linux文件,在TARGET_LIBGCC2_CFLAGS加上-D_gthr_posix_h和-Dinhibit_libc l编译安装$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-threa

29、ds$make$make install56实验二 Linux2.6内核移植(4)l3.配置Linux2.6.10内核l首先修改Makefile,把里面的 SUBARCH:=(shell uname m|sed e s/i.86/i386/-es/sun4u/sparc64/-e s/arm.*/arm/-e s/sa110/arm/)这一行去掉,改成SUBARCH:=arml修改编译器选项:CROSS_COMPILE=arm-linux-57实验二 Linux2.6内核移植(5)l4.编译内核 l使用make menuconfig配置内核 l在SYSTEM TYPE目录中选择正确的CPU,在

30、Intel Imlementations选项中选择Intel DBPXA25X Development Platform。58l在Character Devices下的选上PXA Serial Port Support选项 l在General Setup下的Default Kernel command string选项中填入正确的串口名字ttyS0或ttyS1和波特率115200 59实验二 Linux2.6内核移植(6)l使用make zImage命令来编译内核,编译好的二进制的文件zImage在/linux-2.6.10/arch/arm/boot下 l把zImage拷贝到/tftpboot目录下,并下载到Xsbase255板子中运行 l这时应该可以在minicom中看到有系统启动信息输出 60l可以看到Linux2.6内核在XSBase255开发系统跑起来:

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

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

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


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