load_module函数中完成模块的部分创建工作后,把状态置为MODULE_STATE_COMING,sys_init_module函数中完成模块的全部初始化工作后(包括把模块加入全局的模块列表,调用模块本身的初始化函数),把模块状态置为MODULE_STATE_LIVE,最后,使用rmmod工具卸载模块时,会调用系统调用delete_module,会把模块的状态置为MODULE_STATE_GOIN...
load_module函数中完成模块的部分创建工作后,把状态置为MODULE_STATE_COMING,sys_init_module函数中完成模块的全部初始化工作后(包括把模块加入全局的模块列表,调用模块本身的初始化函数),把模块状态置为MODULE_STATE_LIVE,最后,使用rmmod工具卸载模块时,会调用系统调用delete_module,会把模块的状态置为MODULE_STATE_GOIN...
insmod命令执行后,会调用kernel/module.c里的一个系统调用init_module,它会调用load_module函数,将用户空间传入的整个内核模块文件创建成一个内核模块,并返回一个struct module结构体,从此,内核中便以这个结构体代表这个内核模块。 再看看THIS_MODULE宏是什么意思,它在include/linux/module.h里的定义是 85 #define TH...
在module.h 中 THIS_MODULE的定义如下: externstructmodule __this_module;#defineTHIS_MODULE (&__this_module) 即是保存了__this_module这个对象的地址,那这个__this_module在哪里定义呢?这就要从module的编译说起啦,如果编译过模块就会发现,会生成*.mod.c这样的一个文件,打开这个文件,就会发现,类似下面的定...
Unique handle for this module 该模块的唯一句柄 name指定了模块的名称,该名称必须是唯一的,内核中会使用该名称来引用模块 */ char name[MODULE_NAME_LEN]; /* Sysfs stuff. */ struct module_kobject mkobj; struct module_attribute *modinfo_attrs; ...
forced){/* This module can't be removed */ret=-EBUSY;gotoout;}}/* Stop the machine so refcounts can't move and disable module. */ret=try_stop_module(mod,flags,&forced);if(ret!=0)gotoout;mutex_unlock(&module_mutex);/* Final destruction now no one is using it. *//*执行退出...
staticstructfile_operationsfops= {.owner = THIS_MODULE,.read = my_read,}; staticint__initmy_driver_init(void){if((alloc_chrdev_region(&dev,0,1,"my_dev")) <0)return-1; cdev_init(&my_cdev, &fops);my_cdev.owner = THIS_MODULE;my_cdev.ops = &fops; ...
cls = class_create(THIS_MODULE, "hellocls"); if (IS_ERR(cls)) { printk(KERN_ERR "class_create() failed for cls\n"); result = PTR_ERR(cls); goto out_err_1; } devno = MKDEV(major, minor); class_dev = device_create(cls, NULL, devno, NULL, "hellodev"); ...
THIS_MODULE;.read=light_read;.write=light_write;.open=light_open;.release=light_release;.ioctl=light_ioctl;}//设置字符设备cdev结构体staticvoidlight_setup_cdev(struct light_dev*dev,int index){}//模块加载函数intlight_init(void)//模块卸载函数intlight_cleanup(void)module_init(light_init)module_...
__module_get(THIS_MODULE); // mtd_table[]是个全局数组,每个元素都是一个逻辑分区,记录着分区的起始位置和大小,我们将每个逻辑分区创建为一个单独的mtd子设备文件 for (i=0; i< MAX_MTD_DEVICES; i++) if (mtd_table) new->add(mtd_table); ...