欢迎来到天天文库
浏览记录
ID:15501143
大小:3.55 MB
页数:130页
时间:2018-08-03
《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
此文档下载收益归作者所有