您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页【Linux系统】理解 Linux 下一切皆文件

【Linux系统】理解 Linux 下一切皆文件

来源:华拓科技网






在 Linux 中,管理的核心是先描述再组织,对于进程管理,会将进程描述成进程PCB;对于文件管理,会将文件描述成文件结构体 struct file

对于外部设备的管理也同理,每个外部设备都会被描述成一个设备结构体 struct device






1、设备的读写功能函数


每个设备都会对应一些功能函数,这里讲解两个常见函数:读写函数:int write_device()int read_device() 用于读写该设备。


设备不同函数不同:因为不同设备的底层驱动程序与工作方式不一样,不同的外设对应自己读写函数一般是不相同的,例如你显示器的写函数和磁盘的写函数是不同的实现(一个是写入显示器,一个写入磁盘,当然不同)。

同时,也不是每个设备都一定会具有读或写功能,例如显示器没有读功能,键盘没有写功能

是否具有读写功能的意思:例如对于键盘来说,没有像向键盘写入数据的功能,只能通过读函数 read_keyboard(char* out) 读取键盘输入的值,而不能像键盘写入数据

如果某些设备没有自己的读或写功能,则可以该函数的函数指针为空,而并非将该函数指针删除







2、设备的 struct file

系统启动时会创建一个 struct file ,这个结构体中有两个函数指针成员(即读写函数:int write()int read() ),用于指向可调用函数。(因为C语言结构体中是不能包含成员函数方法的,但是可以包含函数指针,用于指向可调用函数,模拟成员函数的功能)

系统会为每一种连接到计算机主板上的设备都创建一个 struct file ,这些不同设备的 struct file 之间会链接成链表(这是系统管理的手段),而 struct file 里面的函数指针 int (*read)(...)int (*write)(...) 会各自指向自己对应设备的底层功能函数,如图所示:





简单来说:每个设备都对于一个设备结构体 struct device ,而每个设备结构体 struct device 都对应一个 文件结构体 struct file ,文件结构体中的函数指针 int (*read)(...)int (*write)(...) 会各自指向自己对应设备结构体 struct device 中的读写函数。


每个设备的struct file 的都有一套相同的字段,当我们想要访问任何一种硬件,只需通过 struct file ,调用对应的读写方法,就能完成读写操作,而因为 struct file 中读写方法的函数指针属性一样,都叫做读写方法,只是每个设备struct file 的读写指针指向不同的底层读写函数。


只管上层的读 read 和写 write ,不管底层实现的封装思想:我们上层使用所有设备的读写功能时,只需调用struct file 中的读写方法,这个读写方法统一命名成读 read 和写 write ,而我们无需关系这个设备对应的struct file 的读写指针指向何种底层读写函数。

这种通过一层统一相同命名的调用功能封装起来起来,用户无需关心底层调用何种读写函数的方法,即类似于面向对象特性中的多态。

C语言通过使用一层结构体,将底层实现隐藏起来,对外暴露统一的调用接口,实现了多态功能。

我们将这套封装机制,称为 VFS :虚拟文件系统。



3、重新理解一下 Linux 下一切皆文件

在 Linux 操作系统中,“一切皆文件”的理念确实体现在很多方面,尤其是设备文件的处理上。通过将设备抽象为文件,将设备的操作抽象为文件操作,使得设备驱动程序的编写和使用更加一致和方便。用户空间进程可以通过标准的文件操作接口来访问各种设备,而不需要关心具体的设备类型和实现细节。这就是“一切皆文件”理念的核心所在。



4、文件操作方法集合 struct file_operations

struct file中 含有一个结构体指针,指向结构体 struct file_operationsstruct file_operations 是一个包含各种文件操作方法的结构体,其中就包括了 readwrite 函数指针。




设备文件和 struct file_operations 对于设备文件,struct file_operations 中的 readwrite 函数指针会被设置为指向具体的设备驱动程序提供的读写函数。例如,对于键盘设备,read 函数指针会指向 read_keyboard 函数。

注册设备 在设备驱动程序初始化时,会注册设备并将其 struct file_operations 关联到设备文件。这样,当用户空间进程打开设备文件时,系统会使用这些操作方法来处理读写请求。


5、验证设备文件的存在:向不同终端发送信息


(1)如何发送消息

一个Linux命令行窗口就是一个终端

通过 命令 ls /dev/pts 可以查看当前系统中终端数量及其序号


使用重定向符可以向指定终端设备发送信息

如:echo "hello world" >> /dev/pts/2



(2)为什么可以发送消息

本质上终端也是一个设备,也是一个设备文件,通过该文件结构体中的终端写入函数,向该终端写入!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务