linux内核情景分析之锁机制
/** These are the generic versions of the spinlocks and read-write* locks..*///自旋锁加锁,irqsave表示把标志寄存器存储起来#define spin_lock_irqsave(lock, flags) do { local_irq_save(flags);//关闭本地中断,保存标志位 spin_lock(lock); } while (0)#define spin_lock_irq(lock) do { local_irq_disable(); spin_lock(lock); } while (0)#define spin_lock_bh(lock) do { local_bh_disable(); spin_lock(lock); } while (0)//读锁与下面写锁,构成读写锁#define read_lock_irqsave(lock, flags) do { local_irq_save(flags); read_lock(lock); } while (0)#define read_lock_irq(lock) do { local_irq_disable(); read_lock(lock); } while (0)#define read_lock_bh(lock) do { local_bh_disable(); read_lock(lock); } while (0)//写锁,与上面构成读写锁#define write_lock_irqsave(lock, flags) do { local_irq_save(flags); write_lock(lock); } while (0)#define write_lock_irq(lock) do { local_irq_disable(); write_lock(lock); } while (0)#define write_lock_bh(lock) do { local_bh_disable(); write_lock(lock); } while (0)//自旋锁解锁#define spin_unlock_irqrestore(lock, flags) do { spin_unlock(lock); local_irq_restore(flags); } while (0)#define spin_unlock_irq(lock) do { spin_unlock(lock); local_irq_enable(); } while (0)#define spin_unlock_bh(lock) do { spin_unlock(lock); local_bh_enable(); } while (0)//读锁解锁#define read_unlock_irqrestore(lock, flags) do { read_unlock(lock); local_irq_restore(flags); } while (0)#define read_unlock_irq(lock) do { read_unlock(lock); local_irq_enable(); } while (0)#define read_unlock_bh(lock) do { read_unlock(lock); local_bh_enable(); } while (0)//写锁解锁#define write_unlock_irqrestore(lock, flags) do { write_unlock(lock); local_irq_restore(flags); } while (0)#define write_unlock_irq(lock) do { write_unlock(lock); local_irq_enable(); } while (0)#define write_unlock_bh(lock) do { write_unlock(lock); local_bh_enable(); } while (0)
static inline void spin_lock(spinlock_t *lock){#if SPINLOCK_DEBUG__label__ here;here:if (lock->magic != SPINLOCK_MAGIC) {//判断是否等于魔数printk("eip: %p\n", &&here);BUG();}#endif__asm__ __volatile__(spin_lock_string:"=m" (lock->lock) : : "memory");}
#define spin_lock_string \"\n1:\t" \"lock ; decb %0\n\t" \ //将lock->lock减1,指令带lock表示把总线锁住,禁止其他cpu访问"js 2f\n" \//不是非负数,直接进入临界区".section .text.lock,\"ax\"\n" \"2:\t" \"cmpb $0,%0\n\t" \//如果-1结果为负数,那就循环检测"rep;nop\n\t" \"jle 2b\n\t" \//如果检测依旧是负数,跳转到2"jmp 1b\n" \//否则检测".previous"
linux内核情景分析之锁机制的更多相关文章
- Linux内核情景分析之消息队列
早期的Unix通信只有管道与信号,管道的缺点: 所载送的信息是无格式的字节流,不知道分界线在哪,也没通信规范,另外缺乏控制手段,比如保温优先级,管道机制的大小只有1页,管道很容易写满而读取没有及时,发 ...
- linux内核情景分析之execve()
用来描述用户态的cpu寄存器在内核栈中保存情况.可以获取用户空间的信息 struct pt_regs { long ebx; //可执行文件路径的指针(regs.ebx中 long ecx; //命令 ...
- linux内核情景分析之内核中的互斥操作
信号量机制: struct sempahore是其结构,定义如下 struct semaphore { atomic_t count;//资源数目 int sleepers;//等待进程数目 wait ...
- Linux内核情景分析的alloc_pages
NUMA结构的alloc_pages ==================== mm/numa.c 43 43 ==================== 43 #ifdef CONFIG_DISCON ...
- Linux内核情景分析之异常访问,用户堆栈的扩展
情景假设: 在堆内存中申请了一块内存,然后释放掉该内存,然后再去访问这块内存.也就是所说的野指针访问. 当cpu产生页面错误时,会把失败的线性地址放在cr2寄存器.线性地址缺页异常的4种情况 1.如果 ...
- linux内核情景分析之exit与Wait
//第一层系统调用 asmlinkage long sys_exit(int error_code) { do_exit((error_code&0xff)<<8); } 其主体是 ...
- linux内核情景分析之匿名管道
管道的机制由pipe()创建,由pipe()所建立的管道两端都在同一进程.所以必须在fork的配合下,才可以在具有亲缘关系的进程通信 /* * sys_pipe() is the normal C c ...
- linux内核情景分析之命名管道
管道是一种"无名","无形文件,只可以近亲进程使用,不可以再任意两个进程通信使用,所以只能实现"有名","有形"的文件来实现就可以 ...
- linux内核情景分析之信号实现
信号在进程间通信是异步的,每个进程的task_struct结构有一个sig指针,指向一个signal_struct结构 定义如下 struct signal_struct { atomic_t cou ...
随机推荐
- Class:向传统类模式转变的构造函数
前言 JS基于原型的'类',一直被转行前端的码僚们大呼惊奇,但接近传统模式使用class关键字定义的出现,却使得一些前端同行深感遗憾而纷纷留言:"还我独特的JS"."净搞 ...
- 【PHP】什么时候使用Try Catch(转)
几条建议: 如果无法处理某个异常,那就不要捕获它. 如果捕获了一个异常,请不要胡乱处理它. 尽量在靠近异常被抛出的地方捕获异常. 在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出. 按 ...
- oracle 事务 第二弹
一 数据库版本 SYS@LEO1>select* from v$version; BANNER ------------------------------------------------- ...
- Codeforces Round #435 (Div. 2) B (二分图) C(构造)
B. Mahmoud and Ehab and the bipartiteness time limit per test 2 seconds memory limit per test 256 me ...
- main方法中sleep
sleep(long mil); 你应该 加 休眠的时间才行 一.Thread.sleep(1000); 二.让你的class extends Thread来继承 sleep方法
- 图学java基础篇之集合工具
两个工具类 java.utils下又两个集合相关_(准确来说其中一个是数组的)_的工具类:Arrays和Collections,其中提供了很多针对集合的操作,其中涵盖了一下几个方面: 拷贝.填充.反转 ...
- asp.net实现调用ffmpeg实现视频格式的转换
视频格式转换的函数 //视频转换 public void VideoConvertFlv(string FromName, string ExportName) { string ffmpeg = H ...
- 我给女朋友讲编程CSS系列(1) –添加CSS样式的3种方式及样式表的优先权
如果说,原生态就是美,那么,我们就没有必要穿衣打扮. 网页是什么? 说白了,网页就是一堆[html标签]有序的搭配,让[CSS属性值]整整容,请[Javascript语言]处理一下事件. 一个人的整容 ...
- Leetcode 629.K个逆序对数组
K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 ...
- 聊聊、Java 命令 第一篇
网上很多讲 Javac 和 Java 命令的,我觉得还是要自己写一写,做一个自己的总结,也方便以后查询. 开始之前先看看 help 命令,基本上任何一个软件都会提供这个命令. 没有什么比 -help ...