Android10 insmod源码分析

本文深入解析了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能够处理模块依赖关系。


本文代码来源于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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值