- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九讲字符设备驱动高级开发
和自旋锁、信号量一样,关中断是保护内核数据的一致性,避免竞争条件的方法之一。但是,在对称多处理器(SMP)环境下,仅仅关本地中断 ,还是不够的;因此对应于关本地关中断__cli,引入了关全局关中断函数__global_cli,顾名思义,即禁止所有CPU执行中断处理程序。 CPU(X86)下,中断源就是8259中断控制器,所以一个简单的关中断就起到了互斥的作用,阻止了其他任何可能的处理线索(中断、进程所引起的作业通称)。而且这种互斥是较为安全的,没有死锁的可能。但在SMP下,8259只是中断源之一,还有每个CPU的APIC控制器都会引发新的线索,此时__cli只是关闭对8259的中断响应,因此需要另外的机制,这就是test_and_set指令集的作用。另外,由于SMP的缓冲机制,test_and_set指令集必须加上lock前缀,才真正能保证test_and_set指令集的正确性(原子性),global_cli的实现就是结合了这两种互斥锁机制。 * * * * GFP_KERNE 申请内存时,若暂时不能满足,则进程会睡眠等待页,随即和引起阻塞,因此不能再中断上下文或持有自旋锁的时候使用GFP_KERNE标志申请内存 想要申请请用GFP_ATOMIC * * * 获取当前时间 获取当前时间一般通过jiffies,通常用来测量不同事件之间的时间间隔 如果要获取当前时间,可以使用do_gettimeofday函数,该函数填充一个struct timeval结构,接近微秒的分辨率 调用get_fast_time,直接访问xtime变量(2.4) Current_kernel_time * 延迟执行 驱动程序为了让硬件有足够的事件完成一些任务,常常需要将特定的代码延后一段时间来执行 长延迟,定义为延迟时间多于若干个jiffies,实现长延迟可以用查询jiffies的方法:timebefore(old_jiffies); timeafter(old_jiffies); 超时等待sleep_on_timeout函数,该函数在阻塞IO部分 另一种延迟方式是调用schedule_timeout 短延迟定义为延迟时间接近或短于一个jiffies 调用udelay和mdelay,忙等待函数,大量消耗CPU时间 函数udelay使用软件循环来延迟指定数目的微秒数 函数mdelay使用udelay嵌套来实现更长的毫秒级延迟 * 内核定时器 驱动程序可以注册一个内核定时器,来指定一个函数在未来某个时间执行 定时器只执行一次,当超时后就会被内核调用一次 超时值是一个jiffies值,当jiffies值大于超时值timer-expires时,timer-function函数就会被运行 内核定时器的实现 定义一个名为my_timer的定时器 struct timer_list my_timer; 初始化定时器 void init_timer(struct timer_list * timer); 初始化定时器并赋值其成员 static inline void setup_timer(struct timer_list * timer, void (*function)(unsigned long), unsigned long data) { timer-function = function; timer-data = data; init_timer(timer); } 增加定时器 void add_timer(struct timer_list * timer); 删除定时器 int del_timer(struct timer_list * timer); * Linux内核中断子系统 中断处理程序编写 驱动程序上/下半部处理与延缓执行机制 内核定时器与延迟机制 内核地址空间与内存使用 * * 内核地址空间与内存使用 Linux内核内存管理以及体系结构支持 用户及内核空间内存分配 设备I/O、内存映射以及DMA 内存空间与I/O空间 内存空间与I/O空间的对比 * * Arm处理器内存管理支持:MMU ARM系统中MMU完成如下工作 完成页式虚拟存储空间到物理存储空间的映射,实现从虚拟地址到物理地址的转换 存储器访问权限的控制 设置虚拟存储空间的缓冲特性 CP15协处理器操作指令,CP15 MMU寄存器 内核空间与用户空间 * Linux内核地址空间 * * 用户空间分配 void *malloc(size_t nbytes) 返回指向nbytes长的空间的指针 viod
文档评论(0)