linux驱动最佳实践

linux驱动最佳实践

ID:15501143

大小:3.55 MB

页数:130页

时间:2018-08-03

linux驱动最佳实践_第1页
linux驱动最佳实践_第2页
linux驱动最佳实践_第3页
linux驱动最佳实践_第4页
linux驱动最佳实践_第5页
资源描述:

《linux驱动最佳实践》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、Linux设备驱动最佳实践宋宝华背景篇2设备驱动分类3设备驱动模型•总线!•设备!•驱动!4udev和netlink5Linux内核模块特点•模块本身不被编译入内核映像,这控制了内核的大小•模块一旦被加载,它就和内核中的其它部分完全一样6一个最简单的Linux内核模块7内核模块基本工具与信息!lsmod!insmod/modprobe!rmmod!modinfo!/proc/modules!/sys/module/your_module8Linux内核模块组成!模块加载函数!模块卸载函数!模块许可证声

2、明!模块参数!模块导出符号!模块作者等信息声明9Linux内核模块参数10Linux内核模块导出符号11Linux内核模块编译!Makefile模板!多个源文件12原子操作voidatomic_set(atomic_t*v,inti);voidatomic_add(inti,atomic_t*v);voidatomic_sub(inti,atomic_t*v);voidatomic_inc(atomic_t*v);intatomic_inc_and_test(atomic_t*v);intatomic_sub_and_test(inti,

3、atomic_t*v);intatomic_add_return(inti,atomic_t*v);....13中断Interrupt!Handling!•synchronize_irq!—!wait!for!pending!IRQ!handlers!(on!other!CPUs)!!•disable_irq_nosync!—!disable!an!irq!without!waiDng!!•disable_irq!—!disable!an!irq!and!wait!for!compleDon!!•enable_irq!—!enable!h

4、andling!of!an!irq!!•set_irq_wake!—!control!irq!power!management!wakeup!•free_irq!—!free!an!interrupt!•request_irq!—!allocate!an!interrupt!line!!•local_irq_disable()!!•local_irq_enable()!!•local_irq_save()!!•local_irq_restore()!14自旋锁和信号量•自旋锁!忙等待,无调度开销!进程抢占被禁止!锁定期间不能睡觉spinl

5、ock_tlock;spin_lock_init(&lock);spin_lock(&lock);//获取自旋锁,保护临界区...//临界区spin_unlock(&lock);//解锁•信号量!拿不到就切换进程,有调度开销!锁定期间可以睡觉,不用于中断上下文//定义信号量DECLARE_MUTEX(mount_sem);down(&mount_sem);//获取信号量,保护临界区...criticalsection//临界区...up(&mount_sem);//释放信号量15“读者-写者锁”和”读-拷贝-更新(RCU)”•读者—写者锁

6、多个读执行单元被允许同时进入临界区。读者自旋锁可以这样定义:rwlock_tmyrwlock=RW_LOCK_UNLOCKED;read_lock(&myrwlock);/*Acquirereaderlock*//*...CriticalRegion...*/read_unlock(&myrwlock);/*Releaselock*/但是,如果一个写执行单元进入了临界区,其他的读和写都不被允许进入。写者锁的用法如下:rwlock_tmyrwlock=RW_LOCK_UNLOCKED;write_lock(&myrwlock);/*Acqu

7、irewriterlock*//*...CriticalRegion...*/write_unlock(&myrwlock);/*Releaselock*/•读—拷贝—更新(RCU)其基本理念是读执行单元不需要加锁,但是写执行单元会变得更加复杂,它们会在数据结构的一份拷贝上执行更新操作16mutex"互斥体接口代替了老的信号量接口(semaphore),它互斥体诞生于-rt树,"在2.6.16内核中被融入主线内核。使用范例:#include/*Staticallydeclareamutex.Todynamic

8、allycreateamutex,usemutex_init()*/staticDEFINE_MUTEX(mymutex);/*Acquirethemutex.Thisisinexpensiv

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。