linux 设备驱动程序中的一些关联性思考
首先,个人感觉设备驱动程序与应用程序中的文件操作隔得有点远,用户空间不论是直接使用系统调用还是库函数都是通过系统调用的接口进入内核空间代码的。但是看过一个博客的分析整个过程,感觉中间层太过麻烦,必须经过虚拟文件系统才能真正到达驱动部分,对与我这个新手来说确实读不了整个过程的代码,没办法真正理解真个过程的明细。所以就从表面上看看系统调用跟驱动程序是怎样连接起来的。
就拿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 设备驱动程序中的一些关联性思考的更多相关文章
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- 如何编写Linux设备驱动程序
一.Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看 ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
- 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O
今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...
- Linux设备驱动程序 第三版 读书笔记(一)
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...
- Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】
转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...
- 内存映射(Linux设备驱动程序)
第一部分:mmap系统调用直接将设备内存映射到用户进程的地址空间里. 第二部分:跨越边界直接訪问用户空间的内存页.一些相关的驱动程序须要这样的能力,(用户空间内存怎样映射到内核中的方法get_user ...
随机推荐
- Linux(14):集群架构进阶 --- CentOS 7
CentOS 7 CentOS 7 管理软件常用命令: vim /etc/selinux/config # 修改 SELINUX 开机自启动与否 setenforce 0 # 关闭 SELINUX g ...
- linux与windows查看占用端口的进程ID并杀死进程
有时候tomcat出现端口被占用,需要查出进程ID并杀死进程. 1.查找占用端口的进程ID(windows与linux一样 8005也可以加上引号 grep可以用findstr替换) 6904就 ...
- 让Mac OS X下的终端像Linux那样拥有丰富多彩的颜色显示
我们知道Linux下的命令行终端具有颜色回显功能,用ls命令查看目录或者文件,终端会以不同的颜色来区分:使用vim命令行编辑器打开脚本或其他源程序代码会以语法高亮模式显示.而Mac OS X下的终端却 ...
- (2)Swing窗体基本设置
import javax.swing.*; import javax.swing.plaf.FontUIResource; import java.awt.*; import java.util.En ...
- AIO
IBM® 市场 (英文) 提交 我的 IBM 站点导航 学习 开发 社区 学习 Java technology 内容 概览 简单介绍 Asynchronous I/O 开始简单的异步 I/ ...
- JS标签获取另一个页面传过来的href值
a href=b.html?id=楼主>B页面</a>b.html中的获取函数:function getParam(){C1=window.location.href.split(& ...
- docker on UP Board
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我的博客: http://www.cnblogs.co ...
- FlashBuilder找不到所需要的AdobeFlashPlayer调试器版本的解决方案
这个问题就是因为你所装的FlashPlayer不是调试器版本.如果你的FlashPlayer是调试版,那么你随便打开一个有Flash的页面,然后右键点击Flash,就会有一个调试器,菜单,当然它现在是 ...
- 基于SpringMVC框架使用ECharts3.0实现折线图,柱状图,饼状图,的绘制(上篇)
页面部分 <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html> ...
- mybatis一对多
mapper.xml <mapper namespace="com.oracle.dao.one2manyDao"> <resultMap type=" ...