1. 系统调用
由操作系统操作系统实现提供的所有系统调用所构成的集合即程序接口程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。
系统功能调用是操作系统提供给程序设计人员的一种服务。程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务。系统调用把应用程序的请求传给内核,调用相应的内核函数完成所需的处理,将处理结果返回给应用程序。
系统调用将处理器从用户态切换到内核态,以便CPU访问受到保护的内核内存;系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识;每个系统调用可辅之以一套参数,对用户空间与内核空间之间传递的信息加以规范。
系统调用过程:
以execve() 来展示一下系统调用过程:
2. 库函数
库函数也就是 C 语言库函数,C 语言库是应用层使用的一套函数库,在 Linux 下,通常以动态(.so)库文件的形式提供,存放在根文件系统/lib 目录下。许多库函数(比如,字符串操作函数)不会使用任何系统调用。另一方面,还有些库函数构建于系统调用层之上。例如,库函数 fopen()就利用系统调用 open()来执行打开文件的实际操作。往往,设计库函数是为了提供比底层系统调用更为方便的调用接口。。例如,printf()函数可提供格式化输出和数据缓存功能,而 write()系统调用只能输出字节块。同理,与底层的 brk()系统调用
相比,malloc()和 free()函数还执行了各种登记管理工作,内存的释放和分配也因此而容易许多。
GNU C 语言函数库(glibc, http://www. gnu.org/software/libc/)是 Linux 上最常用的实现。C 语言库是以动态库文件的形式提供的,通常存放在/lib 目录,它的命名方式通常是libc.so.6,不过这个是一个软链接文件,它会链接到真正的库文件。
本人linux系统下得到的c库信息如下:
book@dbe:/lib/x86_64-linux-gnu$ ./libc.so.6
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.2) stable release version 2.27.
Copyright © 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.5.0.
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
For bug reporting instructions, please see:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs.
3. 设备文件
设备专用文件与系统的某个设备相对应,内核中,每种设备类型都有与之相对应的设备驱动程序,用来处理设备的所有IO请求。某些设备是实际存在的,比如鼠标、磁盘和磁带设备。而另一些设备则是虚拟的,亦即并不存在相应硬件,但内核会(通过设备驱动程序)提供一种抽象设备,其所携带的 API 与真实设备一般无异。 可将设备划分为以下两种类型。
① 字符型设备基于每个字符来处理数据。终端和键盘都属于字符型设备。
② 块设备则每次处理一块数据。块的大小取决于设备类型,但通常为 512 字节的倍数。磁盘和磁带设备都属于块设备。
与其他类型的文件一样,设备文件总会出现在文件系统中,通常位于/dev 目录下。超级用户可使用 mknod 命令创建设备文件,特权级程序(CAP_MKNOD)执行 mknod()系统调用亦可完成相同任务。
设备ID:
每个设备文件都有主、辅ID 两个ID,主 ID 号标识一般的设备等级,内核会使用主 ID 号查找与该类设备相应的驱动程序。辅 ID 号能够在一般等级中唯一标识特定设备。设备文件的 i 节点中记录了设备文件的主、辅 ID。每个设备驱动程序都会将自己与特定主设备号的关联关系向内核注册,藉此建立设备专用文件和设备驱动程序之间的关系。内核是不会使用设备文件名来查找驱动程序的。
4. 文件系统
文件系统是对常规文件和目录的组织集合。用于创建文件系统的命令是 mkfs。Linux 的强项之一便是支持种类繁多的文件系统,如下所示。
① 传统的 ext2 文件系统。
② 各种原生(native)UNIX 文件系统,比如,Minix、System V 以及 BSD 文件系统。
③ 微软的 FAT、FAT32 以及 NTFS 文件系统。
④ ISO 9660 CD-ROM 文件系统。
⑤ Apple Macintosh 的 HFS。
⑥ 一系列网络文件系统,包括广为使用的 SUN NFS(Linux 对 NFS 的实现信息请参见http://nfs.sourceforge.net/)、IBM 和微软的 SMB、Novell NCP 以及 Carnegie Mellon 大学开发的 Coda 文件系统。
⑦ 一系列日志文件系统,包括 ext3、ext4、Reiserfs、JFS、XFS 以及 Btrfs。
从 Linux 的专有文件/proc/filesystems 中可以查看当前为内核所知的文件系统类型。
在文件系统中,用来分配空间的基本单位是逻辑块,亦即文件系统所在磁盘设备上若干连续的物理块。例如,在 ext2 文件系统上,逻辑块的大小为 1024、2048 或 4096 字节。(使用mkfs(8)命令创建文件系统时,可指定逻辑块的大小作为命令行参数。)下图所示为磁盘分区和文件系统之间的关系,以及一般文件系统的组成。
文件系统由以下几部分组成。
①引导块:总是作为文件系统的首块。引导块不为文件系统所用,只是包含用来引导操作系统的信息。操作系统虽然只需一个引导块,但所有文件系统都设有引导块(其中的绝大多数都未使用)。
② 超级块:紧随引导块之后的一个独立块,包含与文件系统有关的参数信息,其中包括:
- i 节点表容量;
- 文件系统中逻辑块的大小;
- 以逻辑块计,文件系统的大小;
驻留于同一物理设备上的不同文件系统,其类型、大小以及参数设置(比如,块大小)都可以有所不同。这也是将一块磁盘划分为多个分区的原因之一。
③ i 节点表:文件系统中的每个文件或目录在 i 节点表中都对应着唯一一条记录。这条记录登记了关乎文件的各种信息。后面会深入讨论 i 节点。有时也将 i 节点表称为 i-list。
④ 数据块:文件系统的大部分空间都用于存放数据,以构成驻留于文件系统之上的文件和目录。
4.1 i-node
针对驻留于文件系统上的每个文件,文件系统的 i 节点表会包含一个 i 节点(索引节点的简称)。对 i 节点的标识,采用的是 i 节点表中的顺序位置,以数字表示。文件的 i 节点号(或简称为 i 号)是 ls –li 命令所显示的第一列。i 节点所维护的信息如下所示。
①文件类型(比如,常规文件、目录、符号链接、以及字符设备等)。
②文件属主(亦称用户ID或UID)
③文件属组(亦称为组ID或GID)
④ 3类用户的访问权限:属主(有时也称为用户)、属组以及其他用户(属主和属组用户之外的用户)。
⑤ 3个时间戳:对文件的最后访问时间(ls –lu 所显示的时间)、对文