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命令加载驱动详解的主要内容,如果未能解决你的问题,请参考以下文章

rmmod命令卸载驱动过程详解

如何在suse linux 中设置开机自动insmod加载

内核加载驱动机制详解(module_init & module_exit)

Linux-insmod/rmmod/lsmod驱动模块相关命令(10)

001_linux驱动之_驱动的加载和卸载

驱动模块的加载(linux4.1.15)!