Linux 内核函数集
- [1. vfs_caches_init_early](#1. vfs_caches_init_early)
- [2. vfs_caches_init](#2. vfs_caches_init)
-
- [2.1 kmem_cache_create](#2.1 kmem_cache_create)
- [2.2 dcache_init](#2.2 dcache_init)
- [2.3 inode_init](#2.3 inode_init)
- [2.4 files_init](#2.4 files_init)
- [2.5 mnt_init](#2.5 mnt_init)
-
- [2.5.1 kernfs_init](#2.5.1 kernfs_init)
- [2.5.2 sysfs_init](#2.5.2 sysfs_init)
-
- [2.5.2.1 kernfs_create_root](#2.5.2.1 kernfs_create_root)
- [2.5.2.2 register_filesystem](#2.5.2.2 register_filesystem)
- [2.5.3 kobject_create_and_add](#2.5.3 kobject_create_and_add)
-
- [2.5.3.1 kobject_create](#2.5.3.1 kobject_create)
- [2.3.3.2 kobject_add](#2.3.3.2 kobject_add)
1.
为全局变量
dentry_hashtable分配一块连续物理内存并初始化这块内存中的每个桶,使其成为一个空的链表头,为后续的 dentry 插入和查找做好准备为全局变量
inode_hashtable分配一块连续物理内存并初始化这块内存中的每个桶,使其成为一个空的链表头,为后续的 inode 插入和查找做好准备
2. vfs_caches_init
计算预留内存,调整可用页数
通过 函数,创建全局变量
names_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)通过 dcache_init 函数,创建全局变量
dentry_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)通过 inode_init 函数,创建全局变量
inode_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)通过 files_init 函数,创建全局变量
filp_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象),计算并设置系统最大打开文件数搭建了整个挂载子系统的基础设施,使得后续的 mount() 系统调用能够正常工作
6.1 通过 函数,创建全局变量
mnt_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)
5.2 为全局变量
mount_hashtable分配一块连续物理内存并初始化这块内存中的每个桶,使其成为一个空的链表头,为后续的 mount(挂载实例) 插入和查找做好准备5.3 为全局变量
mountpoint_hashtable分配一块连续物理内存并初始化这块内存中的每个桶,使其成为一个空的链表头,为后续的 mountpoint(挂载点) 插入和查找做好准备5.4 创建全局变量
kernfs_node_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)5.5 通过 函数 创建全局变量
sysfs_root(kernfs 文件系统) 的 根节点(即初始化 structkernfs_root sysfs_type结构体)5.6 创建全局变量
sysfs_root_kn(即sysfs_root_kn=sysfs_root->kn)5.7 通过 函数 将一个新的文件系统类型(
sysfs_fs_type)注册到全局文件系统链表file_systems中,使后续可以通过 mount 系统调用使用该文件系统5.8 通过 ("fs", NULL) 函数 在 sysfs 文件系统中创建 /sys/fs 目录
2.1
创建
kmem_cache结构体并初始化、初始化 页、设置 per-CPU 数组等通过
list_add()函数,将新创建并初始化的kmem_cache结构体插入到全局链表slab_caches的尾部返回新创建并初始化的
kmem_cache
2.2 dcache_init
- 通过 函数,创建全局变量
dentry_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)
2.3 inode_init
- 通过 函数,创建全局变量
inode_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)
2.4 files_init
- 通过 函数,创建全局变量
filp_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)- 计算并设备系统最大打开文件数
2.5 mnt_init
通过 函数,创建全局变量
mnt_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)通过
alloc_large_system_hash()函数,根据系统内存大小和参数,自动计算合适的哈希桶数量,并以最可靠的方式分配一块连续的物理或虚拟内存给全局变量mount_hashtable(挂载实例)通过
alloc_large_system_hash()函数,根据系统内存大小和参数,自动计算合适的哈希桶数量,并以最可靠的方式分配一块连续的物理或虚拟内存给全局变量mountpoint_hashtable(挂载点)通过 kernfs_init 函数,创建全局变量
kernfs_node_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)通过 sysfs_init 函数 完成下列任务:
5.1. 通过 函数,初始化全局变量
sysfs_root(struct kernfs_root)5.2 初始化全局变量
sysfs_root_kn(节点,struct kernfs_node) =sysfs_root->kn5.3 通过 函数,将新的文件系统(如
sysfs)插入到全局链表file_systems中通过 函数 完成下列任务:
6.1 通过 函数,创建并初始化一个
kobject对象6.2 通过 函数,继续初始化新创建的
kobject对象,并将已初始化的kobject添加到 sysfs 结构
2.5.1 kernfs_init
- 通过 函数,创建全局变量
kernfs_node_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)
2.5.2 sysfs_init
通过 函数,初始化全局变量
sysfs_root(struct kernfs_root)初始化全局变量
sysfs_root_kn(节点,struct kernfs_node) =sysfs_root->kn通过 函数,将新的文件系统(如
sysfs)插入到全局链表file_systems中
2.5.2.1
创建并初始化
kernfs_root结构体返回新创建并初始化的
kernfs_root结构体
2.5.2.2
- 在全局变量
file_systems链表中查找将要注册的文件系统是否已注册- 未注册,则将新的文件系统(如
sysfs_fs_type)注册到全局链表file_systems中
2.5.3
- 通过 函数,创建并初始化一个
kobject对象- 通过 函数,继续初始化新创建的
kobject对象,并将已初始化的kobject添加到 sysfs 结构- 返回新创建并初始化的
kobject对象(如fs_kobj)
2.5.3.1
- 创建并初始化一个
kobject对象
2.3.3.2
继续初始化通过 函数 新创建的
kobject对象将已初始化的
kobject添加到 sysfs 层次结构2.1 创建 sysfs 目录:调用
sysfs_create_dir_ns在父目录下(根或父 kobject 的 sd)创建一个以kobject名称命名的目录2.2 填充默认属性文件:调用
populate_dir在新目录中创建 uevent、subsystem 等默认属性文件,使该目录具备基本的用户空间交互能力2.3 增加目录节点引用计数:调用
sysfs_get(kobj->sd)额外持有一次对底层kernfs_node的引用,防止因祖先节点被删除而导致当前目录节点被意外释放2.4 启用子对象命名空间过滤(可选):如果 kobject 提供了
kobj_child_ns_ops,则调用sysfs_enable_ns开启该目录的命名空间过滤功能,使得不同命名空间下的子对象只能被对应命名空间的进程看到
*[kobject_create]: 创建一个 kobject 对象并初始化
*[kobject_create_and_add]: 创建 kobject 对象并初始化,然后将其添加到 sysfs 层次结构中
*[vfs_caches_init_early]: 早期 VFS 缓存初始化(创建 dentry 和 inode 的 kmem_cache)
*[kmem_cache_create]: 分配并初始化一个 struct kmem_cache 对象,供后续的 kmem_cache_alloc / kmem_cache_free 等操作使用
*[kernfs_create_root]: 用于创建一个 kernfs 文件系统的根
*[register_filesystem]: 将一个新的文件系统类型注册到全局文件系统链表 file_systems 中,使后续可以通过 mount 使用该文件系统
*[kobject_add]: 用于将已初始化的 kobject 添加到 sysfs 层次结构
*[slab]: slab 缓存是一种面向固定大小内核对象的专用内存池,它通过预分配、对象复用和 per-CPU 优化,显著提升了内核中最频繁内存操作的性能和内存利用率















