文档章节

设备节点的说明

青春无极限
 青春无极限
发布于 2017/04/21 14:21
字数 1397
阅读 37
收藏 0

用户态通过mknod建立文件,VFS负责把它索引到对应的inode上,让它和特定驱动关联。用户态调用open的时候,VFS再创建一个filep,并一起传递给那个驱动(register_chrdev的那个驱动),那个驱动本身有所有调用的回调,也可以给filp建立另一套回调,无所谓,之后其他调用就直接可以指向设备本身了。

这个应该回答原题的问题了。

然后回答动态模块的问题:

内核的动态模块原理和so的原理完全一样,加载的时候同时展开代码段和数据段,但实施上有所不同,so是lazy加载,没有用到的时候不会真正加载到内存中,但内核是真正加载。

ko中的全局变量,和非ko的全局变量一样,在模块加载后就一直在系统中。

不存在“重要模块”,模块是否加载,都是init程序的配置引起的,如果init初始化树中没有加载动态模块,就不会有任何动态模块加载到系统中。

通常动态模块不会“扫描”设备,动态模块只会“驱动”设备。比如你有一个平台设备的ko,你加载进去了,init_module中注册到platform_bus子系统中,platform_bus子系统会在注册的时候用match函数给你match一次所有当初有人报过给它的所有device,如果device和你的注册match,就会产生probe(),但你的驱动无权主动去扫描硬件的。反过来,如果是你的驱动先注册,真正的设备后插入(比如USB key),这个事情会一样发生。最终还是match,然后probe。

mknod创建的文件是“设备文件”,区别与“普通文件”。
1: 设备驱动建立了这个设备node,这个Node 是设备文件,mknod时 程序使用设备的一个“接口”,通过此“接口”你可以访问到它指向的具体设备。如果你没有moknod ,在linux的“一切皆文件”的思想下,你怎么才能访问使用你的设备呢? 所以,“为设备建立一个文件吧”
2:当程序调用 open打开这 /dev/demon 的“文件时”, 此时的open仅仅是在VFS(虚拟文件系统)层面的open, VFS会在内存中创建一个 file_struct的结构,并返回一个fd, 其实fd 是和这个file_struct相关联的:
比如在进程的files_struct结构中,有fd数组和fd_array数据,fd存放文件描述符,fd_array存放进程打开的 file_struct, 其中每个fd 指向fd_array中的一个元素。

3:fd_array中的存放的 是file_struct,每个file_struct结构中都 有一个类型为file_operations毕结构的指针f_op,f_op指向了一组 可以对文件进行的操作的函数(比如read)。当真正对文件进行操作时(比如read),f_op指向的操作函数(read)会调用 “针对该文件所属的类型"的具体的真正的函数来执行操作。(比如:ext3_read() /MS_dos_read()).

所以对demon进行操作时,fd 和file_struct 最后还是 指向 了你所 创建的 demon代表的设备。

在一切皆文件的思路下,设备文件/dev/demon 可以理解为“你的设备在VSF中的一个符号链接(VFS的inode,设备文件没有相应的磁盘inode(我在rhel6.5 x86_64:2.6.32-431环境下debugfs 看不到/dev下面文件的索引节点号),而普通的文件在磁盘是有inode的)”,当Open时,VSF为该inode(/dev/demon) 创建对应的 VSF的file_struct,以及fd。

fd和 file_struct 只是在你open设备时,在内存中创建, 可以把fd/file_struct 理解成 “你的设备在内存中的映射”。

inode 节点——> 文件在内核态中的fs中的描述结构,和具体文件系统类型无关,不属于哪一个进程,在内核的生命周期中一直存在于内存中,代表文件的实体。。。
file ——> 文件在进程中的描述符,随着进程死亡而被释放。。
fd ——> 为了封装file的复杂性,提供给用户在进程中索引file的一个索引号,fd只是打开的file的一个索引,进程真正操作的文件结构是file。。。。。

