Magic Linux开发入门指南(五)

2.6 虚拟文件系统

前面几节所介绍的目录和文件,都是真真正正、实实在在的存储在具体的外部
存储设备上的,它们可能是在本机的硬盘、闪存、光盘中,可能保存在不只一个磁
盘分区中,也可能保存在网络中其它主机的存储设备中的。本节所介绍的几个文件
系统,虽然它们出现在根文件系统中,但它里面的内容却无法在任何外部存储设备
中找到,因为它们都在内存中。

 

2.6.1 proc文件系统

proc是一个重要虚拟文件系统,通过它里面的一些文件,可以获取系统状态信
息并修改某些系统的配置信息。
proc文件系统本身不占用磁盘空间,它仅存在于内
存之中,为操作系统本身和应用程序之间的通信提供了一个安全的接口。当我们在
内核中添加了新功能或设备驱动时,经常需要得到一些系统状态的信息,一般这样
的功能可能需要经过一些象
ioctl()这样的系统调用来完成。系统调用接口对于一些功
能性的信息可能是适合的,因为应用程序必须将这些信息读出后再做一定的处理。
但对于一些实时性的系统信息,例如内存的使用状况,或者是驱动设备的统计资料
等,我们更需要一个比较简单易用的接口来取得它们。
proc文件系统就是这样的一
个接口,我们可以简单的用
catstrings程序来查看这些信息。例如,执行下面的命
令:

 

#cat /proc/meminfo

 

你可能会得到如下结果:

 

MemTotal:                 254272 kB

MemFree:                  104416 kB

Buffers:                        23940 kB

Cached:                     103972 kB

SwapCached:                      0 kB

Active:                         64660 kB

Inactive:                       69276 kB

HighTotal:                            0 kB

HighFree:                            0 kB

LowTotal:                 254272 kB

LowFree:                  104416 kB

SwapTotal:               522072 kB

SwapFree:                522072 kB

Dirty:                                48 kB

Writeback:                         0 kB

Mapped:                    11708 kB

Slab:                          11364 kB

CommitLimit:           649208 kB

Committed_AS:        16064 kB

PageTables:                  320 kB

VmallocTotal:         770040 kB

VmallocUsed:             7916 kB

VmallocChunk:       760564 kB

HugePages_Total:             0

HugePages_Free:              0

Hugepagesize:            4096 kB

 

同样的,freedftopps等程序的功能实现,强烈依赖于proc文件系统,为了使用
那些程序,一定要使内核支持
proc文件系统,并将其挂接到根文件系统的/proc目录
下。

下表所列的文件或符号连接会出现在/proc目录下,但并不详尽,具体都包含那
些,取决于你的内核配置和具体的硬件设备。

 

名称

功能

apm

高级电源管理信息。

buddyinfo

Buddy算法内存分配信息。

cmdline

内核的命令行参数。

config.gz

当前内核的.config文件。

cpuinfo

cpu信息

devices

可以用到的设备(块设备/字符设备)

diskstats

磁盘I/O统计信息。

dma

使用的DMA通道

execdomains

执行区域列表。

fb

Frame buffer信息

filesystems

支持的文件系统

interrupts

中断的使用情况,记录中断产生次数。

iomem

I/O内存映射信息

ioports

I/O端口分配情况

kcore

内核核心映像,GDB可以利用它查看当前内核的所有数据结构状态。

key-users

密钥保留服务文件

kmsg

内核消息

ksyms

内核符号表

loadavg

负载均衡信息

locks

内核锁

mdstat

磁盘阵列状态

meminfo

内存信息

misc

杂项信息

modules

系统已经加载的模块文本列表

mounts

已挂接的文件系统列表

partitions

磁盘分区信息

pci

内核识别的PCI设备列表

self

访问proc文件系统的进程信息

slabinfo

内核缓存信息

splash

splash信息

stat

全面统计状态表

swaps

交换空间使用情况

