SyliOS I/O 系统
目录
I/O系统又称作输入输出系统,SylixOS 兼容POSIX标准输入输出系统,SylixOS 的IO概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。
文件类型
SylixOS 系统最常见的是普通文件和目录文件,但也有另外一些特殊文件类型,这些文件类型包括以下几种:
- 普通文件,这是最常见的文件类型,这种文件包含了某种形式的数据。这种数据无论是普通文本还是二进制,对于 SylixOS 来说没什么区别。需要注意的是,一个二进制可执行文件,内核必须理解其格式。SylixOS 二进制可执行文件都遵循一种标准化的格式,这种格式使得 SylixOS 能够确定程序代码和数据加载的位置(详细介绍见第 19 章动态装载);
- 目录文件,这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针;
- 块设备文件,这种文件提供的 I/O 接口标准符合 SylixOS 对块设备的定义;
- 字符设备文件,这是一种标准的不带缓冲的设备文件,在系统中最为常见的设备文件就是字符设备文件;
- FIFO 文件,这种类型的文件用于进程间通信,有时也称为命名管道;
- 套接字(socket)文件,这种文件可以用于进程间的网络通信(详细介绍见第 15章网络 I/O);
- 符号链接,这种类型的文件指向另一个文件。
文件类型的信息包含在 stat 结构体的 st_mode 成员中。可通过下表所示的宏来判断,这些宏的参数都是成员 st_mode 的类型值。
文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用。
文件描述符是一个非负整数。 当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,使用 open 函数或者 creat 函数返回的文件描述符标识该文件,可将此文件描述符作为参数传递给 read 函数或 write 函数。
SylixOS 的文件描述符与 POSIX 定义兼容,它是从 0 开始一直到一个最大值的整型数字(_POSIX_OPEN_MAX),每一个打开的文件都有一个或者多个(dup)文件描述符与之对应。SylixOS 和绝大多数操作系统相同,打开文件时总是使用一个最小的且未使用的文件描述符作为新分配的文件描述符。
根据习惯,0 号文件描述符代表标准输入,1 号文件描述符为标准输出,2 号文件描述符为标准错误。这里需要说明的是,SylixOS 每个进程拥有自己的文件描述符表,各个进程间互不冲突。如果子进程存在父进程,则继承父进程所有文件描述符;如果子进程是孤儿进程,将只继承系统的 3 个标准文件描述符。一个进程内的所有线程共享进程文件描述符。内核中存在一个全局的文件描述符表,这个文件描述符表不包含 0,1,2 号标准文件,这三个文件描述符在内核中为重映射标志,即 SylixOS 允许内核中每个内核任务拥有自己的标准文件。
在符合 POSIX.1 的应用程序中,0、1、2 虽然已被标准化,但应当把它们替换成符号常量 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 以提高可读性,在 SylixOS 中可通过包含<unistd.h>头文件来使用这些常量。
I/O 系统结构
SylixOS 的 I/O 系统结构,由于历史原因分为 ORIG 型驱动结构和 NEW_1 型驱动结构。NEW_1 型驱动结构在 ORIG 型驱动结构的基础上增加了文件访问权限、文件记录锁等功能。
如下图所示是 SylixOS ORIG 驱动结构图:
SylixOS 中每一个文件描述符对应一个文件结构,不同的文件描述符可以对应同一个文件结构,当对应同一个文件结构的所有文件描述符被关闭时,操作系统会释放对应的文件结构,同时调用相应的驱动程序。不同的文件结构可以指向同一个逻辑设备,例如一个 FAT文件系统设备就可以被打开很多个文件结构。不同的逻辑设备也可以对应同一个驱动程序,例如物理结构相同的串口 0、串口 1 可以对应一组为其服务的驱动程序,每一组驱动程序具体服务的硬件设备则由底层 BSP 决定。
如下图所示是 SylixOS NEW_1 驱动结构图:
NEW_1 型驱动结构在 ORIG 的基础上增加了文件节点,从而引入了文件访问权限、文件用户信息、文件记录锁等内容。
下图显示了一个进程对应的三种数据结构之间的关系。该进程打开两个不同的文件, 一个从文件描述符 3 打开,另一个从文件描述符 4 打开。
SylixOS 支持在不同进程间共享打开文件。从图1 NEW_1 型内核数据结构可以看出 SylixOS 内核使用三种数据结构(文件描述符项、文件结构、文件节点)来表示打开文件,它们的关系决定了在文件共享方面,一个进程对另一个进程可能产生的影响。
每个进程都维护着自己的一个文件描述符表,每个文件描述符占其中一项,与每个文件描述符相关联的是:
- 指向文件结构的指针;
- 文件引用计数;
- 文件描述符标志(FD_CLOEXEC)。
内核为所有打开的文件维护一个文件结构表,每一个文件结构表项包括(部分):
- 设备头指针(这个指针指向了设备节点);
- 文件名;
- 文件节点指针;
- 文件属性标志(读、写等,更多信息见表 5.2);
- 文件当前指针(指示文件偏移)。
每个打开的文件都有一个文件节点,文件节点包括(部分):
- 设备描述符;
- inode(同一个文件只有一个 inode);
- 文件权限信息(可读、可写、可执行);
- 文件用户信息;
- 当前文件大小;
- 文件记录锁指针。