insmod命令加载驱动详解
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了insmod命令加载驱动详解相关的知识,希望对你有一定的参考价值。
1、insmod命令介绍
(1)insmod命令是busybox中支持的命令之一,insmod命令的源码也是在busybox中;
(2)insmod命令是常用的加载驱动的命令,用法:insmod xxx.ko [xxx];xxx.ko是表示要加载的驱动文件名字,[xxx]是代表给驱动的传参;
2、busybox中insmod命令源码分析
2.1、insmod命令函数调用关系
//insmod_main()函数在modutils/insmod.c
insmod_main()
parse_cmdline_module_options() //解析insmod命令加载驱动时给驱动的传参
bb_init_module()
try_to_mmap_module() //将驱动文件映射到内存中
init_module() //真正的开始加载驱动文件
2.2、bb_init_module函数源码
//filename:ko文件的路径; options:解析出来的加载驱动的传参
int FAST_FUNC bb_init_module(const char *filename, const char *options)
size_t image_size;
char *image;
int rc;
bool mmaped;
if (!options)
options = "";
image_size = INT_MAX - 4095; //文件的最大长度
mmaped = 0;
image = try_to_mmap_module(filename, &image_size); //将驱动文件映射到内存中
if (image)
mmaped = 1;
else
errno = ENOMEM; /* may be changed by e.g. open errors below */
image = xmalloc_open_zipped_read_close(filename, &image_size);
if (!image)
return -errno;
errno = 0;
init_module(image, image_size, options); //调用系统函数sys_init_module()加载驱动
rc = errno;
if (mmaped)
munmap(image, image_size);
else
free(image);
return rc;
(1)try_to_mmap_module:将驱动文件映射到内存中;
(2)调用系统函数sys_init_module()加载驱动;
3、init_module函数分析
# define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
//上面的宏逻辑上相当于
# define init_module(mod, len, opts) sys_init_module(mod, len, opts)
(1)调用init_module()函数就是调用syscall()函数,__NR_init_module是个宏定义,并且还是和sys_init_module()函数绑定的;在调用syscall()函数时第一个参数填__NR_init_module,实际就是在调用内核的sys_init_module()函数;
(2)sys_init_module()函数介绍参考博客:《内核中驱动加载函数(sys_init_module)详解》;
4、总结
insmod命令只是进行一些加载驱动的预处理(比如将ko文件映射到内存中、解析加载驱动的传参),最后还是调用的系统函数init_module()去完成具体的驱动加载工作;
以上是关于insmod命令加载驱动详解的主要内容,如果未能解决你的问题,请参考以下文章
内核加载驱动机制详解(module_init & module_exit)