`

字符设备驱动程序学习笔记四

 
阅读更多

竟争与互斥


程序调试
1 打印调试信息 printk
定义全局打印
示例代码如下:
#ifdef PDEBUG
#define PLOG(fmt,args...) printk(KERN_DEBUG "scull:",fmt,##args)
#else
/*do nothing*/
#define PLOG(fmt,args...)
#endif


在makefile中定义PDEBUG的值
示例代码如下:
DEBUG=y
ifeq($(DEBUG),y)
DEBFLAGS=-O2 -g -D PDEBUG
else
DEBFLAGS=-O2
endif
cflags+=$(DEBFLAGS)



2 调试器调试 kdb kgdb
3 查询调试
4 通过内核配置工具中的kernel hacking菜单
5 通过监视调试strace



并发与竟态
并发: 多个执行单元同时被执行
竞态:并发的执行单元对共享资源的访问导致的竞争状态


示例代码如下:
if(copy_from_user(&dev->data[pos]),buf,count)
ret=-EFAULT;
goto out;




加锁 互斥


spin_lock机制
semaphore机制


信号量
如果一个任务相要获得已经被占用的信号量时,信号量将会将这个进程放入一个


等待队列,然后让其睡眠,当持有信号量的进程将信号释放后,处于等待队列中


的任务被子唤醒


在<asm/semaphore.h>定义
定义信号量
struct semaphore sem;
初始人信号量
/*设置信号量的初值为val*/
void sema_init(struct semaphore *sem,int val)






互斥体必须在运行时被初始化
/*初始化一个互斥锁,把sem的值设为1 */
void init_MUTE(struct semphore *sem)
/*同上,将sem设置为0,为已锁状态*/
void init_MUTEX_LOCKED(struct semaphore *sem)




/*定义初始化为1*/
DECLARE_MUTEX(name)
/*定义初如化为0*/
DECLARE_MUTEX_LOCKED(name)


获取信号量
/*不建议使用,可能会导致程序睡眠,不能在中断上下文使用该函数*/
void down(struct semaphore *sem)
/*如果信号量不可用,进程将被置为TASK_INTERRUPTIBLE*/
int down_interruptible(struct semaphore *sem)
/*如果信号量不可用,置为TASK_KILLABLE*/
down_killable(struct semaphore *sem)






释放信号量
/*把sem的值加1,如果sem的值为非正数,表明有任务等待,唤醒这些等待者*/
void up(struct semaphore *sem)




自旋锁
最多只能被一个可执行单元持有,不会引起调用者睡眠
如果一个执行线程想要获得一个已经被持有的自旋锁,就会一直进行忙循环,查


看是否被释放


/*初始化自旋锁*/
spin_lock_init(x)
/*获取自旋锁,不成功则一直自旋在那里*/
spin_lock(lock)
/*获取自旋锁,直接返回真假,不会一直等待*/
spin_trylock(lock)
/*释放自旋锁*/
spin_unlock(lock)










自旋锁与信号量的使用场景


自旋锁 只有一个持有者
时间较短的情况


信号量 多个持有者
保持时间较长的情况

分享到:
评论

相关推荐

    linux字符设备驱动程序学习笔记

    Linux 字符设备驱动程序学习笔记 Linux 字符设备驱动程序是 Linux 操作系统中的一种驱动程序,负责管理字符设备的输入和输出操作。字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常...

    LDD-LinuxDeviceDrivers.zip Linux内核与设备驱动程序学习笔记

    "Linux内核与设备驱动程序学习笔记"可能包含了以下内容: 1. **内核模块**:内核模块是可加载到运行中的内核中的代码段,允许用户动态添加或移除设备驱动。这使得系统可以在需要时加载特定驱动,节省内存。 2. **...

    linux字符设备驱动学习笔记借鉴.pdf

    Linux 字符设备驱动学习笔记 本文档主要讲述 Linux 字符设备驱动学习笔记,涵盖了设备文件、主次设备号、字符设备驱动中的数据结构等知识点。 一、 设备文件 设备文件是一种特殊类型的文件,用来代表一个设备。...

    字符设备驱动学习笔记(2.6.23)

    这篇“字符设备驱动学习笔记(2.6.23)”文档针对的是Linux内核版本2.6.23,这可能是2007年的内核版本,当时Linux系统已经相当成熟,但相对于最新的内核版本,它可能不包含一些新特性或优化。 学习Linux字符设备驱动...

    linux设备驱动程序

    4. **时间、延迟及延缓操作**:在《Linux设备驱动程序学习(12)-时间、延迟及延缓操作》中,将探讨如何在驱动程序中正确处理时间,包括延迟函数(如`udelay`、`mdelay`)、定时器(`timer`)的使用,以及在驱动程序...

    linux设备驱动学习笔记

    4. 设备驱动程序需要特别注意并发处理,以防止竞态条件。 5. 内核API中以双下划线(__)开头的函数通常涉及底层实现,应谨慎使用。 6. 由于硬件限制,内核代码通常不支持浮点运算。 Linux设备驱动程序的一个示例是...

    linux字符设备驱动学习笔记文.pdf

    Linux字符设备驱动是操作系统与硬件设备交互的关键组件,它提供了软件层面与硬件设备通信的接口。在Linux系统中,设备通常被表示为文件,这种特殊类型的文件被称为设备文件。设备文件使得用户空间的应用程序能够通过...

    嵌入式设备驱动学习笔记

    本学习笔记主要关注于如何开发这些驱动程序,涉及C和C++编程语言,系统编程,网络编程以及ARM架构的驱动开发。 首先,了解基本的数据结构对于开发设备驱动至关重要。数据结构是组织和存储数据的方式,它影响着算法...

    windows驱动程序开发学习笔记

    ### Windows驱动程序开发学习笔记知识点解析 #### 一、Windows驱动程序开发概述 - **学习背景**: 学习者最初接触Windows驱动程序开发时遇到不少困难,经历了一段时间的摸索后逐渐入门。这一过程中,作者参考了...

    jz2440学习笔记-设备驱动

    本文主要讲述了s3c2440 Linux设备驱动开发过程中的重要细节,包括字符设备驱动程序的设计、实现和测试。下面是相关知识点的总结: 1. 设备驱动程序的基本结构: 在Linux设备驱动程序中,需要定义一个结构体file_...

    Linux设备驱动程序学习-170页-pdf

    《Linux设备驱动程序学习》是一本深入探讨Linux操作系统下设备驱动程序开发的教程,共170页。这本书旨在帮助读者理解Linux内核与设备之间的交互机制,掌握编写高效、稳定设备驱动的基本技能。标签“Linux 设备驱动 ...

    inux设备驱动开发学习笔记

    本学习笔记主要关注Linux环境下对设备驱动程序的构建和优化,这是一门涉及多方面知识的综合学科。 首先,我们要理解Linux设备驱动的基本概念。在Linux系统中,设备驱动是操作系统内核的一部分,它提供了与硬件设备...

    《Linux 设备驱动开发详解》(宋宝华) 学习笔记.zip

    《Linux 设备驱动开发详解》是宋宝华先生的一本经典著作,专注于讲解Linux系统下的设备驱动程序开发。这本书深入浅出地介绍了如何为各种硬件设备编写驱动程序,是嵌入式Linux开发者的重要参考资料。在学习这本书的...

    linux设备驱动程序笔记

    这份"Linux设备驱动程序笔记"深入浅出地讲解了如何编写和理解这些程序,对于学习Linux内核机制和提升系统开发能力具有极大价值。 笔记可能涵盖了以下几个核心知识点: 1. **设备模型**:Linux设备模型提供了一种...

    linux驱动程序设计学习笔记

    以上就是《Linux设备驱动程序》第三版学习笔记的主要内容,涵盖了Linux驱动开发的各个方面。通过深入学习和实践,你可以掌握构建高效、可靠的Linux驱动程序的技巧,为你的Linux开发事业奠定坚实的基础。

    Linux Kernel学习笔记

    以下是 Linux Kernel 的学习笔记,涵盖了存储器寻址、设备驱动程序开发、字符设备驱动程序、PCI 设备、内核初始化优化宏、访问内核参数的接口、内核初始化选项、内核模块编程和网络子系统等方面的知识点。...

Global site tag (gtag.js) - Google Analytics