第5章ARMLinux内核.ppt

上传人:本田雅阁 文档编号:2113292 上传时间:2019-02-16 格式:PPT 页数:60 大小:550.02KB
返回 下载 相关 举报
第5章ARMLinux内核.ppt_第1页
第1页 / 共60页
第5章ARMLinux内核.ppt_第2页
第2页 / 共60页
第5章ARMLinux内核.ppt_第3页
第3页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第5章ARMLinux内核.ppt》由会员分享,可在线阅读,更多相关《第5章ARMLinux内核.ppt(60页珍藏版)》请在三一文库上搜索。

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

2、无定义状态(Undefined) l系统状态(System) 3 lARM系统结构中各个寄存器的使用方式 寄存器使用方式 程序计数器pc(r15)由所有运行状态共用 通用寄存器r0-r7由所有运行状态共用 通用寄存器r8-r12除快中断以外所有其他运行状态共用(快中断状态有自 己专用的r8-r12) 当前程序状态寄存 器CPSR 由所有运行状态共用 保存程序状态寄存器 SPSR 除用户状态以外的6种运行状态,各有自己的保存程序状 态寄存器SPSR 堆栈指针sp(r13)和 链接寄存器lr(r14) 7种运行状态各有自己的sp和lr 4 2 ARM-Linux内存管理 l存储管理是一个很大的范畴

3、 l存储管理机制的实现和具体的CPU以及 MMU的结构关系非常紧密 l操作系统内核的复杂性相当程度上来自 内存管理,对整个系统的结构有着根本 性的深远影响 5 2.1内存管理和MMU lMMU,也就是“内存管理单元”,其主要 作用是两个方面: l地址映射 l对地址访问的保护和限制 lMMU可以做在芯片中,也可以作为协处 理器 6 2.2 冯诺依曼结构和哈佛结构 l冯诺依曼结构:程序只是一种数据,对 程序也可以像对数据一样加以处理,并 且可以和数据存储在同一个存储器中 l嵌入式系统中往往采用程序和数据两个 存储器、两条总线的系统结构,称为“哈 佛结构” 7 2.3 ARM存储管理机制 lARM系

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

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

6、写缓冲区的开关等 l地址转换表基地址寄存器 l域访问控制寄存器 11 l控制寄存器中有S位(表示System)和R位( 表示ROM),用于决定了CPU在当前运行状 态下对目标段或者页面的访问权限: SRCPU运行在特权 状态 CPU运行在用户 状态 00不能访问不能访问 10只读不能访问 01只读只读 11不确定不确定 12 2.4 ARM-Linux存储机制的建立 lARM-Linux内核也将这4GB虚拟地址空 间分为两个部分 ,系统空间和用户空间 lARM将I/O也放在内存地址空间中,所 以系统空间的一部分虚拟地址不是映射 到物理内存,而是映射到一些I/O设备的 地址 13 lARM处理器

7、上的实现和x86的既相似又 有很多不同: l在ARM处理器上,如果整个段(1MB,并且和1MB边界对齐 )都有映射,就采用单层映射;而在x86上总是采用二层映 射 lARM处理器上所谓的“段(section)”是固定长度的,实质上 就是超大型的页面;而x86上的“段(segment)”则是不定长 的 lLinux在启动初始化的时候依次调用: start_kernel()setup_arch()pageing_in it()memtable_init()create_mapping() 14 lXsbase255开发系统存储管理的描述数据结构 : static struct map_desc x

8、sbase255_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,

9、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) ; 15 2.5 ARM-Linux进程的虚存空间 lLinux虚拟内存的实现需要6种机制的支 持: l地址映射机制 l内存分配回收机制 l缓存和刷新机制 l请求页机制 l交换机制 l

10、内存共享机制 16 l系统中的每个进程都各有自己的首层映 射表,这就是它的空间,没有独立的空 间的就只是线程而不是进程 lLinux内核需要管理所有的虚拟内存地址 ,每个进程虚拟内存中的内容在其 task_struct结构中指向的 vm_area_struct结构中描叙 17 ltask_struct结构分析图 : 18 l由于那些虚拟内存区域来源各不相同, Linux使用vm_area_struct中指向一组虚 拟内存处理过程的指针来抽象此接口 l为进程创建新的虚拟内存区域或处理页 面不在物理内存中的情况下,Linux内核 重复使用进程的vm_area_struct数据结 构集合 l当进程请

11、求分配虚拟内存时,Linux并不 直接分配物理内存 19 3 ARM-Linux 的中断响应和处理 l中断是一个流程,一般来说要经过三个 环节: l中断响应 l中断处理 l中断返回 l中断响应是第一个环节,主要是确定中 断源,在整个中断机制中起着枢纽的作 用 20 l使CPU在响应中断的时候能迅速的确定 中断源,辅助手段主要有下列几种: l中断源通过数据总线提供一个代表具体设 备的数值,称为“中断向量” l在外部提供一个“集线器”,称为“中断控制 器” l将中断控制器集成在CPU芯片中,但是设 法“挪用”或“复制”原有的若干引线,而并不 实际增加引线的数量 21 lARM是将中断控制器集成在C

12、PU内部的 ,由外设产生的中断请求都由芯片上的 中断控制器汇总成一个IRQ中断请求 l中断控制器还向CPU提供一个中断请求 寄存器和一个中断控制寄存器 lGPIO是一个通用的可编程的I/O接口, 其接口寄存器中的每一位都可以分别在 程序的控制下设置用于输入或者输出 22 lARM Linux将中断源分为三组: l第一组是针对外部中断源; l第二组中是针对内部中断源,它们都来自 集成在芯片内部的外围设备和控制器,比 如LCD控制器、串行口、DMA控制器等等 。 l第三组中断源使用的是一个两层结构。 23 l在Linux中,每一个中断控制器都由strcut hw_interrut_type数据结构

