`
cloudtech
  • 浏览: 4817325 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

设备文件节点的生成

 
阅读更多

设备文件节点的生成

在Linux系统下,设备文件是种特殊的文件类型,其存在的主要意义是沟通用户空间程序和内核空间驱动程序。换句话说,用户空间的应用程序要想使用驱动程序提供的服务,需要经过设备文件来达成。当然,如果你的驱动程序只是为内核中的其他模块提供服务,则没有必要生成对应的设备文件。

按照通用的规则,Linux系统所有的设备文件都位于/dev目录下。/dev目录在Linux系统中算是一个比较特殊的目录,在Linux系统早期还不支持动态生成设备节点时,/dev目录就是挂载的根文件系统下的/dev,对这个目录下所有文件的操作使用的是根文件系统提供的接口。比如,如果Linux系统挂载的根文件系统是ext3,那么对/dev目录下所有目录/文件的操作都将使用ext3文件系统的接口。随着后来Linux内核的演进,开始支持动态设备节点的生成[1],使得系统在启动过程中会自动生成各个设备节点,这就使得/dev目录不必要作为一个非易失的文件系统的形式存在。因此,当前的Linux内核在挂载完根文件系统之后,会在这个根文件系统的/dev目录上重新挂载一个新的文件系统devtmpfs,后者是个基于系统RAM的文件系统实现。当然,对动态设备节点生成的支持并不意味着一定要将根文件系统中的/dev目录重新挂载到一个新的文件系统上,事实上动态生成设备节点技术的重点并不在文件系统上面。

动态设备节点的特性需要其他相关技术的支持,在后续的章节中会详细描述这些特性。目前先假定设备节点是通过Linux系统下的mknod命令静态创建。为方便叙述,下面用一个具体的例子来描述设备文件产生过程中的一些关键要素,这个例子的任务很简单:在一个ext3类型的根文件系统中的/dev目录下用mknod命令来创建一个新的设备文件节点demodev,对应的驱动程序使用的设备主设备号为2,次设备号是0,命令形式为:

root@LinuxDev:/home/dennis#mknod /dev/demodev c 2 0

上述命令成功执行后,将会在/dev目录下生成一个名为demodev的字符设备节点。如果用strace工具来跟踪一下上面的命令,会发现如下输出(删去了若干不相关部分):

root@LinuxDev:/home/dennis#strace mknod /dev/demodev c 2 0

execve("/bin/mknod",["mknod", "/dev/demodev", "c","30","0"], [/* 36 vars */]) = 0

mknod("/dev/demodev",S_IFCHR|0666, makedev(30,0)) = 0

可见Linux下的mknod命令最终是通过调用mknod函数来实现的,调用时的重要参数有两个,一是设备文件名("/dev/demodev"),二是设备号(makedev(30,0))。设备文件名主要在用户空间使用(比如用户空间程序调用open函数时),而内核空间则使用inode来表示相应的文件。本书只关注内核空间的操作,对于前面的mknod命令,它将通过系统调用sys_mknod进入内核空间,这个系统调用的原型是:

<include/linux/syscalls.h>

long sys_mknod(const char __user *filename, int mode, unsigned dev);

注意sys_mknod的最后一个参数dev,它是由用户空间的mknod命令构造出的设备号。sys_mknod系统调用将通过/dev目录上挂载的文件系统接口来为/dev/demodev生成一个新的inode[2],设备号将被记录到这个新的inode对象上。

图2-7展示了通过ext3文件系统在/dev目录下生成一个新的设备节点/dev/demodev的主要流程。

图2-7ext3文件系统mknod的主要流程

完整了解设备节点产生的整个过程需要知晓VFS和特定文件系统的技术细节。然而从驱动程序员的角度来说,没有必要知道文件系统相关的所有细节,只需关注文件系统和驱动程序间是如何建立上关联的就足够了。

sys_mknod首先在根文件系统ext3的根目录“/”下寻找dev目录所对应的inode,图中对应的inode编号为168,ext3文件系统的实现会通过某种映射机制,通过inode编号最终得到该inode在内存中的实际地址(图中由标号1的线段表示)。接下来会通过dev的inode结构中的i_op成员指针所指向的ext3_dir_inode_operations(这是个struct inode_operations类型的指针),来调用该对象中的mknod方法,这将导致ext3_mknod函数被调用。

ext3_mknod函数的主要作用是生成一个新的inode(用来在内核空间表示demodev设备文件节点,demodev设备节点文件与新生成的inode之间的关联在图2-7中由标号5的线段表示)。在ext3_mknod中会调用一个和设备驱动程序关系密切的init_special_inode函数,其定义如下:

<fs/inode.c>

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)

{

inode->i_mode = mode;

if (S_ISCHR(mode)) {

inode->i_fop =&def_chr_fops;

inode->i_rdev = rdev;

} else if (S_ISBLK(mode)) {

inode->i_fop =&def_blk_fops;

inode->i_rdev = rdev;

} else if (S_ISFIFO(mode))

inode->i_fop =&def_fifo_fops;

else if (S_ISSOCK(mode))

inode->i_fop =&bad_sock_fops;

else

printk(KERN_DEBUG"init_special_inode: bogus i_mode (%o) for"

" inode %s:%lu\n", mode,inode->i_sb->s_id,

inode->i_ino);

}

这个函数最主要的功能便是为新生成的inode初始化其中的i_fop和i_rdev成员。设备文件节点inode中的i_rdev成员用来表示该inode所对应设备的设备号,通过参数rdev为其赋值。设备号在由sys_mknod发起的整个内核调用链中进行传递,最早来自于用户空间的mknod命令行参数。

i_fop成员的初始化根据是字符设备还是块设备而有不同的赋值。对于字符设备,fop指向def_chr_fops,后者主要定义了一个open操作:

<fs/char_dev.c>

const struct file_operations def_chr_fops = {

.open = chrdev_open,

};

相对于字符设备,块设备的def_blk_fops的定义则要有点复杂:

<fs/block_dev.c>

const struct file_operations def_blk_fops = {

.open = blkdev_open,

.release = blkdev_close,

.llseek = block_llseek,

.read = do_sync_read,

.write = do_sync_write,

.aio_read = generic_file_aio_read,

.aio_write = blkdev_aio_write,

.mmap = generic_file_mmap,

.fsync = blkdev_fsync,

.unlocked_ioctl = block_ioctl,

#ifdef CONFIG_COMPAT

.compat_ioctl = compat_blkdev_ioctl,

#endif

.splice_read = generic_file_splice_read,

.splice_write = generic_file_splice_write,

};

关于块设备,将在本书第11章“块设备驱动程序”中详细讨论,这里依然把考察的重点放在字符设备上。字符设备inode中的i_fop指向def_chr_fops。至此,设备节点的所有相关铺垫工作都已经结束,接下来可以看看打开一个设备文件到底意味着什么。

——本段文字节选自《深入Linux设备驱动程序内核机制》

图书详细信息:



http://blog.csdn.net/broadview2006/article/details/7281061

[1] 这里动态生成设备节点的说法是相对于使用mknod命令生成设备节点而言的,前者直接通过文件系统接口来生成对应的设备节点。

[2] 对于实际的文件系统,比如ext3文件系统,产生一个node的过程因为同时要涉及底层存储设备的操作,因而会变得很复杂。

分享到:
评论

相关推荐

    Linux创建字符设备自动生成设备节点[文].pdf

    驱动程序可以在加载模块时使用 class_create 和 device_create 函数来创建设备节点,而系统服务如 udev 则可以在设备接入时动态创建设备文件节点。 在 Linux 系统中,udev 是一个设备管理器,它可以自动创建设备...

    JNI so文件生成,和jni打开设备节点

    本篇文章将深入探讨如何生成JNI的so库文件,并通过Java在Android应用中调用这些接口来操作设备驱动,特别是在与`/dev/`目录下的设备节点进行交互时。 首先,我们需要创建一个C/C++项目,用于编写JNI接口。在Android...

    Linux创建字符设备自动生成设备节点.rar

    本资料"Linux创建字符设备自动生成设备节点.rar"主要探讨的是如何在Linux环境下创建并管理字符设备节点,以便应用程序能够正确地与底层硬件通信。 首先,理解设备节点的概念至关重要。在Linux中,设备被抽象为文件...

    domtoimage使用HTML5canvas从DOM节点生成图像

    "domtoimage使用HTML5canvas从DOM节点生成图像" 这个标题提到了一个名为 "domtoimage" 的工具,它利用HTML5的Canvas API将DOM(文档对象模型)中的节点转换为图像。这个过程通常用于网页截图或者在网页中保存和分享...

    z_node_生成节点阻抗矩阵的程序_节点阻抗矩阵_

    通常,这种图会包含各个节点、线路、变压器以及其他电气设备的连接情况,是理解节点阻抗矩阵生成基础的重要参考。分析接线图有助于理解各节点间的电气关系,为使用“z_node”程序提供必要输入。 在实际操作中,使用...

    cocos2d-x .fnt 文件生成工具

    6. **在Cocos2d-x中使用**:在你的Cocos2d-x项目中,你可以通过`Label`类加载`.fnt`文件来创建文本节点。通过提供`.fnt`文件的路径,Cocos2d-x能够正确渲染文本。 7. **优化和性能**:位图字体相比系统字体在渲染...

    Python自动生成DBC文件程序

    它定义了节点间通信的帧结构、信号和属性,使得不同设备能正确理解和解析CAN消息。 本项目"Python自动生成DBC文件程序"旨在通过Python脚本来简化DBC文件的创建过程。传统的DBC创建可能需要手动编辑文本文件或使用...

    bpa格式的IEEE39节点dat、swi数据

    1. **dat文件**:`.dat`文件是文本格式的数据文件,用于存储电力系统的基本参数,如节点信息(节点编号、电压基准、节点类型)、发电机数据(额定功率、励磁电流、调压方式)、线路和变压器参数(阻抗、导纳、长度、...

    IEEE39节点系统

    常见的电力系统分析软件,如MATLAB/Simulink的Power System Blockset、PSAT(Power System Analysis Toolbox)等,都支持导入和分析这样的数据文件,使得研究者能够模拟和分析39节点系统的各种场景。 总结来说,...

    Linux设备驱动程序学习(6)-高级字符驱动程序操作[(3)设备文件的访问控制] - Linux设备驱动程序

    `udev`动态设备管理系统负责设备节点的创建和管理,根据设备的物理特性生成相应的设备文件。 9. **ioctl(I/O控制)命令**: ioctl是设备驱动提供的一种特殊调用,允许用户空间应用程序对设备进行特定的控制操作,...

    case30_30节点电力系统、潮流计算_30节点电力_

    在电力系统中,节点通常代表发电机、变压器或负荷等电气设备的连接点。一个30节点的系统意味着有30个这样的电气实体相互连接,形成一个复杂但可分析的网络。这些节点间的连接通过线路(输电线)进行,它们之间的关系...

    生成pci设备树的简单实现

    使用`sysfs`接口(例如`pread64`函数)读取对应设备的属性文件,获取供应商ID、设备ID等信息,并创建对应的设备节点。 3. **处理子总线**: 检查设备是否有子总线(即子桥设备),通过`/sys/bus/pci/devices/...

    linux驱动自动生成设备文件名

    总之,自动生成设备文件名是Linux驱动开发中的重要环节,它涉及到内核接口的使用、设备号的管理以及设备文件的创建。理解这一过程对于编写高效且可靠的驱动程序至关重要。通过`create_chrdev`这样的工具,我们可以...

    康芯MIF文件生成器2010

    6. **版本信息**:“2010”可能表示该工具的发布年份,这可能意味着它适用于较早的 FPGA 技术节点,但可能不支持最新的设备和设计流程。对于新的 FPGA 设计,用户可能需要寻找更新的工具或软件版本。 7. **学习资源...

    marsboard_csi11_only_ov7670_720p 从C语言程序到生成设备节点的控制GPIO的过程.rar )

    在生成设备节点的过程中,我们需要使用`mknod`系统调用来创建一个字符设备文件,该文件代表了GPIO设备。例如,设备节点通常位于`/dev`目录下,格式为`mknod /dev/gpioX c 216 Y`,其中`X`是GPIO编号,`Y`是设备号,`...

    电信设备-管理信息库文件生成方法及装置、数据处理系统.zip

    本文件"电信设备-管理信息库文件生成方法及装置、数据处理系统.zip"着重讨论了如何生成MIB文件以及相关数据处理系统的实现。 首先,MIB文件的生成涉及到几个关键步骤: 1. **定义对象结构**:这是创建MIB文件的第...

    PSASP IEEE39节点,模型,亲测可用

    在这个压缩包中,"10机39节点系统数据"文件包含了这个模型的具体参数和配置信息。用户需要根据自己的PSASP软件版本和需求,对这些数据进行适当的更新和调整,以确保模型与实际软件环境的兼容性。导入数据的过程通常...

    solvey_导纳_case14导纳矩阵_matlab_matpower_节点导纳矩阵_源码

    在提供的源码文件“solyv.m”中,开发者可能实现了一个函数,用于根据MatPower的数据结构和算法,生成并输出Case14案例的导纳矩阵。具体实现可能包括以下步骤: 1. 导入MatPower案例数据:MatPower案例数据通常存储...

    自动绘制生成网络拓扑图软件

    网络拓扑图是一种图形表示方式,它展示了网络中的设备、服务器、线路和其他基础设施之间的连接...而“自动绘制生成网络拓扑图软件.exe”可能是这样一款工具的执行文件,用于在本地计算机上运行并自动化创建网络拓扑图。

    行业分类-设备装置-基于并行处理的信息文件生成系统及方法.zip

    标题“行业分类-设备装置-基于并行处理的信息文件生成系统及方法”以及描述暗示了这一主题主要关注如何通过并行处理技术优化信息文件的生成过程,可能涉及硬件设备、软件算法以及系统架构等多个方面。 并行处理是指...

Global site tag (gtag.js) - Google Analytics