Linux设备驱动开发基础之互斥与同步基础

Linux设备驱动开发基础之互斥与同步基础

一些概念

  1. 竟态:多个执行路径对同一资源进行操作时可能引发的资源混乱行为(①)。执行路径为并发源。
  2. 临界区:对共享资源的访问代码片段。临界区只能是在一个进程内部而无法跨进程,因为其不是一个对象,我们无法定义一个临界区对象来告知其他进程,而像Mutex和SpinLock都可以。参考这篇文章
  3. 中断和抢占:一般都是在中断需要返回前会调用重新调度函数,如果没有禁止抢占,那么就会被高优先级的进程抢占。有的地方可以被中断但是进程必须不被抢占,那么只需要禁止抢占就行了。例如spin_lock是可以被中断的,但是不能被抢占,因为被其他进程抢占后会造成死锁。当然因为中断中也可能要去获得这个锁而造成死锁,这个就是spin_lock_irq的来由。

原子操作与原子变量

  • 原子操作:每一步都是不可分割的。
  • 原子变量:对此变量的操作(增加或者减小)是原子操作。

单核处理器+抢占多核处理器在许多发面有类似的特性。

并发的来源

  1. 中断
  2. 调度器的可抢占性
  3. 多核、多处理器的并发执行

中断

一般对于本地CPU(就是此刻运行这个代码的CPU或者CPU核),控制其中断使用的函数是:

  • local_irq_enable
  • local_irq_disable

调度器的可抢占性

调度器的控制函数 ...

more ...

Linux驱动开发之内存管理基础

内存管理主要分为:

  1. 物理内存管理
  2. 虚拟内存管理

物理内存管理

物理内存以页(page frame)为单位,一般为4K,如果是4G的内存那么,将会有一个大小为4G/4K=1M的数组mem_map,每一项保存着每一页的地址。

Zone

Zone是一些连续物理页的合集,参看下面的图3-2。将物理页分成了3个Zone区:

  1. ZONE_HIGHMEM:物理内存高于896M的区域
  2. ZONE_NORMAL:常规内存区域,如果DMA可以在此区域做内存访问,也可以使用这块区域
  3. ZONE_DMA:0~nM,不同的架构和不同的芯片都可能不一样

因为数组mem_map与物理页对应,因此mem_map也被默认分为了上面三个区域。

内存节点

分为两种:

  1. UMA:只有一个内存节点,CPU访问内存的内存的任何地址的速度是一样的。
  2. NUMA:多处理器,每个处理器都有自己的本地内存,通过总线通讯。访问本地内存比访问其他节点的内存快。

物理页面分配器:伙伴系统

伙伴系统的特征与作用:

  1. 使用物理页为单位 ...
more ...