Linux 内核函数集

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

  1. 计算预留内存,调整可用页数

  2. 通过 函数,创建全局变量names_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

  3. 通过 dcache_init 函数,创建全局变量dentry_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

  4. 通过 inode_init 函数,创建全局变量inode_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

  5. 通过 files_init 函数,创建全局变量filp_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象),计算并设置系统最大打开文件数

  6. 搭建了整个挂载子系统的基础设施,使得后续的 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 文件系统) 的 根节点(即初始化 struct kernfs_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

  1. 创建kmem_cache结构体并初始化、初始化 页、设置 per-CPU 数组等

  2. 通过list_add()函数,将新创建并初始化的kmem_cache结构体插入到全局链表slab_caches的尾部

  3. 返回新创建并初始化的kmem_cache


2.2 dcache_init

  1. 通过 函数,创建全局变量dentry_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

2.3 inode_init

  1. 通过 函数,创建全局变量inode_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

2.4 files_init

  1. 通过 函数,创建全局变量filp_cachep的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)
  2. 计算并设备系统最大打开文件数

2.5 mnt_init

  1. 通过 函数,创建全局变量mnt_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

  2. 通过alloc_large_system_hash()函数,根据系统内存大小和参数,自动计算合适的哈希桶数量,并以最可靠的方式分配一块连续的物理或虚拟内存给全局变量mount_hashtable(挂载实例)

  3. 通过alloc_large_system_hash()函数,根据系统内存大小和参数,自动计算合适的哈希桶数量,并以最可靠的方式分配一块连续的物理或虚拟内存给全局变量mountpoint_hashtable(挂载点)

  4. 通过 kernfs_init 函数,创建全局变量kernfs_node_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

  5. 通过 sysfs_init 函数 完成下列任务:

    5.1. 通过 函数,初始化全局变量sysfs_root(struct kernfs_root)

    5.2 初始化全局变量sysfs_root_kn(节点,struct kernfs_node) = sysfs_root->kn

    5.3 通过 函数,将新的文件系统(如 sysfs)插入到全局链表file_systems

  6. 通过 函数 完成下列任务:

    6.1 通过 函数,创建并初始化一个kobject对象

    6.2 通过 函数,继续初始化新创建的kobject对象,并将已初始化的kobject添加到 sysfs 结构


2.5.1 kernfs_init

  1. 通过 函数,创建全局变量kernfs_node_cache的 缓存(可供 kmem_cache_alloc / kmem_cache_free 使用的缓存对象)

2.5.2 sysfs_init

  1. 通过 函数,初始化全局变量sysfs_root(struct kernfs_root)

  2. 初始化全局变量sysfs_root_kn(节点,struct kernfs_node) = sysfs_root->kn

  3. 通过 函数,将新的文件系统(如 sysfs)插入到全局链表file_systems


2.5.2.1
  1. 创建并初始化kernfs_root结构体

  2. 返回新创建并初始化的kernfs_root结构体


2.5.2.2
  1. 在全局变量file_systems链表中查找将要注册的文件系统是否已注册
  2. 未注册,则将新的文件系统(如 sysfs_fs_type)注册到全局链表file_systems

2.5.3

  1. 通过 函数,创建并初始化一个kobject对象
  2. 通过 函数,继续初始化新创建的kobject对象,并将已初始化的kobject添加到 sysfs 结构
  3. 返回新创建并初始化的kobject对象(如 fs_kobj

2.5.3.1
  1. 创建并初始化一个kobject对象

2.3.3.2
  1. 继续初始化通过 函数 新创建的kobject对象

  2. 将已初始化的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 优化,显著提升了内核中最频繁内存操作的性能和内存利用率

相关推荐
GeW1 小时前
从挂科到高分通过:RHCE快速拿证的10个提分技巧
linux
鸠摩智首席音效师2 小时前
Linux /etc/nsswitch.conf 文件有什么作用 ?
linux
东城居士2 小时前
理解pinctrl和gpio子系统驱动
linux·嵌入式系统
H_oRIZoN_2 小时前
Linux入门DAY43 ARM 架构基础、寄存器、大小端、异常向量、交叉编译
linux·arm·linux应用编程
ι:3 小时前
NUC12 Pro 安装 Ubuntu 24.04 LTS 详细教程
linux·windows·ubuntu·nuc
代码村新手4 小时前
Linux-进程概念
linux
ShineWinsu4 小时前
对于Git:基础操作的超详细保姆级解析
linux·c++·git·面试·备份·管理·版本控制器
菜鸟学编程o4 小时前
Linux常见指令
linux·运维·服务器
linan1015 小时前
android调用C++通用方式
linux·架构·智能硬件