内核模块加载流程图

简介: 内核模块加载流程图

流程图

模块数据的拷贝过程

首先从磁盘上打开,然后将文件fd传给内核,内核会将模块文件的内容拷贝到一个通过vmalloc分配的临时虚拟内存中,执行完一些检查后,再将模块内容拷贝到最终的虚拟内存中,然后进行重定位。最后的这块虚拟内存可以通过module_alloc也可以通过vzalloc分配,一般会调用module_alloc来分配。module_alloc又调用了__vmalloc_node_range__vmalloc_node_range可以设置分配的虚拟地址区域的范围,下面是x86上的实现:

这里对虚拟地址的范围做了限制:MODULES_VADDR + get_module_load_offset() ~ MODULES_END,如果不考虑地址随机化(CONFIG_RANDOMIZE_BASE),get_module_load_offset的返回值就是0,所以范围是MODULES_VADDR ~ MODULES_END。其中涉及到的宏的定义如下:

#define __START_KERNEL_map  _AC(0xffffffff80000000, UL)
#define KERNEL_IMAGE_SIZE (512 * 1024 * 1024)
#define MODULES_VADDR   (__START_KERNEL_map + KERNEL_IMAGE_SIZE)
#define MODULES_END   _AC(0xfffffffffe000000, UL)

所以最终模块所在的虚拟地址范围是0xffffffff80000000 ~ 0xfffffffffe000000,长度为512MB,具体可以参考x86_64虚拟地址空间布局

相关文章
|
7月前
|
存储 缓存 物联网
uboot 启动流程详细分析参考
uboot 启动流程详细分析参考
538 1
|
7月前
|
存储 安全 Linux
Linux 内核启动流程与入口函数分析
Linux 内核启动流程与入口函数分析
244 0
|
算法 Linux C语言
一文搞懂内核模块依赖
一文搞懂内核模块依赖
将模块编译入内核
将模块编译入内核
113 0
|
Linux 索引
模块的加载过程三
模块的加载过程三
95 0
|
Linux
模块的加载过程四
模块的加载过程四
146 0
|
编译器
模块的加载过程三(下)
模块的加载过程三(下)
177 0
|
Linux
模块的加载过程二(上)
模块的加载过程二
104 0
|
程序员 Linux
模块的加载过程二(下)
模块的加载过程二(下)
152 0
|
存储 Linux C语言
模块的加载过程一
模块的加载过程一
164 0