uptime

系统正常运行时间

version

内核版本

vmstat

虚拟内存统计表

zoneinfo

内存管理区信息

                        表2-6-1

 

下表所列的目录会出现在/proc目录下,但并不详尽,具体包含那些,取决于你
的内核配置和具体的硬件设备。

 

名称

功能

[number]

进程信息

acpi

高级配置与电源接口

asound

ALSA声卡驱动接口

bus

系统中已安装的总线信息

dirver

空目录

fs

空目录

ide

IDE设备信息

irq

中断请求设置接口

net

网络各种状态信息

scsi

SCSI设备信息

sys

内核配置接口

sysvipc

中断的使用情况,记录中断产生次数。

tty

tty驱动信息

                         表2-6-2

 

proc文件系统的详细内容可以通过执行 man proc命令获得,这里就不再进行更为详
细的介绍了。

 

2.6.2 sysfs文件系统

proc文件系统类似,sysfs文件系统也是一个不占有任何磁盘空间的虚拟文件系
统。它通常被挂接在
/sys目录下。sysfs文件系统是Linux2.6内核引入的,它把连接在系
统上的设备和总线组织成为一个分级的文件,使得它们可以在用户空间存取。其实

sysfs
是从procdevfs中划分出来的。

/sys目录下会包含下表所列的目录,但并不详尽,不过具体内容还取决于内的配
置和具体的硬件设备。

 

名称

功能

block

块设备

bus

系统总线

class

设备组

devices

系统设备

firmware

固件

kernel

内核

module

内核模块

power

供电系统

                            表2-6-3

 

讲述sysfs文件系统各目录的详细内容已经超出本文的范围,感兴趣的读者可以查看
有关
Linux驱动程序开发的书籍。

 

2.6.3 devfs文件系统

devfs,也叫设备文件系统(Device Filesystem),设计它的唯一目的就是提供一
个新的(更理性的)方式管理通常位于
/dev的所有块设备和字符设备。典型的 /dev
树包含数百个块特殊文件和字符特殊文件,它们全都在根文件系统上。每个特殊文
件都可以让用户空间进程轻松地与内核设备实现交互。举例来说,通过对这些特殊
文件执行操作,你的
X服务器就能够访问视频硬件,fsck可以执行文件系统检验,lpd
可以通过并行端口向打印机发送数据。

实际上,通常LinuxUnix更“酷”的方面是,设备不是简单地隐藏在晦涩的
API
之后,而是真正地与普通文件、目录和符号链接一样存在于文件系统上。因为
字符和块设备是映射到普通文件系统名称空间的,我们通常可以用有意义的方式来
与硬件交互,可以仅使用标准
Unix 命令,如 cat dd。除了有趣之外,这还使我
们有更强的能力,并提高生产力。

下表所列的文件或符号连接可能会出现在/dev目录下,但并不详尽,具体内容取
决于你的具体硬件设备。

 

名称

功能

audio

音品设备

cdrom[0-9]

cdrom设备,这往往是一个符号连接

console

系统控制台

core

内核镜像,为/proc/kcore的符号连接

dmmidi

固件

dsp

内核

dvd

dvd设备,这往往是一个符号连接

fb

Frame buffer,一般为/dev/fb0的符号连接

fb0

Frame buffer设备

fd

文件描述符,/proc/self/fd的符号连接

fd[0-9]+

软盘设备

floppy

软盘设备,一般为fd[0-9]的符号连接

full

满设备,任何写入操作都会失败,并把errno设为ENOSPC,以表示没有剩余空间。

fuse

用户空间的虚拟文件系统

hd[a-z][1-9]+

IDE硬盘

sd[a-z][1-9]+

SCSISATA硬盘

hpet

HPET设备

initctl

用户与init进程交互的通道。

kmem

存取经过内核虚拟之后的内存

kmsg

任何对该文件的写入都将作为printk的输出

log

