linux驱动编程基础,linux驱动编程基础

在编写驱动程序的时候需要注意的基本基本概念:

(1)编写访问硬件的内核代码时不要给用户强加任何策略,因为不同的用户会有不同的需求,驱动程序应该处理如何使硬件可以使用的问题,而将怎样使用硬件的问题留给上层应用。这可以说硬件驱动灵活性的基础,灵活的驱动可以给用户更多的发挥空间。

(2)由于驱动程序是运行在内核态,而linux操作系统对内核态的程序完全信任,所以驱动程序中的错误可能会导致整个系统的崩溃,在编写驱动的时候就要尽量避免错误出现,特别要注意的是缓冲区溢出、非法指针等错误。一般来说,保持驱动程序的简洁和清晰是避免错误的有力手段。

(3)作为驱动的另一个要求是不要占用太多的系统资源,比如内存和CPU时间,否则会使系统的性能严重下降,只能作为失败的驱动程序而被抛弃。与常规应用程序可以访问到很大的栈空间不同,内核的所有代码公用很小(可以小到4096字节)的栈,所以尽量不要在内核代码中使用占有内存比较多的自动变量,节省内核的栈资源。

(4)如果驱动程序可以被多个进程访问,还要注意处理并发问题,永远不能假定用户空间只能按特定的方式访问内核资源。

在linux系统中,多数设备驱动通过设备号和文件系统中的设备文件建立对应的关系,一个设备号可以分解为主设备号和子设备号。当应用程序用open系统调用打开一个设备文件的时候,内核通过该文件的主设备号从一个驱动列表中找到这个设备号对应的驱动程序,并调用这个驱动的open函数接口。而子设备号的解释就由设备驱动来负责,内核仅仅把子设备号传递给驱动程序。

linux系统可以将设备粗略的看成三个类型:字符设备、块设备和网络接口。其中字符设备是能够向字节流一样被访问的设备,例如字符终端和串口。对这种类型设备的设备文件进行操作和对普通文件操作非常类似,只是对大部分设备的操作只能是顺序进行,不能移动操作的指针。这样的设备驱动程序一般要实现open、close、read、write系统调用。块设备是可以容纳文件系统的设备,它和字符设备的区别对用户是透明的,只在内核中要实现不同的接口,同时还要支持挂载操作。网络接口设备和前两种设备完全不同,它并不在文件系统上有对应的设备文件。对网络设备的访问是通过唯一的名字,如eth0来进行的。和网络设备的通信也是采用一套不同的和数据传输相关的函数进行的,如socket、bind、listen、accept、connect系统调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值