Android10 insmod源码分析
本文代码来源于rk3399-android10。
insmod函数
此处的insmod函数是驱动加载wifi_load_driver之后会被调用的函数:关于wifi_load_driver的源码分析可见之前的博客:android移植wifi驱动流程porting
文件位置:rk3399-android-10/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
static int insmod(const char *filename, const char *args) {
int ret;
int fd;
fd = TEMP_FAILURE_RETRY(open(filename, O_RDONLY | O_CLOEXEC | O_NOFOLLOW));
printf("insmod filename = %s\n",filename);
if (fd < 0) {
PLOG(ERROR) << "Failed to open " << filename;
return -1;
}
ret = syscall(__NR_finit_module, fd, args, 0);
close(fd);
if (ret < 0) {
PLOG(ERROR) << "finit_module return: " << ret;
}
return ret;
}
其中,他调用到的函数有:
关于syscall:rk3399-android-10/kernel/arch/arm/kernel/entry-common.S
.macro syscall, nr, func
.ifgt __sys_nr - \nr
.error "Duplicated/unorded system call entry"
.endif
.rept \nr - __sys_nr
.long sys_ni_syscall
.endr
.long \func
.equ __sys_nr, \nr + 1
这部分看了很久也查了很多资料,但是依然无法理解macro宏定义和被调用函数之间的具体联系。希望有清楚的能指导下。。。
关于__NR_finit_module:rk3399-android-10/kernel/include/uapi/asm-generic/unistd.h
#define __NR_finit_module 273//系统调用号
__SYSCALL(__NR_finit_module, sys_finit_module)
目前只知道,insmod能通过上述的定义,通过这句代码syscall(__NR_finit_module, fd, args, 0);,利用系统调用号(中断号)来调用sys_finit_module,finit_module的系统调用号是__NR_finit_module。
sys_finit_module的定义:rk3399-android-10/kernel/include/linux/syscalls.h
asmlinkage long sys_finit_module(int fd, const char __user *uargs, int flags);
注:asmlinkage表示函数读取的参数来于栈,而非寄存器。
sys_finit_module
在rk3399-android-10/kernel/kernel/module.c中,有以下定义:
SYSCALL_DEFINE3(finit_module, int, fd, const

本文深入解析了Android 10中insmod函数的实现,从frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp出发,详细阐述了insmod如何通过系统调用号__NR_finit_module调用sys_finit_module。同时,对比了init_module系统调用,指出finit_module通过文件描述符读取模块,而init_module使用copy_from_user。最后讨论了modprobe和insmod的区别,modprobe能够处理模块依赖关系。
最低0.47元/天 解锁文章
1342

被折叠的 条评论
为什么被折叠?



