Linux字符设备驱动组成-加载,卸载day01

作者: kiki
参考资料:
http://ask.wosoni.com/q/6167521.html
转载请注明出处!

day01
摘要: linux设备驱动原理, 字符设备加载卸载函数

最近在学习linux设备驱动相关的知识.
为了能够系统的学习,把知识点总结一下,方便以后复习查证.

1.原理:
系统调用是操作系统内核和应用程序之间的接口
设备驱动程序是操作系统内核和机器硬件之间的接口
设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:
(1)对设备初始化和释放;

(2)把数据从内核传送到硬件和从硬件读取数据;

(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据;

(4)检测和处理设备出现的错误。
  在Linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。
  
注意:在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度.
Linux系统下一切皆文件,驱动程序的调用无非是一些系统调用,这里就用到一个很重要的结构体:file_operations.下文详细说明.
以下知识点侧重字符设备驱动.

2.Linux字符设备驱动的组成
(1)加载,卸载
加载函数: 设备号申请, cdev注册
卸载函数: 设备号释放, cdev注销
模板:

/*设备结构体*/
struct xxx_dev_t{
struct cdev cdev;
...
}xxx_dev;
/*模块加载函数*/
static int __init xxx_init(void)
{
...
  cdev_init(&xxx_dev.cdev,&xxx_fops);  /*初始化*/
  xxx_dev.cdev.owner = THIS_MODULE;
/*获取字符设备号*/
  if (xxx_major){
	register_chrdev_region(xxx_dev_no,1,DEV_NAME);
  }else{
	alloc_chrdev_region(&xxx_dev_no,0,1,DEV_NAME);
  }
    ret = cdev_add(&xxx_dev.cdev,xxx_dev_no,1);   /*注册设备号*/
  }
/*模块卸载函数*/
static void__exit xxx_exit(void)
{
	unregister_chrdev_region(xxx_dev_no,1); /*释放占用的设备号*/
	cdev_del(&xxx_dev.cdev); /*注销设备*/
	...
}

day02介绍file_operations结构体

你可能感兴趣的:(Linux设备驱动开发)