首先,个人感觉设备驱动程序与应用程序中的文件操作隔得有点远,用户空间不论是直接使用系统调用还是库函数都是通过系统调用的接口进入内核空间代码的。但是看过一个博客的分析整个过程,感觉中间层太过麻烦,必须经过虚拟文件系统才能真正到达驱动部分,对与我这个新手来说确实读不了整个过程的代码,没办法真正理解真个过程的明细。所以就从表面上看看系统调用跟驱动程序是怎样连接起来的。

就拿LDD3上面用内存模拟字符设备的例子来理解。

首先我们要动态分配一个可用的设备号,这个设备号包括主设备和从设备号。(假定是250.0,250是主,0是从,运气不好总是分到250凸-。-凸)设备号是绑定很多东西的纽带。

在得到设备号之后,我们创建了一个cdev变量,该变量在内核里用来表示一个设备,在初始化时,我们就将设备号填写到了该结构体中。也就是说我们在内核里搞到一个设备,上面写着250.0 。除了给这个设备结构体一个号码以外,还需要给它一组操作,告诉他遇到特定的命令,这个设备该怎么做。也就是file_operation

另外还有一个重点就是设备文件,在/dev/下创建,创建语法mknod name c 主 从。这个语句也透露了玄机,我们的设备文件是和一个设备结构体一一对应的。

然后就不难理解了系统调用了是怎么跟设备驱动联系起来的了,系统调用操作设备文件,根据设备文件的设备号信息,我们就到内核中去发现有该设备号的设备结构体,结构体里面有对应该系统调用的操作实体,就操作就行了。

除此之外还有两点非常重要就是传递给驱动的那两个参数,指向file的指针和指向inode的指针。inode是内核中表示文件的东西,应该是始终存在在内核中的吧,而file结构体是对应与inode表示打开的文件的。一个文件只有一个inode,但可以有多个file,驱动程序中的参数是自动又系统传值的吧。

这就是个人对设备驱动的一些理解,没看过源码,不能保证,细节部分基本没有,只为方便理解而已,希望有帮助。

进一步理解。

在更仔细阅读了LDD之后,对这个问题有了新的认识。

1.在内核中使用cdev结构体表示一个设备,内部有两个重要的成员就是设备号和file_operations这两个还是能比较充分地体现设备的信息,然后通过内部的listhead指针可以帮助设备串到链表中去,cdev_add函数所谓注册设备,也就是将节点加入到设备链表中去。

2.打开一个设备文件的时候,根据文件的设备号搜索链表,找到相应的cdev结构。然后我们就用cdev结构里的成员去填充inode和file结构。比如说inode里的设备号和cdev指针,file中的f_op

除此之外还有几句关键句:file结构由内核在open时创建,并传递给在该文件上进行操作的所有函数。

file中的f_pos当前的读写位置,读写操作会使用它们接收到的最后那个指针参数来更新这一位置。

linux 设备驱动程序中的一些关联性思考的更多相关文章

  1. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  2. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  3. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  4. 如何编写Linux设备驱动程序

    一.Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看 ...

  5. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  6. 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O

    今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...

  7. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  8. Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】

    转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...

  9. 内存映射(Linux设备驱动程序)

    第一部分:mmap系统调用直接将设备内存映射到用户进程的地址空间里. 第二部分:跨越边界直接訪问用户空间的内存页.一些相关的驱动程序须要这样的能力,(用户空间内存怎样映射到内核中的方法get_user ...

随机推荐

  1. request.getContextPath是为了解决相对路径的问题,可返回站点的根路径

    假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下结果 ...

  2. spring mvc 单元测试示例

    import java.awt.print.Printable; import java.io.IOException; import javax.servlet.http.HttpServletRe ...

  3. JSON与字符串互相转换的几种方法

    1 2 3 4 5 6 7 8 字符串转对象(strJSON代表json字符串)   var obj = eval(strJSON);   var obj = strJSON.parseJSON(); ...

  4. T3187 队列练习3 codevs

    http://codevs.cn/problem/3187/ 题目描述 Description 比起第一题,本题加了另外一个操作,访问队头元素(编号3,保证访问队头元素时或出队时队不为空),现在给出这 ...

  5. Heavy Transportation(最短路)

    poj 1797 ——Heavy Transportation 思路: 这道题我们可以采用类似于求最短路径的方法,用一种新的“松弛操作”去取代原本的方法. 我们可以记录d[u]为运送货物到点j时最大可 ...

  6. Spring的Hello World工程

    通过Spring的Hello World工程研究以下几个点: 0.如何创建工程及引入依赖. 1.通过Spring的beans.xml实现依赖注入,动态创建实例. 2.了解Spring的工作原理. 具体 ...

  7. Word中将文本框、图形对象中的文本边距调整

    在进行word的实际使用中,如下图制作流程图时,常常发现文字在图形对象中,老是显示不全,而且上部却空出很多距离.此时可以通过设置形状格式--文本框 --- 上.下编辑进行设置. 可以完美解决文本框中文 ...

  8. mysql 建立utf8字符集数据库

    CREATE DATABASE `evaluate` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  9. Application具体解释(一)

     1:Application是什么? Application和Activity,Service一样,是android框架的一个系统组件.当android程序启动时系统会创建一个 applicati ...

  10. ubutu强制结束进程 kill -9 ProcessID

    强制终止进程 kill -9 2128 表示强制结束进程号 2128 对应的进程.