首先,希望可以明确一下概念:
1、要说的是,驱动,必然是与内核紧密相连的底层程序;并且接口对用户是不可见的。所以你要想到的是如何把驱动和内核联系起来,第一个就想到了模块(modules),模块就像一个载体,一个容器,通过它,会把你写好的程序插入(装载)到内核可见的区域,从而使内核感知到你的驱动的存在,然后用户空间才能通过系统调用的形式联系到驱动,从而完成它的任务,所以你首要了解模块。
2、驱动位于OS之下,为OS提供硬件操作(当然驱动也有可能不是针对硬件的)的逻辑和底层抽象的封装,所以他要上下兼顾,上边必须符合OS的驱动调用接口,下边要处理好硬件的操作。
3、Linux比较特殊,把所有的设备都抽象成了文件,这样的话操作接口会比较统一,并且给开发也带来了很大的方便。Linux下设备文件有三种:字符设备、块设备、网络设备。
简单的介绍一下做一个驱动(字符设备驱动)需要做哪些:
1、表征设备存在的结构体cdev:
整个过程都是围绕着这个结构体在进行。对他的各元素赋值并通过模块加载到内核即可。我们逐一的说明一下。
对于,kobject的初始化是在cdev_init里边完成的,它在Fs/Char_dev.c :
这里连带着把kobject、list_head、file_operations也都做了赋值或初始化;这里做为参数你要有一个file_operations来用于赋值,,而file_operations包含了对该字符设备进行操作的所有可能用到的函数(接口)。从而就引出了file_operations,它是整个字符驱动的核心,也是要把所有处理逻辑绑定的对象:
这里是个简单的例子,我们要做的就是实现那些等号后边的函数,并对其赋值。下边是file_operations的原型,很完备的接口,只用实现你用到的就可以了(在include/linux/fs.h中):
到这里,通过cdev的初始化,我们已经把你写的逻辑和cdev联系起来了(通过file_operations),然后通过:
cdev.owner = THIS_MODULE;
直接复制把cdev和当前模块联系了起来。然后是通过:
dev_tdevno =MKDEV(222,0);
用MKDEV宏生成一个主设备号222,此设备号0的dev_t类型的设备号变量devno,之后是把设备号和设备结构体cdev关联起来,这样设备才能间接找到它的处理函数,用这个来完成关联:
cdev_add(&dev->cdev,devno,1);
well,设备结构体准备好了,和具体的设备号也约定好了(这样属于该类型的设备会直接来找它进行具体的处理),另外,也和当前模块挂接好了,还差一步就是让内核知道它的存在,用下边的函数:
register_chrdev_region(devno,1,"globalmem");
把当前设备注册到内核,这个和cdev没有关系,只是对虚拟设备globalmem进行内核的注册,而他们联系的纽带就是devno。当然对应的还有注销函数:
unregister_chrdev_region(devno,1);
他们一般是成对出现的。
这样就差不多了,整个过程及原理也就是这样了,更详细的,可以好好品读一下Linux驱动开发详解的第六章。讲得非常详细。另外看一下另外一篇blog,【Linux下第一个驱动程序】,是一个实例,并附有大量说明,这样应该可以建立一个初步的概念。然后就是循循渐进了,哈哈。
【本文doc文档下载】
。
。
分享到:
相关推荐
在 Linux 系统中, 设备驱动程序隐藏了设备的细节, ...首先介绍了 Linux 系统中设备驱动程序的基本结构, 以及字符设备驱动程序应提供的入口点, 最后用进程虚拟字符设 备,编写了相应的驱动程序, 实现进程间的信息读写。
Linux设备驱动程序开发简介 Linux设备驱动程序结构 Linux设备驱动程序加载方式 实验:编写一个字符设备驱动程序(LED或蜂鸣器) 分别用静态编译,模块动态加载方法实现加入内核
字符设备驱动程序是Linux系统最基本、最常用的驱动程序结构。以AT91RM9200的硬件平台上 的实时时钟设备DS1302驱动开发为例,详细分析了Linux 2.6下字符设备驱动程序的构建过程,并在 所设计的驱动程序的基础上,编写...
5.8 字符设备驱动程序注意事项115 5.9 查看源代码115 第6章 串行设备驱动程序118 6.1 层次架构119 6.2 uart驱动程序121 6.2.1 设备实例:手机122 6.2.2 rs-485132 6.3 tty驱动程序132 6.4 线路规程...
概括的说,字符设备驱动主要要做三件事:1、定义一个结构体static struct file_operations变量,其内定义一些设备的打开、关闭、读、写、控制函数;2、在结构体外分别实现结构体中定义的这些函数;3、向内核中注册或...
字符设备驱动程序开发流程 设备号 字符设备驱动的重要数据结构介绍 字符设备的注册流程 字符设备相关操作 创建设备文件 编写驱动程序程序 主设备号 –前12位 表示与设备文件相关联的驱动程序 确定设备类型 ...
78 4.5 电源管理 79 4.6 查看源代码 79 第5章 字符设备驱动程序 81 5.1 字符设备驱动程序基础 81 5.2 设备实例:系统cmos 82 5.2.1 驱动程序初始化 83 5.2.2 打开与释放 86 5.2.3 数据交换 88 5.2.4 查找 ...
认识目标板各设备型号及开发中注意事项 ...Linux下设备驱动程序开发框架和流程 Linux下模块化驱动程序设计(动态加载) 设备驱动加入Linux内核中 实验:编写驱动程序框架+测试用例(字符型设备)两种初始化方式
第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 ch04.第四章 调试技术 内核中的调试支持 通过打印...
第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 第四章 调试技术 内核中的调试支持 通过...
1.掌握简单字符设备驱动程序编写方法。 2.编写应用程序对驱动程序进行测试,学习应用程序与驱动程序之间的调用过程。 二、实验环境 Linux 3.14.0 嵌入式开发板 三、实验内容及实验原理 1. 实验要求: ①定义一...
1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................
Linux 设备驱动程序学习(0) -设备驱动介绍& Hello, world!模块 模块结构介绍 字符设备驱动程序 调试技术 并发和竞态 高级字符驱动程序操作 阻塞型 I/O 和休眠
结构中的一个域name是指向设备驱动程序名的指针;另一个域fops是指向-个封装了文件操作函数集结构的指针。这些文件操作函数就是对这个字符设备进行具体的如打开、读、写、关闭等文件操作驱动程序。 字符设备注
3.2字符设备相关知识字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性 3.3字符设备程序结构图 1字符设备驱动程序结构模块
第12课第4.1节 字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构 第12课第4.2节 字符设备驱动程序之中断方式的按键驱动_Linux中断处理结构 第12课第4.3节 字符设备驱动程序之中断方式的按键驱动_编写代码 ...
第7章 Linux设备驱动程序开发 7.1 设备驱动概述 7.1.1 设备驱动和文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备驱动基础 7.2.1 设备驱动中关键数据结构 7.2.2 字符设备驱动开发 ...
1.1 Linux设备驱动程序分类 Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。在2.0.xx到2.2.xx的...