13、表示: 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); ; 24 l每一个中断请求线都

14、有一个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; 25 l具体中断处理程序则在数据结构 struct irqaction l三个数据结构的相互关系如图

15、: struct hw_interrupt_ty pe Struct irqacton 指向具体的中断服务 函数 irq_descNR_IRQS 26 l在进入中断响应之前,CPU自动完成下 列操作: l将进入中断响应前的内容装入r14_irq,即 中断模式的lr,使其指向中断点。 l将cpsr原来的内容装入spsr_irq,即中断模 式的spsr;同时改变cpsr的内容使CPU运行 于中断模式,并关闭中断。 l将堆栈指针sp切换成中断模式的sp_irq。 l将pc指向0x18。 27 l中断流程图: 28 4 ARM-Linux系统调用 larm处理器有自陷指令SWI lcpu遇到自陷指令后

16、,跳转到内核态 l操作系统首先保存当前运行的信息,然 后根据系统调用号查找相应的函数去执 行 l执行完了以后恢复原先保存的运行信息 返回 29 实验一创建和使用一个新的系统调用 l在 arch/arm/kernel/目录下创建一个新的 文件mysyscall.c l在 arch/arm/kernel/call.S 中添加新的系 统调用,新的系统调用号 0x900000+226 l修改arch/arm/kernel/目录下的Makefile 文件,在obj-y后面添加mysyscall.o 30 实验一创建和使用一个新的系统调用 (1) l一个测试程序来使用新的系统调用: test.h: #de

17、finesys_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“); 31 实验一创建和使用一个新的系统调用 (2) l然后执行 l启动开发板,将应用程序test通过zmodem 协议下载到开发板的文件系统目录下,在板 子上运行test程序所得结果如下: # arm-linux-gcc test.c -o test # ./

18、test start hello hello world end hello 32 5. 系统的启动和初始化 l使用bootloader将内核映像载入 l内核数据结构初始化(内核引导第一部 分) :start_kernel()中调用了一系列初 始化函数,以完成kernel本身的设置 , 启动init过程,创建第一个内核线程 lstart_kernel()函数中各个主要初始化函 数的功能 33 l外设初始化-内核引导第二部分:init() 函数作为内核线程,首先锁定内核,然 后调用do_basic_setup()完成外设及其 驱动程序的加载和初始化 l外设初始化的主要过程 34 linit进程和

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

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

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

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

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

24、ule 安装到 kernel 中 lrmmod 把某个没在用的 module 从kernel中卸载 ldepmod 制造 module dependency file,以告诉将 来的 insmod 要去哪儿找modules 来安装 46 lmodule 相关的数据结构主要有 : lmodule的声明如下: struct module struct module *next; struct module_ref *ref; /* the list of modules that refer to me */ struct symbol_table *symtab; const char *nam

25、e; int size; /* size of module in pages */ void* addr; /* address of module */ int state; void (*cleanup)(void); /* cleanup routine */ ; 47 lsymbol_table的声明如下: struct symbol_table int size; /* total, including string table! */ int n_symbols; int n_refs; struct internal_symbol symbol0; /* actual size

26、 defined by n_symbols */ struct module_ref ref0; /* actual size defined by n_refs */ ; 48 l和module相关的系统调用有: 系统调用说明 Sys_create_module为模块分配空间,将模块链入系统的模块 链中 Sys_init_module初始化模块,修正指针使模块正常工作 Sys_delete_module从系统模块链中删除模块,释放内存空间 Sys_get_kernel_syms将系统的所有符号表全部取出到用户空间 49 7.1 Module的使用 lModule的装入有两种方法 : l通过i

27、nsmod命令手工将module载入内核 l根据需要载入module(demand loaded module) l卸载module有两种方法 l用户使用rmmod命令卸载module lkerneld自动卸载 50 l2.4系列内核的insmod工作的主要流程是: linsmod先调用系统调用sys_get_kernel_syms,将 当前加到系统中的模块和内核的符号表全部输出到 kernel_sym结构中,为后面使用。 l将Mymodule目标文件读进insmod用户进程空间, 成为一个映像。 l根据第一步得到的信息,将Mymodule映像中的地 址没有确定的函数和变量一一修正过来。 l调

28、用系统调用sys_create_module、 sys_init_module,将Mymodule链入到系统中去 51 实验二 Linux2.6内核移植 l2.4.18内核、2.6内核和LynuxOS 4.0在最 好情况、平均情况下和最坏情况下任务的 响应时间比较: 52 实验二 Linux2.6内核移植(1) lLinux内核移植大致可以归纳成以下几个 步骤: l准备工作,下载Linux2.6内核源代码和编译器源代 码等 l建立交叉编译环境 l制作Boot Loader l修改和编译内核 l制作文件系统 l编写相应的设备驱动 l编写应用程序 53 实验二 Linux2.6内核移植(2) l1

29、.准备工作 l下载Linux2.6.10内核源代码,可以到 ftp:/ftp.kernel.org 下载 lARM Linux是基于标准Linux内核为ARM做 的补丁,可以在 ftp:/ftp.arm.linux.org.uk上 下载 54 实验二 Linux2.6内核移植(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

30、.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 55 实验二 Linux2.6内核移植(4) l3.配置Linux2.6.10内核 l首先修改Makefile,把里面的 SUBARCH :=(shell uname m | sed e s/i.86/i386/ - es/sun4u/sparc64/ -e

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1