ARMLinux 内核课件.ppt

  1. 1、本文档共74页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
由于那些虚拟内存区域来源各不相同,Linux使用vm_area_struct中指向一组虚拟内存处理过程的指针来抽象此接口 为进程创建新的虚拟内存区域或处理页面不在物理内存中的情况下,Linux内核重复使用进程的vm_area_struct数据结构集合。采用AVL树来减少查找时间。 当进程请求分配虚拟内存时,Linux并不直接分配物理内存 精品文档 3 ARM-Linux 的中断响应和处理 中断是一个流程,一般来说要经过三个环节: 中断响应 中断处理 中断返回 中断响应是第一个环节,主要是确定中断源,在整个中断机制中起着枢纽的作用 精品文档 使CPU在响应中断的时候能迅速的确定中断源,且尽量减少引脚数量,辅助手段主要有下列几种: 中断源通过数据总线提供一个代表具体设备的数值,称为“中断向量” 在外部提供一个“集线器”,称为“中断控制器” 将中断控制器集成在CPU芯片中,但是设法“挪用”或“复制”原有的若干引线,而并不实际增加引线的数量 精品文档 ARM是将中断控制器集成在CPU内部的,由外设产生的中断请求都由芯片上的中断控制器汇总成一个IRQ中断请求 中断控制器还向CPU提供一个中断请求寄存器和一个中断控制寄存器 GPIO是一个通用的可编程的I/O接口,其接口寄存器中的每一位都可以分别在程序的控制下设置用于输入或者输出 精品文档 ARM Linux将中断源分为三组: 第一组是针对外部中断源; 第二组中是针对内部中断源,它们都来自集成在芯片内部的外围设备和控制器,比如LCD控制器、串行口、DMA控制器等等。 第三组中断源使用的是一个两层结构。 精品文档 在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); }; 精品文档 每一个中断请求线都有一个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; 精品文档 具体中断处理程序则在数据结构 struct irqaction 三个数据结构的相互关系如图 : struct hw_interrupt_type Struct irqacton 指向具体的中断服务函数 irq_desc[NR_IRQS 精品文档 ARM Linux的中断初始化。 在ARM Linux存储管理中,内核中DRAM区间的虚拟地址和物理地址是相同的。系统加电引导以后,CPU进入内核的总入口,即代码段的起点stext,CPU首先从自身读出CPU的型号以及其所在的开发板,把有关的信息保存在全局变量中; 然后就转入start_kernel()函数进行初始化; 接着是执行函数trap_init() 这个函数做的第一件事是将下列指令搬运到虚拟地址0处: 精品文档 第二件事是搬运底层中断响应程序的代码(如下所示)到0x200处 : .LCvectors: swi SYS_ERROR0 b __real_stubs_start + (vector_undefinstr - __stubs_start) ldr pc, __real_stubs_start + (.LCvswi - __stubs_start) b __real_stubs_start + (vector_prefetch - __stubs_start) b __real_stubs_start + (

文档评论(0)

liuxiaoyu98 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档