Linux内核中打开文件时kmalloc分配struct file的位置查询
解答Linux内核中struct file结构体的分配位置问题
嘿,我来帮你理清这个困惑~你找不到直接的kmalloc调用是正常的,因为struct file的分配并没有直接用kmalloc,而是通过SLUB分配器的专属slab缓存来完成的,具体流程是这样的:
- 内核为struct file专门创建了一个slab缓存,定义在
fs/file_table.c中的file_cachep变量,通过kmem_cache_create完成初始化 - 实际分配struct file的核心函数是
get_empty_filp(部分内核版本可能会封装到alloc_file函数里),在这个函数里会调用kmem_cache_alloc(file_cachep, GFP_KERNEL),从专属缓存中分配结构体实例 - 回到open系统调用的流程:
sys_open/sys_openat最终会调用do_filp_open,而do_filp_open内部会调用get_empty_filp来获取空的struct file结构体,这才是分配发生的地方
验证小技巧
- 直接在内核源码中搜索
get_empty_filp,就能看到它调用slab缓存分配的代码 - 如果想动态跟踪,可以用
ftrace跟踪kmem_cache_alloc事件,并过滤file_cachep相关的调用,就能关联到open系统调用触发的分配操作
内容的提问来源于stack exchange,提问作者Xudong Shao
相关产品推荐
相关产品推荐

