`
shinfocom
  • 浏览: 1188177 次
文章分类
社区版块
存档分类
最新评论

Linux下字符设备驱动程序的结构

 
阅读更多

首先,希望可以明确一下概念:

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设备驱动程序开发基础(PPT)

    Linux设备驱动程序开发简介 Linux设备驱动程序结构 Linux设备驱动程序加载方式 实验:编写一个字符设备驱动程序(LED或蜂鸣器) 分别用静态编译,模块动态加载方法实现加入内核

    嵌入式Linux系统中字符设备驱动程序的设计与实现

    字符设备驱动程序是Linux系统最基本、最常用的驱动程序结构。以AT91RM9200的硬件平台上 的实时时钟设备DS1302驱动开发为例,详细分析了Linux 2.6下字符设备驱动程序的构建过程,并在 所设计的驱动程序的基础上,编写...

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

    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 线路规程...

    Linux字符设备驱动(转载)

    概括的说,字符设备驱动主要要做三件事:1、定义一个结构体static struct file_operations变量,其内定义一些设备的打开、关闭、读、写、控制函数;2、在结构体外分别实现结构体中定义的这些函数;3、向内核中注册或...

    字符设备驱动.doc

    字符设备驱动程序开发流程 设备号 字符设备驱动的重要数据结构介绍 字符设备的注册流程 字符设备相关操作 创建设备文件 编写驱动程序程序 主设备号 –前12位 表示与设备文件相关联的驱动程序 确定设备类型 ...

    精通LINUX设备驱动程序开发

    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下模块化驱动程序设计(动态加载) 设备驱动加入Linux内核中 实验:编写驱动程序框架+测试用例(字符型设备)两种初始化方式

    linux设备驱动程序

    第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 ch04.第四章 调试技术 内核中的调试支持 通过打印...

    LINUX设备驱动第三版_588及代码.rar

    第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 第四章 调试技术 内核中的调试支持 通过...

    XDU嵌入式驱动程序设计 实验一 简单字符设备驱动

    1.掌握简单字符设备驱动程序编写方法。 2.编写应用程序对驱动程序进行测试,学习应用程序与驱动程序之间的调用过程。 二、实验环境 Linux 3.14.0 嵌入式开发板 三、实验内容及实验原理 1. 实验要求: ①定义一...

    linux设备驱动程序第三版

    1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................

    linux设备驱动学习笔记

    Linux 设备驱动程序学习(0) -设备驱动介绍& Hello, world!模块 模块结构介绍 字符设备驱动程序 调试技术 并发和竞态 高级字符驱动程序操作 阻塞型 I/O 和休眠

    嵌入式系统/ARM技术中的Linux字符设备驱动程序的注册

     结构中的一个域name是指向设备驱动程序名的指针;另一个域fops是指向-个封装了文件操作函数集结构的指针。这些文件操作函数就是对这个字符设备进行具体的如打开、读、写、关闭等文件操作驱动程序。  字符设备注

    11 编写字符设备驱动1

    3.2字符设备相关知识字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性 3.3字符设备程序结构图 1字符设备驱动程序结构模块

    韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步

    第12课第4.1节 字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构 第12课第4.2节 字符设备驱动程序之中断方式的按键驱动_Linux中断处理结构 第12课第4.3节 字符设备驱动程序之中断方式的按键驱动_编写代码 ...

    嵌入式设计及linux驱动开发指南——基于ARM9处理器.pdf

    第7章 Linux设备驱动程序开发 7.1 设备驱动概述 7.1.1 设备驱动和文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备驱动基础 7.2.1 设备驱动中关键数据结构 7.2.2 字符设备驱动开发 ...

    Linux 驱动 程序

    1.1 Linux设备驱动程序分类 Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。在2.0.xx到2.2.xx的...

Global site tag (gtag.js) - Google Analytics