桥接模式——> 也叫handle/body模式,Linux在file与inode直接模仿了桥接模式,只有open之后,file才与具体的inode桥接起来,互相通信,一旦close,或者进程死亡,file可以消失,inode却随内核继续存在。通过桥接的隔离,file与inode可以分开进行各自的抽象和衍生,inode的组成元素有cdev, block_dev 等,因而向下可以管理操作各种字符设备,块设备。。。
mknod——>本质上是在/dev目录下创建一个inode节点,/dev目录一般有一个devtmpfs或者udevfs挂在在上面,也就是说mknod本质上就是创建/dev目录下的inode节点,创建过程中,传入的设备号,使得inode节点能在Linux内核中相关的注册链表里够找到对应的cdev或者block_dev结构体桥接起来。。。
再回到桥接模式——> file——>inode ——> cdev/block_device 中间可以看成两个桥接,open使得file与inode桥接起来,mknod使得inode和cdev/block_device桥接起来,每个部分都可以独自抽象衍生,和其它部分无关,只要调用的时候桥接起来就行。。。

© 著作权归作者所有

青春无极限
粉丝 2
博文 129
码字总数 71498
作品 0
卢湾
程序员
私信 提问
DLNA 在自己的APP 中添加投屏功能

功能:让本机的视频在其他设备上播放。 demo 学习中 关键词: cling demo from: DROID DLNA 关于投屏的原理,协议相关的知识已经在上一篇中说明。 关于设备搜索,查找等不在此处说明。 投屏...

Carlyle_Lee
2017/10/24
220
0
模块部署(译)

模块部署 概述 在 Tachyon 源代码树中, 目录包含一些工具可以协助你在 AWS EC2 或 virtualbox 搭建 Tachyon集群。 In Tachyon source tree, directory contains utilities to help you set...

Ryan-瑞恩
2015/10/21
59
0
CentOS 6.4 & 6.5下DRBD的安装配置

基础: 磁盘镜像技术DRBD DRBD(Distributed Replicated Block Device)是由内核模块和相关脚本构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立...

eui988
2015/01/31
108
0
【简单电脑性能测试代码】Java版本开方运算性能测试

正文之前 今天借到了实验室的两个运算节点的。所以迫不及待想测试下这两个节点的计算力。。。结果。。有点坑?还是我打开方式不对?待会再去问问! 正文 上面就是我抄的测试代码。。。下面看...

HustWolf
2018/06/09
0
0
Linux Kernel Device Tree 配置框架

背景:基于arm平台的soc种类繁多,硬件资源和配置各不相同。这些平台硬件相关的信息在设备树出现之前,是在kernel/arch/arm/plat-xxx目录和kernel/arch/arm/mach-xxx目录下硬编码的。在kerne...

yepanl
2018/12/02
124
0

没有更多内容

加载失败,请刷新页面

加载更多

关于PHP处理Json数据的例子

本文转载于:专业的前端网站➜关于PHP处理Json数据的例子 最近工作需要在原来静态看板(大屏)页面的基础上,实现数据的动态展示,而且需要定时刷新。 接到任务后就马不停蹄的开始修改页面: ...

前端老手
27分钟前
4
0
Archiva 不小心删掉了管理员权限怎么办

Archiva 的界面和 UI 比较容易出问题。 在添加用户和为用户进行权限修改的时候,不小心连 admin 这个用户的权限都删掉了。 这个时候应该如何恢复 admin 这个用户的权限? 这个时候你可以尝试...

honeymoose
今天
7
0
Java8新特性之空指针异常的克星Optional类

Java8新特性系列我们已经介绍了Stream、Lambda表达式、DateTime日期时间处理,最后以“NullPointerException” 的克星Optional类的讲解来收尾。 背景 作为开发人员每天与NullPointerExceptio...

程序新视界
今天
5
0
OSChina 周四乱弹 —— 福布斯终身秃头奖

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享如是我闻的单曲《地藏经上卷》: 如是我闻#今日歌曲推荐# 《地藏经上卷》- 如是我闻 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
957
15
Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部