syslog的本地套接字

loop[0-9]

回环设备,一个磁盘文件模拟一个块设备。

lp[0-9]

打印机

md[0-9]

RAID设备

mem

直接存取物理内存

midi

MIDI设备

mixer

混音器

null

控设备。任何写入都将直接被丢弃,任何读取都将得到EOF

parport[0-9]

并口

port

存取I/O端口

ppp

ppp拨号设备

psaux

PS/2鼠标

ptmx

所有PTY master的复用器

pty[a-z]+[1-9]+

伪终端,用于创建ssh等登陆会话

ram[0-9]+

RAM diskinitrd只能使用ram0

ramdisk

ram0的符号连接

random

随机数发生器。完全有用户的输入来产生随机数。如果用户停止所有动作,则停止产生随机数。

root

根分区,这是一个到根分区设备的符号连接。

rtc

实时时钟

stderr

标准错误输出,/proc/self/fd/2的符号连接

stdin

标准输入,/proc/self/fd/0的符号连接

stdout

标准输出,/proc/self/fd/1的符号连接

tty[1-9,a-z]+

tty虚拟控制台,tty为当前控制台

ttyS[0-9]

串口

urandom

更快,但是不够安全的随机数发生器。

vcs[1-9,a-z]+

虚拟控制台的文本内容,一一对应。

X0R

/dev/null的符号连接

XOR

/dev/null的符号连接

zero

0字节源,可以读取到无限多的0字节。

                          表2-6-4

 

下表所列的目录可能会出现在/dev目录下,但不是全部,具体情况与你的内核配
置和硬件设备有关。

 

名称

功能

cpu

cpu信息

disk

磁盘/光盘信息,里面的内容为具体设备的符号连接

input

设备组

mapper

RAIDLVM控制接口

net

VMwareQemu等使用的虚拟网卡

pts

devpts文件系统挂载点,用于实现伪终端

raw

裸设备操作

shm

Linux独有的tmpfs文件系统挂接点。

snd

声卡控制接口

                          表2-6-5

 

devfs文件文件系统是内核自动挂接的,当挂接好devfs文件系统后,才能正确执
init程序。Linuxdevfs文件系统与后面讲述的tmpfs文件系统使用相同结构。

 

2.6.4 tmpfs文件系统

tmpfs文件系统是Linux特有的文件系统,唯一的标准挂接点是/dev/shm。当然,用
户可以将其挂接在其他地方。

tmpfs有些像虚拟磁盘(ramdisk),但不是一回事。说其像虚拟磁盘,是因为它
可以使用你的
RAM,但它也可以使用你的交换分区。传统的虚拟磁盘是一个块设
备,而且需要一个
mkfs之类的命令格式化它才能使用。tmpfs是一个独立的文件系
统,不是块设备,只要挂接,立即就可以使用。

tmpfs的大下是不确定的,它最初只有很小的空间,但随着文件的复制和创建,
它的大小就会不断变化,换句话说,它会根据你的实际需要而改变大小;
tmpfs的速
度非常惊人,毕竟它是驻留在
RAM中的,即使用了交换分区,性能仍然非常卓越;
由于
tmpfs是驻留在RAM的,因此它的内容是不持久的,断电后,tmpfs的内容就消失
了,这也是被称作
tmpfs的根本原因。

有效的使用tmpfs可以极大的提高应用程序或整个系统的性能。有关tmpfs的详细
内容,还请读者参阅其他相关著作,毕竟本文讲述的是一个
Linux发行版的开发。

 

2.6.5 usbdevfs文件系统

顾名思义,usbdevfs就是USB设备文件系统,它是一个动态生成的文件系统,有
些类似于
proc文件系统。它的标准挂接点是/proc/bus/usb,当然,也可以挂接到其他
地方。它主要用于:用户级驱动、即插即用、提供
USB设备信息、应用程序轮询
USB
设备的变化等。

 

