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

就拿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. [COI2007] Patrik 音乐会的等待 (单调栈,模拟)

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...

  2. getParameter 与 getAttribute的区别

    request.getAttribute():是request时设置的变量的值,用request.setAttribute("name","您自己的值");来设 ...

  3. AC日记——[SDOI2009]晨跑 bzoj 1877

    1877: [SDOI2009]晨跑 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2131  Solved: 1142[Submit][Status][ ...

  4. 高性能mysql之schema与数据类型优化

    1.数据类型 http://www.cnblogs.com/YDDMAX/p/4937770.html

  5. Jetson TK1 一:调整屏幕分辨率

    先点击分辨率调整的那个对话框,就是1024×768之类的那个,选定一个分辨率,我选的是1366x768(16:9)的那个,然后连续按7下tab按键,然后回车,然后再点击弹出的选项右边一个就能保存了.

  6. Java普通员工管理系统

    login GUI界面(登录) package 普通员工管理系统; import java.awt.event.ActionEvent; import java.awt.event.ActionLis ...

  7. DDCTF2019逆向分析前俩题WriteUP

    DDCTF2019 笔者做了前俩道题.冷不丁过去一个月了.现在在此做一下WriteUp:题目链接: 1:题目1 2:题目2 reverse1:writeup: 1.程序打开后如下所示 2.查壳结果为U ...

  8. 实验三:分别用for,while和do-while循环语句以及递归方法计算n!,并输出算式

    1.for循环语句计算n! 2.while循环语句计算n! 3.do-while语句计算n! 4.递归方法计算n! 5.心得:在此次实验中不知道如何从键盘进行输入,通过百度后找到一种容易理解的输入方法 ...

  9. android Activity生命周期的例子

    package com.example.yanlei.yl2; import android.app.AlertDialog; import android.content.DialogInterfa ...

  10. 实践与理解CMM体系

    我的项目管理之路--5.实践与理解CMM体系   分类: 管理专辑(65) 过程改进(9) 软件工程(52) 版权声明:本文为博主原创文章,未经博主允许不得转载. 一个现代企业我们可以把它比作为自然界 ...