首先,希望可以明确一下概念:
1、 要说的是,驱动,必然是与内核紧密相连的底层程序;并且接口对用户是不可见的。所以你要想到的是如何把驱动和内核联系起来,第一个就想到了模块(modules),模块就像一个载体,一个容器,通过它,会把你写好的程序插入(装载)到内核可见的区域,从而使内核感知到你的驱动的存在,然后用户空间才能通过系统调用的形式联系到驱动,从而完成它的任务,所以你首要了解模块。
2、 驱动位于OS之下,为OS提供硬件操作(当然驱动也有可能不是针对硬件的)的逻辑和底层抽象的封装,所以他要上下兼顾,上边必须符合OS的驱动调用接口,下边要处理好硬件的操作。
3、 Linux比较特殊,把所有的设备都抽象成了文件,这样的话操作接口会比较统一,并且给开发也带来了很大的方便。Linux下设备文件有三种:字符设备、块设备、网络设备。
简单的介绍一下做一个驱动(字符设备驱动)需要做哪些:
1、 表征设备存在的结构体cdev:
struct cdev{
struct kobject kobj; /* 内嵌的kobject对象*/
struct module *owner; /*所属模块*/
struct file_operations *ops; /*文件操作结构体*/
struct list_head list;
dev_t dev; /*设备号,为32 位,其中高12 位为主设备号,低20 位为次设备号*/
unsigned int count;
};