
Linux驱动
文章平均质量分 65
编程一时爽Cxx
温故知新
展开
-
Linux驱动之 内核最常见的自旋锁及死锁示例
内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择:一种是原地等待,一种是挂起当前进程,调度其他进程执行(睡眠)。Spinlock是内核中提供的一种比较常见的锁机制,自旋锁是“原地等待”的方式解决资源冲突的,即一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到,只能够原地“打转”。(忙等待)。自旋锁优点:自旋锁不会使线程状态发生切换一直处于用户态,即线程—直都是active的;不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快。非自旋锁在获取不到锁的时候会进入原创 2021-05-04 17:12:26 · 2376 阅读 · 0 评论 -
Linux驱动之 read、write 接口使用
#include <linux/init.h>#include <linux/module.h>#include <linux/kdev_t.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/uaccess.h>#define NEWCHRDEV_CNT 1 /* 设备号个数 */#define NEWCHRDEV_NAME "hello"原创 2021-04-27 17:50:49 · 1818 阅读 · 0 评论 -
Linux驱动之 等待队列waitqueue
如何通过等待队列实现对进程的阻塞?当进程要获取某些资源(例如从网卡读取数据)的时候,但资源并没有准备好(例如网卡还没接收到数据),这时候内核必须切换到其他进程运行,直到资源准备好再唤醒进程。 waitqueue (等待队列) 就是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用 add_wait_queue() 函数把进程添加到 waitqueue 中,然后切换到其他进程继续执行。当资源准备好,由资源提供方通过调用 wake_up() 函数来原创 2021-05-25 23:22:42 · 600 阅读 · 0 评论 -
Linux驱动之 同步机制总结
Linux驱动 之同步机制总结:自旋锁和互斥锁使用场合:需求建议的加锁低开销加锁优先使用自旋锁短期锁定优先使用自旋锁长期锁定优先使用互斥体中断上下文中加锁使用自旋锁持有锁需要睡眠使用互斥体在中断上下文中只能使用自旋锁,而在任务睡眠时只能使用互斥体长时间睡眠,采用信号量、互斥体短时间,采用自旋锁相关视频讲解,B站 一口Linux :https://www.bilibili.com/video/BV1M64y127kA信号量和互斥体的选转载 2021-05-10 08:41:33 · 371 阅读 · 0 评论 -
Linux驱动之 原子操作
Linux驱动之 原子操作学习记录:概念:原子操作是指在执行过程中不会被别的代码所中断的操作,即它是最小的执行单位。最简单的原子操作就是一条条的汇编指令(不包括一些伪指令,伪指令会被汇编器解释成多条汇编指令)。在linux中原子操作对应的数据结构为atomic t,定义如下:typedef struct{ int counter;}atomic_t;之所以定义这么一个数据类型,是为了让原子操作函数只接受 atomic_t 类型的操作数,如果传入的不是 atomic_t 类型数据,在程序原创 2021-05-04 22:20:28 · 689 阅读 · 0 评论 -
Linux系统之 文件锁 fcntl函数使用
在多数unix系统中,当多个进程/线程同时编辑一个文件时,该文件的最后状态取决于最后一个写该文件的进程。文件锁(也叫记录锁)的作用是,当一个进程读写文件的某部分时,其他进程就无法修改同一文件区域。借助fcntl函数来实现锁机制。允许对文件中任意字节区域加锁,短至一个字节,长至整个文件。操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。适合环境——当前系统中该进程只能起一个。实现原理——当一个进程打开了这个文件,另一个进程发现文件被打开了,就无法再打开这个文件了。对于有些应原创 2021-05-04 17:19:21 · 927 阅读 · 0 评论 -
Linux驱动之 互斥、内核态信号量、完成量
互斥概念信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作。mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,mutex比信号量执行速度更快,可扩展性更好,另外mutex数据结构的定义比信号量小。struct mutex my_mutex; //定义mutex_init(&mu_mutex); //初始化 mutex_lock(&my_mutex);...... //临界资源m原创 2021-05-04 11:17:52 · 391 阅读 · 0 评论 -
Linux驱动之 字符设备 ioctl接口使用
字符设备ioctl接口使用记录:Linux驱动编写除了对设备进行读写数据之外,通常还希望可以对设备进行控制。在这里插入代码片原创 2021-04-28 13:22:38 · 1832 阅读 · 1 评论 -
Linux驱动之 自动创建设备节点class_create、device_create
Linux驱动之自动创建设备文件节点学习记录:上节课利用了mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点。内核中定义了struct class结构体,一个struct class结构体类型变量对应一个类,内核同时提供了class_create()函数,可以用它来创建一个类,这个类存放于sysfs下面,创建了这个类,再调用device_create()函数来在/dev目录下创建相应的设备节点。这原创 2021-04-24 23:37:32 · 5174 阅读 · 0 评论 -
Linux驱动之 字符设备register_chrdev_region、cdev_init、cdev_add、unregister_chrdev_region、cdev_del
注册与注销设备号操作系统与外部设备(磁盘驱动器,打印机,modern,终端 等等)都是通过设备文件来进行通信的,在Unix/Linux系统与外部设备通讯之前,这个设备必须首先要有一个设备文件,设备文件均放在/dev目录下。字符设备文件:字符设备文件传送数据给设备的时候,一次传送一个字符,终端,打印机,绘图仪,modern等设备都经过字符设备文件传送数据;块设备:系统通过块设备文件存取一个设备的时候,先从内存中的buffer中读或写数据,而不是直接传送数据到物理磁盘,这种方式能有效的提高磁盘和CD-RO原创 2021-04-24 18:25:57 · 1780 阅读 · 0 评论 -
Linux驱动之 加载模块传参module_param、module_param_named
Linux驱动–加载模块传参学习记录:module_param(whom,charp,0644);/**@ module_param(name, type, perm) //给模块传参函数*@ name 接收参数变量名,既是用户看到的参数名,又是模块内接受参数的变量;*@ type 参数数据类型*@ perm 指定参数访问权限*/相关宏:module_param_named(name, g_var, type, perm); //声明外部的参数名module_param_string(原创 2021-04-23 17:41:06 · 3718 阅读 · 0 评论