转自:http://blog.chinaunix.net/uid-8478094-id-2031177.html 关于preempt_enable 和 preempt_disable 允许抢占和禁止抢占. 例如:内核态程序 和 中断处理程序的互斥 因为中断是异步的(不只要何时发生中断,也即随时可能发生中断),因此如果内核态的程序使用了和中断处理程序中相同的数据结构,那么必须进行互斥访问. load %r0, counter add %r0,1 //发生中断 store %r0,conter 如果…
http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢占条件):抢占发生的时机(何时检…
Linux内核态抢占机制分析  http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html 摘 要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢…
[摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢占条件):抢占发生的时机(何时检查可抢占的条件):什么时候不能抢占内核.最后分析了2.6kernel中如何支持抢占内核. [关键字]内核态…
内核锁机制 对整数的原子操作 <asm-arch/atomic.h> typedef struct {volatile int counter;} atomic_t; //初始化只能借助于ATOMIC_INIT宏 atomic_t nmi_active = ATOMIC_INIT(0); atomic_read(atomic_t *v); atomic_set(atomic_t *v,int i); ........ 自旋锁 自旋锁用于保护短的代码段,其中只包含少量C语句,因此会很快执行完毕.…
转自:http://blog.csdn.net/yiyeguzhou100/article/details/53097665 目录(?)[-] 1非抢占式和可抢占式内核的区别 21 用户态抢占User Preemption 22 内核态抢占Kernel Preemption 31 可抢占的条件 32 内核态需要抢占的触发条件 33 何时触发重新调度 34 抢占发生的时机何时检查可抢占条件 35 禁用使能可抢占条件的操作 36 什么时候不允许抢占 41 数据结构 42 代码流程 5参考资料 [摘要…
#define preempt_disable() \ do{ \ inc_preempt_count(); \ barrier();    \ }while(0) 一.这个barrier 在干什么... 内存屏障出现因为编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据缓存,读写指令乱序执行等等.如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错误.但如果对 I/O操作进行类似优化很可能造成致命错误.所以要使用内存屏障,以强制该语句前后的指令以正确的次序完成.其实在指…
//include/linux/preempt.h #ifdef CONFIG_PREEMPT_COUNT //如果内核支持抢占 do { \ inc_preempt_count(); \ barrier(); \ } ) #else //如果不支持抢占,退化成了一个内存屏障 #define preempt_disable() barrier() #endif #define inc_preempt_count() add_preempt_count(1) //一般发行版本不会开启debug配置…
转自:http://blog.csdn.net/kasalyn/article/details/11473885 static inline void raw_spin_lock(raw_spinlock_t *lock){     preempt_disable();     do_raw_spin_lock(lock);} 在真正的上锁前,为何要调用preempt_disable()来关闭抢占? ==>1.如果内核可抢占, 单CPU    process1通过系统调用进入内核态,如果其需要访…
转载自:http://www.wowotech.net/kernel_synchronization/linux2-6-11-RCU.html 一.前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟悉的内容可能会变得陌生(这里主要说的是该模块的内部实现,实际上,内核中的每一个子系统都是会尽量保持接口API的不变).怎么应对这种变化呢?一方面,具体的实现…