内核一些概念
内核结构、子系统
- GNU/Linux 操作系统的基本体系结构(为了保护我们的操作系统,避免用户程序将内核搞崩,所以进行了内核空间和用户空间的划分):
- 用户空间:
- 用户应用程序执行的地方
- GNU C Library (glibc)提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间
- 内核空间:
- 系统调用接口,它实现了一些基本的功能,例如 read 和 write
- 内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的
- 依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码
- linux内核子系统:
- SCI:System Call Interface,系统调用接口层,提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务
- PM:Process Management,进程管理、进程调度。进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O(1) 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。 O(1) 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。
- MM:Memory Manager,内存管理。负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
- VFS:Virtual File System,虚拟文件系统。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现(其实Linux做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要一切皆是文件,还得看贝尔实验室正在开发的"Plan 9”的)。
- Network Stack,网络堆栈。负责管理系统的网络设备,并实现多种多样的网络标准。
- DD:Device Drivers,Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。
- Arch:所谓的体系结构,具体指系统架构或CPU架构相关代码,为的是提高至移植性
内核文件目录结构
- https://www.kernel.org/(linux内核官网)
- 内核顶层目录结构
[root@vmhost ~]
[root@vmhost ~]
[root@vmhost ~]
total 792
drwxrwxr-x 27 root root 4096 Mar 18 14:19 arch |体系结构相关的代码,例如arm, x86等等
drwxrwxr-x 3 root root 4096 Mar 18 14:19 block |提供块设备的相关代码
drwxrwxr-x 2 root root 200 Mar 18 14:19 certs |证书
drwxrwxr-x 4 root root 4096 Mar 18 14:19 crypto |加密、解密相关的库函数
drwxrwxr-x 82 root root 4096 Mar 18 14:19 Documentation |帮助文档
drwxrwxr-x 138 root root 4096 Mar 18 14:19 drivers |设备驱动
drwxrwxr-x 76 root root 4096 Mar 18 14:19 fs |VFS子系统
drwxrwxr-x 28 root root 4096 Mar 18 14:19 include |内核头文件,需要提供给外部模块(例如用户空间代码)使用
drwxrwxr-x 2 root root 254 Mar 18 14:19 init |Linux系统启动初始化相关的代码
drwxrwxr-x 2 root root 213 Mar 18 14:19 ipc |IPC(进程间通信)子系统
drwxrwxr-x 18 root root 4096 Mar 18 14:19 kernel |Linux内核的核心代码,包含了进程调度子系统,以及和进程调度相关的模块。
drwxrwxr-x 19 root root 8192 Mar 18 14:19 lib |实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等
drwxrwxr-x 6 root root 71 Mar 18 14:19 LICENSES |认证文件
drwxrwxr-x 3 root root 4096 Mar 18 14:19 mm |内存管理子系统
drwxrwxr-x 70 root root 4096 Mar 18 14:19 net |不包括网络设备驱动的网络子系统
drwxrwxr-x 30 root root 4096 Mar 18 14:19 samples |一些样例
drwxrwxr-x 15 root root 4096 Mar 18 14:19 scripts |脚本
drwxrwxr-x 12 root root 321 Mar 18 14:19 security |提供安全特性(SELinux)
drwxrwxr-x 26 root root 4096 Mar 18 14:19 sound |音频相关的驱动及子系统
drwxrwxr-x 35 root root 4096 Mar 18 14:19 tools |一些常用工具,如性能剖析、自测试等
drwxrwxr-x 3 root root 146 Mar 18 14:19 usr |用于生成initramfs的代码
drwxrwxr-x 4 root root 44 Mar 18 14:19 virt |提供虚拟机技术(KVM等)的支持
-rw-rw-r-- 1 root root 423 Mar 18 14:19 COPYING |版权声明
-rw-rw-r-- 1 root root 99600 Mar 18 14:19 CREDITS |Linux主要的贡献者名单
-rw-rw-r-- 1 root root 539427 Mar 18 14:19 MAINTAINERS |维护者名单
-rw-rw-r-- 1 root root 727 Mar 18 14:19 README |说明文档
-rw-rw-r-- 1 root root 60858 Mar 18 14:19 Makefile |内核编译
-rw-rw-r-- 1 root root 1321 Mar 18 14:19 Kbuild |内核编译主配置文件
-rw-rw-r-- 1 root root 595 Mar 18 14:19 Kconfig |内核编译配置文件
文件系统补充
文件系统类型
- 磁盘类型文件系统:Ext4、XFS、FAT32和Btrfs等文件系统
- 网络文件系统:NFS
- 内存文件系统:ramdisk、ramfs、tmpfs
- 分布式文件系统:MFS(moosefs)、HDFS(Hadoop分布式文件系统)、NFS、VFS
- 虚拟文件系统:VFS
- 用户空间文件系统:FUSE
内存文件系统:
- 可以格式化,固定大小,内核2.0/2.2以上支持:
- RamDisk,在Linux中可以将一部分内存当作分区来使用,其不足之处是大小固定。对于一些经常被访问的文件,而它们又不会被更改,可以将它们通过RamDisk放在内存中,即可明显地提高系统的性能。
- 不可以格式化,不固定大小:内核2.4以上支持:
- Ramfs:内存文件系统,它工作于虚拟文件系统(VFS)层。不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。如果你的Linux已经将Ramfs编译进内核,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可,Ramfs被限制最多可使用内存大小的一半。
- Tmpfs是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的ramdisk,也不同于针对物理内存的Ramfs。Tmpfs可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。Tmpfs就是和虚拟内存子系统来”打交道”的,它向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。Tmpfs同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。使用tmpfs,首先你编译内核时得选择”虚拟内存文件系统支持(Virtual memory filesystem support)” ,然后就可以加载tmpfs文件系统了。
- 使用区别:ramfs只会在物理内存中被创建,而tmpfs可能在物理内存中创建,也可能在交换分区中被创建。对于想利用内存的高速IO来提高效能的应用,最好是使用ramfs。对于只是想存放临时缓存的应用,最好是用tmpfs,以提前内存的利用率。
虚拟文件系统
VFS相关概念
- 虚拟文件系统(VFS)是由Sun microsystems公司在定义网络文件系统(NFS)时创造的。
- 一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口。
- 虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心以及系统中运行的其他进程看来,都是相同的。
- VFS并不是一种实际的文件系统,它只存在于内存中,不存在于任何外存空间。
- VFS在系统启动时建立,在系统关闭时消亡。
VFS结构
- VFS使用了与EXT2文件系统类似的方式:超级块,索引节点inode,数据块如果将虚拟文件系统必做一本书,超级块就相当于封面,从封面可以得知这本书的基本信息; inode 块相当于目录,从目录可以得知各章节内容的位置;而数据块则相当于书的正文,记录着具体内容
- 超级块(Superblock): 这是整个文件系统的第一块空间。包括整个文件系统的基本信息,如块大小,inode/block的总量、使用量、剩余量,指向空间 inode 和数据块的指针等相关信息。VFS超级块是各种逻辑文件系统在安装时建立的,并在这些文件系统卸载时自动删除,它只存在于内存中。VFS中保存了系统中挂接的文件系统的链表以及这些文件系统对应的VFS超级块。系统启动后所有被初始化的文件系统都要向VFS登记。每个已安装的文件系统由一个VFS 超块表示,它包含如下信息:
- Device:表示文件系统所在块设备的设备标志符。例如系统中第一个IDE 硬盘的设备标志符为0x301。
- Inode pointers:这个mounted inode指针指向文件系统中第一个inode。而covered inode指针指向此文件系统安装目录的inode。根文件系统的VFS超块不包含covered指针。
- Blocksize:以字节记数的文件系统块大小,如1024 字节。
- Superblock operations:指向此文件系统一组超块操纵例程的指针。这些例程被VFS 用来读写inode和超块。
- File System type:这是一个指向已安装文件系统的file_system_type结构的指针。
- File System specific:指向文件系统所需信息的指针。
- inode块(文件索引节点) : 文件系统索引,记录文件的属性。它是文件系统的最基本单元,是文件系统连接任何子目录、任何文件的桥梁。每个子目录和文件只有唯一的一个 inode 块。
- inode包含文件的元信息,具体来说有以下内容:
- 文件的size、文件属主的User ID、Group ID
- 文件的读、写、执行权限
- 文件的时间戳,:ctime(inode上一次变动的时间)、mtime(文件内容上一次变动的时间)、atime(文件上一次打开的时间)。
- 链接数,即有多少文件名指向这个inode。
- 文件数据分布在哪些磁盘Block。
- 每个inode处于三种状态中的一个:
- inode位于内存中,未关联到文件;(inode_unused)
- inode位于内存中,由一个或多个进程使用,已与磁盘同步;(inode_in_used)
- inode处于活动使用状态,与磁盘上内容未同步,脏inode;
- 内核使用两种方式组织inode。
- 链表:每个inode都有一个i_list成员,可将inode存储在链表中。(inode出现在特定于超级块的链表中i_sb_list,同时出现在特定于状态的链表中,例如inode_in_used)
- 散列:每个inode同时出现在一个散列表中(根据inode号快速访问inode)。
- inode与链接问题
- 软链接:文件使用自己的inode,该inode的数据部分包含了一个字符串,给出了链接目标的路径
- 硬连接:使用了已有的inode编号。硬链接建立以后,无法区分原来的文件和新建的硬链接文件。这种情况下,inode使用计数器来确保文件删除操作中,当没有其他文件使用该inode时,才能真正删除该inode。
- 数据块(Block) :实际记录文件的内容,若文件太大时,会占用多个 block。为了提高目录访问效率,Linux 还提供了表达路径与 inode 对应关系的 dentry 结构。它描述了路径信息并连接到节点 inode,它包括各种目录信息,还指向了 inode 和超级块。
用户空间文件系统
- 用户空间文件系统:(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如ZFS,glusterfs和luster使用FUSE实现。
- Linux用于支持用户空间文件系统的内核模块名叫FUSE,FUSE一词有时特指Linux下的用户空间文件系统。
- 文件系统是一个通用操作系统重要的组成部分。传统上操作系统在内核层面上对文件系统提供支持。而通常内核态的代码难以调试,生产率较低。Linux从2.6.14版本开始通过FUSE模块支持在用户空间实现文件系统。在用户空间实现文件系统能够大幅提高生产率,简化了为操作系统提供新的文件系统的工作量,特别适用于各种虚拟文件系统和网络文件系统。
分布式文件系统
- 分布式式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连。分布式文件系统的设计基于客户机/服务器模式。在数据量越来越多的情况下,一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。容错。即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。
- 因此大多会选择分布式存储来解决一下问题:
- 海量数据存储问题
- 数据高可用问题(冗余备份)问题
- 较高的读写性能和负载均衡问题
- 支持多平台多语言问题
- 高并发问题