14.01 系统编程概念

设备

设备分为两种:字符设备和块设备。每个设备都有主 ID 和辅 ID。主 ID 表示设备的一般等级,辅 ID 在主 ID 相同的设备中标识自己。每个设备驱动程序都是按照自己和主设备号的关联关系向内核注册的

在 Linux 的早期版本中,/dev 包含了系统中所有可能设备的条目,即使某些设备实际并未与系统连接。这意味着 /dev 会包含数以千计的未用设备项,从而导致了两个缺点:其一,对于需要扫描该目录内容的应用而言,降低了程序的执行速度;其二,根据该目录下的内容无法发现系统中实际存在哪些设备。Linux 2.6 运用 udev 程序解决了上述问题。该程序所依赖的 sysfs 文件系统,是装载于 /sys 下的伪文件系统,将设备和其他内核对象的相关信息导出至用户空间。

一些命令

创建文件系统组分的系统调用/命令基本上都是用 mk 开头。比如:

  1. mknod 可以创建 inode 结点,具体来说包括 socket、fifo、普通文件、字符设备、块设备。除了创建设备之外,一般都使用专门的系统调用不是直接用 mknod。有些 UNIX 实现用 mknod 来创建目录,但是 Linux 不这样做。
  2. mkdir 表示创建目录。
  3. mkfifo
  4. mkswap。这是用户空间命令,而不是一个系统调用。

文件系统

文件系统分配空间的基本单位是逻辑块,这个块大小可能和物理块不同。文件系统由引导块(第 1 块,不管这个磁盘是不是用来引导操作系统的)、超级块(第 2 块,包含和文件系统相关的诸多参数,比如 i 节点表的容量、文件系统逻辑块大小和文件系统大小)、i 节点表、数据块组成。

Linux 的 i 节点中记录了三种时间:上次访问时间(atime)、内容最后修改时间(mtime)、文件状态(也就是 inode)的最后改变时间(ctime),但是不包括文件的创建时间!(Windows 的 NTFS 文件系统会记录创建时间。)

如果文件有空洞(通过 lseek 改变偏移量写入得到),则在 i 节点的数据块指针中将对应的指针设置为 0 即可,不必真的分配数据块。