2.6.6 devpts文件系统

devpts文件系统为伪终端提供了一个标准接口,它的标准挂接点是/dev/pts。只要
pty
的主复合设备/dev/ptmx被打开,就会在/dev/pts下动态的创建一个新的pty设备文
件。挂接时,
UIDGID及其工作模式会指定给devpts文件系统的所有pty文件。这可
以保证伪终端的安全性。

讨论devpts文件系统的详细内容,已经超过本文范围,还请读者参考其他专
著。
 

2.7 结束语

贯穿Linux的整个文件组织结构,无不洋溢着那继承自Unix的深厚的文化底蕴,
美不胜收。使我不得不感叹,
Linux是多么伟大的一个操作系统。正是由于这些,
Linux
才长久不衰,越发显得青春洋溢,让我们这些热爱Linux的人为其流连忘返。

到了这里,对于Linux的文件组织结构,我相信各位读者应该有了感官上的认识
了,我也再次感谢你,为了
Magic Linux,能够坚持将这些丑陋的文字读到这里。在
下一章里,我将讲述如何利用本章与上一章的知识,来构建一个能够工作的基本系
统。

(未完...待续...) 

linux内核编程 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 什么是操作系统 11 1.2.3 内核数据结构 13 第2章 内存管理 15 2.1 虚拟内存抽象模型 15 2.1.1 请求调页 17 2.1.2 交换 17 2.1.3 共享虚拟内存 18 2.1.4 物理寻址模式和虚拟寻址模式 18 2.1.5 访问控制 18 2.2 高速缓存 19 2.3 Linux页表 20 2.4 页分配和回收 21 2.4.1 页分配 22 2.4.2 页回收 22 2.5 内存映射 22 2.6 请求调页 23 2.7 Linux页缓存 24 2.8 页换出和淘汰 25 2.8.1 减少缓冲区和页缓存大小 25 2.8.2 换出System V共享内存页 26 2.8.3 换出和淘汰页 27 2.9 交换缓存 27 2.10 页换入 28 第3章 进程 29 3.1 Linux进程 29 3.2 标识符 31 3.3 调度 32 3.4 文件 34 3.5 虚拟内存 35 3.6 创建进程 36 3.7 时间和定时器 37 3.8 执行程序 38 3.8.1 ELF 39 3.8.2 脚本文件 40 第4章 进程间通信机制 41 4.1 信号机制 41 4.2 管道 42 4.3 套接字 44 4.3.1 System V的进程间通信机制 44 4.3.2 消息队列 44 4.3.3 信号量 45 4.3.4 共享存储区 47 第5章 PCI 49 5.1 PCI的地址空间 49 5.2 PCI配置头 50 5.3 PCI的I/O和存储地址空间 51 5.4 PCI-ISA桥 51 5.5 PCI-PCI 桥 51 5.5.1 PCI-PCI桥:PCI I/O和存储地址 空间的窗口 51 5.5.2 PCI-PCI桥:PCI配置周期和PCI 总线编号 52 5.6 Linux PCI初始化 53 5.6.1 Linux内核PCI数据结构 53 5.6.2 PCI设备驱动程序 53 5.6.3 PCI的BIOS函数 56 5.6.4 PCI修正过程 57 第6章 中断处理与设备驱动程序 60 6.1 中断与中断处理 60 6.1.1 可编程中断控制器 61 6.1.2 初始化中断处理数据结构 61 6.1.3 中断处理 62 6.2 设备驱动程序 63 6.2.1 测试与中断 64 6.2.2 直接存储器访问(DMA) 65 6.2.3 存储器 66 6.2.4 设备驱动程序与内核的接口 66 6.2.5 硬盘 69 6.2.6 网络设备 74 第7章 文件系统 77 7.1 第二个扩展文件系统EXT2 78 7.1.1 EXT2系统的inode节点 79 7.1.2 EXT2系统的超级块 80 7.1.3 EXT2系统的组描述符 80 7.1.4 EXT2系统的目录 81 7.1.5 在EXT2文件系统中查找文件 81 7.1.6 在EXT2文件系统中改变文件 的大小 82 7.2 虚拟文件系统 83 7.2.1 VFS文件系统的超级块 84 7.2.2 VFS文件系统的inode节点 84 7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 7.3.2 update进程 90 7.4 /proc文件系统 91 7.5 特殊设备文件 91 第8章 网络 92 8.1 TCP/IP网络概述 92 8.2 Linux中的TCP/IP网络层次结构 95 8.3 BSD套接字接口 96 8.4 INET的套接字层 97 8.4.1 创建BSD套接字 98 8.4.2 为INET BSD Socket绑定地址 99 8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 8.4.5 接受连接请求 100 8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 103 8.7 IP路由 104 第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107 9.1.2 任务队列 108 9.1.3 定时器 109 9.1.4 等待队列 110 9.1.5 自旋锁 110 9.1.6 信号量 110 9.2 模块 111 9.2.1 模块载入 112 9.2.2 模块卸载 113 第10章 处理器 115 10.1 X86 115 10.2 ARM 115 10.3 Alpha AXP处理器 115 第11章 Linux内核源代码 117 11.1 怎样得到Linux内核源码 117 11.2 内核源码的编排 117 11.3 从何处看起 118 第12章 Linux数据结构 120 附录A 有用的Web和FTP站点 138 附录B 词汇表 139 第二部分 Linux内核模块编程指南 致谢 前言 第1章 Hello, World 145 1.1 内核模块的Makefiles文件 146 1.2 多重文件内核模块 147 第2章 字符设备文件 149 第3章 /proc文件系统 158 第4章 把/proc用于输入 162 第5章 把设备文件用于输入 170 第6章 启动参数 182 第7章 系统调用 185 第8章 阻塞处理 190 第9章 替换printk 199 第10章 任务调度 202 第11章 中断处理程序 207 第12章 对称多处理 211 第13章 常见错误 212 附录A 2.0和2.2之间的差异 213 附录B 其他资源 214 附录C 给出你的评价 215 第三部分 Linux程序员指南 第1章 Linux操作系统 219 第2章 Linux内核 220 第3章 Linux libc包 221 第4章 系统调用 222 第5章 “瑞士军刀”:ioctl 223 第6章 Linux进程间通信 224 6.1 介绍 224 6.2 半双工Unix管道 224 6.2.1 基本概念 224 6.2.2 用C语言创建管道 225 6.2.3 简便方法 229 6.2.4 管道的原子操作 233 6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念 237 6.4.2 消息队列 239 6.4.3 信号量 251 6.4.4 semtool:交互式信号量操作 程序 260 6.4.5 共享内存 267 第7章 声音编程 274 7.1 内部扬声器编程 274 7.2 声卡编程 274 第8章 字符单元图形 276 8.1 libc中的I/O函数 277 8.1.1 格式化输出 277 8.1.2 格式化输入 278 8.2 termcap库 278 8.2.1 前言 278 8.2.2 获得终端描述 279 8.2.3 查看终端描述 279 8.2.4 termcap权能 280 8.3 Ncurses简介 280 8.4 初始化 282 8.5 窗口 283 8.6 输出 284 8.6.1 格式化输出 285 8.6.2 插入字符/行 286 8.6.3 删除字符/行 286 8.6.4 方框和直线 287 8.6.5 背景字符 287 8.7 输入 288 8.8 选项 289 8.8.1 输出选项 289 8.8.2 输入选项 290 8.8.3 终端属性 291 8.8.4 使用选项 291 8.9 更新终端 292 8.10 视频属性与颜色 293 8.11 光标和屏幕坐标 294 8.12 滚动 294 8.13 小键盘 295 8.14 软标签 295 8.15 杂项 295 8.16 低级访问 296 8.17 屏幕转储 296 8.18 Termcap模拟 296 8.19 Terminfo函数 296 8.20 调试函数 297 8.21 Terminfo权能 297 8.21.1 布尔型权能 297 8.21.2 数值型权能 298 8.21.3 字符串型权能 299 8.22 [N]Curses函数概述 306 第9章 I/O端口编程 307 9.1 鼠标编程 307 9.2 调制解调器编程 308 9.3 打印机编程 308 9.4 游戏杆编程 308 第10章 把应用程序移植到Linux上 309 10.1 介绍 309 10.2 信号处理 309 10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc文件系统 312 10.4.3 Linux下的进程控制 312 10.5 可移植条件编译 313 10.6 补充说明 314 附录 以字母顺序排列的系统调用 315 第四部分 Linux内核概念系统结构 摘要 323 前言 324 第1章 系统结构 325 1.1 系统概述 325 1.2 内核的目标 325 1.3 内核结构的概述 325 1.4 支持多个开发人员 327 1.5 系统数据结构 328 1.5.1 任务列表 328 1.5.2 内存映射 328 1.5.3 索引节点 328 1.5.4 数据连接 329 第2章 子系统的系统结构 330 2.1 进程调度程序系统结构 330 2.1.1 目标 330 2.1.2 模块 330 2.1.3 数据表达 331 2.1.4 依赖性、数据流和控制流 331 2.2 内存管理程序系统结构 331 2.2.1 目标 331 2.2.2 模块 331 2.2.3 数据表示 331 2.2.4 数据流、控制流和依赖性 332 2.3 虚拟文件系统系统结构 333 2.3.1 目标 333 2.3.2 模块 333 2.3.3 数据表示 333 2.3.4 数据流、控制流和依赖性 334 2.4 网络接口系统结构 334 2.4.1 目标 334 2.4.2 模块 334 2.4.3 数据表示 335 2.4.4 数据流、控制流和依赖性 335 2.5 进程间通信系统结构 335 第3章 结论 336 附录A 术语定义 337 附录B 参考文献 338 第部分 Linux内核具体系统结构 摘要 341 第1章 前言 342 1.1 目标 342 1.2 Linux介绍 342 1.3 软件系统结构的背景知识 342 1.4 方法与途径 343 1.5 适用本书的读者 344 1.6 本部分的章节安排 344 第2章 系统结构 345 第3章 子系统结构 346 3.1 进程调度程序 346 3.1.1 目标 346 3.1.2 外部接口 346 3.1.3 子系统描述 346 3.1.4 数据结构 347 3.1.5 子系统结构 348 3.1.6 子系统依赖性 348 3.2 内存管理程序 348 3.2.1 目标 348 3.2.2 外部接口 349 3.2.3 子系统描述 349 3.2.4 数据结构 350 3.2.5 子系统结构 350 3.2.6 子系统依赖性 351 3.3 虚拟文件系统 352 3.3.1 目标 352 3.3.2 外部接口 352 3.3.3 子系统描述 353 3.3.4 设备驱动程序 353 3.3.5 逻辑文件系统 354 3.3.6 模块 354 3.3.7 数据结构 355 3.3.8 子系统结构 355 3.3.9 子系统依赖性 355 3.4 进程间通信 355 3.4.1 目标 355 3.4.2 外部接口 357 3.4.3 子系统描述 357 3.4.4 数据结构 358 3.4.5 子系统结构 359 3.4.6 子系统依赖性 359 3.5 网络接口 360 3.5.1 目标 360 3.5.2 外部接口 361 3.5.3 子系统描述 361 3.5.4 数据结构 362 3.5.5 子系统结构 363 3.5.6 子系统依赖性 363 第4章 结论 365 附录A 术语定义 366 附录B 参考文献 368 第六部分 附 录 附录A Linux文档工程拷贝许可证 372 附录B GNU通用公共许可证 374
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值