---
title: Linux 驱动需要考虑的同步问题
date: 2020-06-22 07:21:32
categories:
tags:
- ipc
- linux
- kernel
- driver
---

http://blog.chinaunix.net/uid-21977330-id-3793200.html

  • 这个数据是不是全局变量?除了当前线程外,其他线程能不能访问它?

    如果其他线程要访问全局数据,那么该数据需要采取某种形式的同步方法。

  • 这个数据会不会在进程上下文和中断上下文中共享?他是不是在两个不同的中断处理程序中共享?

    如果中断中访问共享数据,那么进程中访问共享数据时,需要禁止中断,又由于该数据也是进程共享,应该

    防止被抢占。

    适用的API:

spin_lock_irqsave()-- spin_unlock_irqrestore()
spin_lock_irq() -- spin_unlock_irq()

如果只是进程间共享数据,适用的API:

spin_lock() -- spin_unlock()
  • 进程在访问数据是可不可能被抢占?被调度的新程序会不会访问同一数据?

    如果数据对每个处理器是唯一的,那么没有必要使用锁,可以通过禁止内核调度达到数据同步目的。API:
preempt_disable() : 增加抢占计数,禁止内核抢占
preempt_enable():减少抢占计数,当值降为0时,检查和执行被挂起的需调度的任务。
preempt_count() : 返回抢占计数。
preempt_enable_no_resched(): 激活内核抢占但不再检查任何被挂起的需调度任务。
  • 当前进程是不是会睡眠(阻塞)在某些资源上,如果是,他会让共享数据处于何种状态?

    信号量是一种睡眠锁,如果进程试图获得已被占用的信号量时,信号量会将该进程推进一个等待队列,然后让其睡眠。处理器

    去执行其他代码
  • 怎样防止数据失控?
  • 如果这个函数又在另一个处理器上被调度将会发生什么?

自旋锁:防止多处理器(SMP)的真并发

禁止调度: 如果数据对每个处理器是唯一的,那么没有必要使用锁,可以通过禁止内核调度达到数据同步目的。

禁止中断:中断也是系统内核需要同步的主要原因之一。控制中断开关的原因是需要提供同步,通过禁止中断可以

确保某个中断处理程序不会抢占当前代码,还可以禁止 内核抢占。但它们都没有提供任何保护机制防止来自其他处

理器的并发访问。单独使用中断屏蔽并不是一个值得推荐的避免竞态的方法,它一般和自旋锁配合使用, 以解决多

CPU引发的竞态问题。另外关闭中断可能导致中断无法得到及时响应,这也是导致Linux系统不能满足实时系统短响

应时间要求的原因之一。

禁止与允许中断的函数包括:

void disable_irq(int irq); //禁止单个中断,等待成功返回
void disable_irq_nosync(int irq); //禁止单个中断,不等待返回
void enable_irq(int irq); //允许单个中断
void local_irq_save(unsigned long flags); //禁止所有中断,并保存标志
void local_irq_diable(void); //禁止所有中断
void local_irq_restore(unsigned long flags); //使能所有中断,并恢复标志
void loval_irq_enable(void); //使能所有中断

Linux 驱动需要考虑的同步问题的更多相关文章

  1. Linux驱动开发5——同步机制

    上一章讲到了并发,指的是多个进程同时存取临界区资源的处理机制.这一章讲的同步机制,讲的是多个进程之间协同工作的处理机制,如临界区数据还没有准备好,A进程负责准备数据,B进程等待A进程完成之后读取数据. ...

  2. Linux 驱动框架---i2c驱动框架

    i2c驱动在Linux通过一个周的学习后发现i2c总线的驱动框架还是和Linux整体的驱动框架是相同的,思想并不特殊比较复杂的内容如i2c核心的内容都是内核驱动框架实现完成的,今天我们暂时只分析驱动开 ...

  3. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...

  4. Linux驱动学习步骤(转载)

    1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ls ...

  5. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  6. linux驱动面试题目汇总

    http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何 ...

  7. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  8. Linux驱动之触摸屏程序编写

    本篇博客分以下几部分讲解 1.介绍电阻式触摸屏的原理 2.介绍触摸屏驱动的框架(输入子系统) 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍电阻式触摸屏的原理 ...

  9. Linux驱动之LCD驱动编写

    在Linux驱动之内核自带的S3C2440的LCD驱动分析这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动.用的LCD屏幕为tft屏,每个像素点为16bit.对 ...

  10. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

随机推荐

  1. 使用组合逻辑电路驱动VGA显示器

    使用组合逻辑电路驱动VGA显示器 1. 概述 本文讲述一种不使用缓冲存储器驱动VGA显示的简单方法.其中,VGA分辨率采用DE10-Lite建议使用的640X480.像素的时钟25MHz,刷新率59. ...

  2. 习题8 #第8章 Verilog有限状态机设计-2 #Verilog #Quartus #modelsim

    2. 设计一个"1001"串行数据检测器,其输入.输出如下: 输入x:000 101 010 010 011 101 001 110 101 输出z:000 000 000 010 ...

  3. 五、Doris数据分布

    在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述 名词解释 数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能 短查询:s ...

  4. ITIL是标准吗?

    ITIL不是标准 OGC:是一个推荐的管理框架,一个模版,可根据运维实践自由裁量落地 itil诞生环境:欧美思维.欧美文化.欧美制度.欧美人文习惯.... 对欧美来说可能是最佳实践,但是对中国特色文化 ...

  5. gitignore文件不生效的问题解决

    如何添加 git的忽略文件 .gitignore 在使用git过程中,我们可能有些文件不需要上传上去,比如一些缓存文件,生成的图片,运行环境的一些配置等等,这时就需要用到.gitignore忽略掉这些 ...

  6. JavaScript面向对象的继承应用

    面向对象语言的三大特征:继承.封装.多态 <!DOCTYPE html> <html> <head> <title>Extend-OPP</tit ...

  7. 原生微信小程序

    new Date 跨平台兼容性问题 在 Andriod 使用 new Date("2018-05-30 00:00:00")木有问题,但是在ios 下面识别不出来.因为 IOS 下 ...

  8. 面向K-12学生的远程访问学校计算机实验室

    ​ 为了应对新冠肺炎大流行,许多学校被迫采用远程学习和混合时间制度.在家学习的学生必须使用自己的个人设备或学校提供的设备(例如 Chromebook )来完成课堂作业. 尽管许多解决方案可以帮助学生和 ...

  9. 80x86汇编—寻址方式

    文章目录 术语解释 8086寻址方式 直数寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 比例变址寻址方式 基址比例变址寻址方式 术语解释 EA:有效地址,通过段地址:偏移地址组合得到的Effec ...

  10. java基础 韩顺平老师的 异常 自己记的部分笔记

    443,异常处理入门 package com.hspedu.exception_; public class Exception { public static void main(String[] ...