Linux 驱动需要考虑的同步问题
title: Linux 驱动需要考虑的同步问题
date: 2020-06-22 07:21:32
categories:
tags:
- ipc
- linux
- kernel
- driver
---
这个数据是不是全局变量?除了当前线程外,其他线程能不能访问它?
如果其他线程要访问全局数据,那么该数据需要采取某种形式的同步方法。这个数据会不会在进程上下文和中断上下文中共享?他是不是在两个不同的中断处理程序中共享?
如果中断中访问共享数据,那么进程中访问共享数据时,需要禁止中断,又由于该数据也是进程共享,应该
防止被抢占。
适用的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 驱动需要考虑的同步问题的更多相关文章
- Linux驱动开发5——同步机制
上一章讲到了并发,指的是多个进程同时存取临界区资源的处理机制.这一章讲的同步机制,讲的是多个进程之间协同工作的处理机制,如临界区数据还没有准备好,A进程负责准备数据,B进程等待A进程完成之后读取数据. ...
- Linux 驱动框架---i2c驱动框架
i2c驱动在Linux通过一个周的学习后发现i2c总线的驱动框架还是和Linux整体的驱动框架是相同的,思想并不特殊比较复杂的内容如i2c核心的内容都是内核驱动框架实现完成的,今天我们暂时只分析驱动开 ...
- linux驱动程序设计的硬件基础,王明学learn
linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...
- Linux驱动学习步骤(转载)
1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ls ...
- Linux驱动设计—— 中断与时钟
中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...
- linux驱动面试题目汇总
http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何 ...
- Linux驱动开发学习的一些必要步骤
1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...
- Linux驱动之触摸屏程序编写
本篇博客分以下几部分讲解 1.介绍电阻式触摸屏的原理 2.介绍触摸屏驱动的框架(输入子系统) 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍电阻式触摸屏的原理 ...
- Linux驱动之LCD驱动编写
在Linux驱动之内核自带的S3C2440的LCD驱动分析这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动.用的LCD屏幕为tft屏,每个像素点为16bit.对 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
随机推荐
- html+jq实现全国省的单选,弹框输入input
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- vue-cli快速搭建项目的几个文件(一)
===========app.vue文件============= <template> <div id="app"> <router ...
- VUE+element页面按钮调用dialog
VUE+element通过按钮调用普通弹框(弹框页面独立出一个dialog页面,非在同一个页面文件里) 代码如下 <el-dialog> <el-button type=" ...
- C#开发的CPU使用率小应用 - 开源研究系列文章 - 个人小作品
这次用C#编写一个CPU使用率的小应用.想了一下,大概需要两个内容:一个是获取CPU使用率:一个是托盘图标的动画效果.这两个内容在上次的博文中有介绍了,此博文为具体的应用的例子. 对于要实现的应用,首 ...
- 【简说Python WEB】Jinja2模板
目录 [简说Python WEB]Jinja2模板 目前环境的代码树 抽离出来的Html模板 渲染模板 条件语句 循环语句 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境 ...
- postgresql 主键id配序列
一.手动创建序列 1.表格id字段,设置主键(PRIMARY KEY),类型为int4 2.创建序列 CREATE SEQUENCE public.moni_wzhour_warn_id_seq IN ...
- 聊聊MySQL是如何处理排序的
本文分享自华为云社区<MySQL怎样处理排序️如何优化需要排序的查询?>,作者:菜菜的后端私房菜. 前言 在MySQL的查询中常常会用到 order by 和 group by 这两个关键 ...
- ansible自定义模板部署apache服务
使用Ansible来部署Apache服务是一个很好的选择,因为它可以自动化部署过程,确保所有的服务器上都有相同的配置.以下是一个简单的步骤指南,展示如何使用Ansible来部署Apache服务: 1 ...
- 30分钟带你搞定Dokcer部署Kafka集群
docker网络规划 docker network create kafka-net --subnet 172.20.0.0/16 docker network ls zookeeper1(172.2 ...
- 鸿蒙HarmonyOS实战-Stage模型(开发卡片页面)
一.开发卡片页面 HarmonyOS元服务卡片页面(Metaservice Card Page)是指在HarmonyOS系统中,用于展示元服务的页面界面.元服务是指一组提供特定功能或服务的组件,例如天 ...