摘要:
1 简介 自旋锁:通俗的说就是自己在原地打转,一直等待资源可用。不会休眠 对临界资源的访问时,因为自旋锁的存在,某段临界资源被占用后。其他事件将无法访问,即进行所谓的自旋,“原地打转” 注意: 在自旋锁的临界区不能使用可能引起进程调度的函数(因为抢占已经被禁止了)。 示例: copy_to_user 阅读全文
摘要:
1 简介 原子操作此操作是不会被打断的 2 ldrex、strex、teq ldrex 相对ldr而言此命令多了ex(exclude排除),意为独占 eg: 将会对ldr r0, r1命令中的r1标记为独占 strex 相较于str基本功能而言多出清除独占标记 eg: strex r2, r0, r 阅读全文
摘要:
中断处理流程 1 简介 中断屏蔽是一种可以防止并发导致竞态的方法。 在进入临界区之前屏蔽系统中断可以保证正在执行的内核路径不被打断(进程调度也依赖于中断)。 不过在驱动编程中此方法并不值得推荐。因为驱动并不一定运行在单核上,面对SMP系统中断屏蔽并不能屏蔽掉别的CPU的中断操作,此时使用中断屏蔽也就 阅读全文
摘要:
汇编参考 GCC工具链使用 1 引入 内联汇编即在C函数中使用汇编去实现某些功能。 为什么需要在C代码中引入汇编? C语言在大多数的时候效率都很高,但在某些情况下直接使用汇编效率会***==更加高效==*** 部分功能通过C语言很难实现,这部分代码就需要使用汇编去实现(==实现某些功能==) 在C文 阅读全文
摘要:
1 并发和竞态 1.1 简介 设备在运行的过程中存在多个进程对资源的并发访问 多个执行单元同时,并行的执行。并发事件对共享资源的访问(硬件资源,全局变量,静态变量等),很容易导致设备出现竞态。 竞态的出现会导致设备出现异常 1.2 单核和多核(SMP)并发下的竞态 1.3 总结 关于共享资源的这部分 阅读全文
摘要:
代码 编程指南 确定物理地址 确定是否使用cache、buffer 建立映射关系 1 引入 应用程序与驱动程序之间进行数据传递时常使用read,write 此实现方法本质上是在用户态的buffer与内核态的buffer之间进行了一次copy。此方法本质上没有什么问题,不过在数据量比较大的时候效率就会 阅读全文
摘要:
代码 1 概述 避免workqueue中存在多个work会导致后面的work执行存在受前面工作的影响 在中断下半部专门申请一个内核线程来处理这个事件,这个内核线程专门用于此中断 1.1 内部机制 设备发生中断时内核会调用handler处理中断事件(如果中断函数存在)。中断处理完成后,如果有需要的中断 阅读全文
摘要:
代码 编程指南 构造workqueue 将workqueue放入队列,开始调度 1 工作机制 内核线程(while(1))中对去判定是否存在workqueue;如果不存在择休眠; 如果存在workqueue则等待wake up事件唤醒workqueue,然后执行workqueue中的fun 1.1 阅读全文
摘要:
代码 1 tasklet调度机制 中断上半部执行完后,使能调度下半部; 中断下半部softirq_init中会调用asklet_action,在此函数中会去遍历链表检测符合条件的tasklet选出执行 2 常用API和数据结构 2.1 tasklet_struct struct tasklet_st 阅读全文
摘要:
第6课.定时器 代码 1 定时器的时间单位 在内核中.config文件中CONFIG_HZ配置为每秒linux的时钟滴答次数,没发生一次全局变量jiffies便会增加1 在日常使用中使用HZ表示一秒 2 常用函数及其数据结构 struct timer_list *timer (timer_list结 阅读全文