Linux驱动基础

编写 Linux驱动程序,是为了尽可能发挥硬件的作用以提高性能,但其难点不是在于对硬件的具体操作,而是需要了解清楚现有驱动程序的框架,并在这个框架中找到修改的位置,加入与设计相关的硬件。用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是次设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个串口,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。在用户进程通过系统调用而间接调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。
 

Linux的驱动程序在整个linux中的位置:

应用层:

         首先应用层的代码通过使用open("/dev/xxx", RW);打开一个设备文件节点。然后使用write,read等接口操作返回的文件描述符。但是目录/dev/xxx是怎么来的呢?

驱动层:

         Linux系统通过内核的数据结构file_operstions中的成员open,write,read,llseek,ioctrl,close等函数指针指向内核中的xxx_open,xxx_write,xxx_read,xxx_llseek,xxx_ioctrl,xxx_close接口。

          驱动程序的代码通过内核提供的宏module_init(abc);执行设备的注册函数chrdev相应的设备号。使用module_exit(abc);执行unregister_chrdev注销设备。当然此时在/dev/目录下还没有相应的设备号的设备文件,在proc/devices中我们可以看到注册的相应的设备文件和设备号。这个时候可以通过mknod 命令手动建立一个相同设备号的文件(文件名可以不同)yyy,这时应用层就可以通过open系统调用打开设备文件了。也可以在设备注册函数中调用内核API自动创建设备节点,create_class和create_class device接口。

Linux 的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。用户程序要想进入到内核空间调用硬件驱动程序只能通过某些库函数和 Linux 系统调用。

可将编写 Linux 字符设备驱动程序的流程总结如下:
1. 查看原理图、数据手册,了解设备的操作方法;
2. 在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始;
3. 注册驱动程序, 给用户空间提供访问的接口,比如在/dev/目录下生成设备文件;
4. 设计所要实现的操作:比如 open、 close、 read、 write、 ioctl 等函数;
5. 实现中断服务(中断并不是每个设备驱动所必须的);
6. 编译该驱动程序到内核中,或者用 insmod 命令加载;
7. 编写应用程序测试驱动程序。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值