From 3e0edb0a7fd86fe9892121be089b24d2689172b3 Mon Sep 17 00:00:00 2001 From: gatieme Date: Fri, 5 May 2017 14:42:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=BA=E5=88=B6=E5=8D=B8=E8=BD=BD=E5=86=85?= =?UTF-8?q?=E6=A0=B8=E6=A8=A1=E5=9D=97...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/driver/{ => 00-code}/Makefile.multi | 0 study/driver/{ => 00-code}/Makefile.simple | 0 study/driver/{ => 00-code}/cma/Makefile | 0 study/driver/{ => 00-code}/cma/cma.c | 0 study/driver/{ => 00-code}/hello/Makefile | 0 study/driver/{ => 00-code}/hello/hello.c | 0 study/driver/{ => 00-code}/hello_dev/Makefile | 0 study/driver/{ => 00-code}/hello_dev/hello.c | 0 .../driver/{ => 00-code}/hello_proc/Makefile | 0 study/driver/{ => 00-code}/hello_proc/hello.c | 0 study/driver/{ => 00-code}/irq/Makefile | 0 study/driver/{ => 00-code}/irq/tiger.c | 0 study/driver/{ => 00-code}/param/Makefile | 0 study/driver/{ => 00-code}/param/README.md | 0 study/driver/{ => 00-code}/param/param.c | 0 study/driver/{ => 00-code}/patch/Makefile | 0 study/driver/{ => 00-code}/patch/patch.c | 0 .../{ => 00-code}/register/kerrw/Makefile | 0 .../{ => 00-code}/register/kerrw/README.md | 0 .../{ => 00-code}/register/kerrw/ker_rw.c | 0 .../{ => 00-code}/register/kerrw/regeditor.c | 0 study/driver/{ => 00-code}/rmmod/Makefile | 1 + study/driver/{ => 00-code}/rmmod/README.md | 0 study/driver/00-code/rmmod/force_rmmod.c | 135 ++++++++++++++++++ .../rmmod/force_rmmod2.c} | 6 +- 25 files changed, 139 insertions(+), 3 deletions(-) rename study/driver/{ => 00-code}/Makefile.multi (100%) rename study/driver/{ => 00-code}/Makefile.simple (100%) rename study/driver/{ => 00-code}/cma/Makefile (100%) rename study/driver/{ => 00-code}/cma/cma.c (100%) rename study/driver/{ => 00-code}/hello/Makefile (100%) rename study/driver/{ => 00-code}/hello/hello.c (100%) rename study/driver/{ => 00-code}/hello_dev/Makefile (100%) rename study/driver/{ => 00-code}/hello_dev/hello.c (100%) rename study/driver/{ => 00-code}/hello_proc/Makefile (100%) rename study/driver/{ => 00-code}/hello_proc/hello.c (100%) rename study/driver/{ => 00-code}/irq/Makefile (100%) rename study/driver/{ => 00-code}/irq/tiger.c (100%) rename study/driver/{ => 00-code}/param/Makefile (100%) rename study/driver/{ => 00-code}/param/README.md (100%) rename study/driver/{ => 00-code}/param/param.c (100%) rename study/driver/{ => 00-code}/patch/Makefile (100%) rename study/driver/{ => 00-code}/patch/patch.c (100%) rename study/driver/{ => 00-code}/register/kerrw/Makefile (100%) rename study/driver/{ => 00-code}/register/kerrw/README.md (100%) rename study/driver/{ => 00-code}/register/kerrw/ker_rw.c (100%) rename study/driver/{ => 00-code}/register/kerrw/regeditor.c (100%) rename study/driver/{ => 00-code}/rmmod/Makefile (93%) rename study/driver/{ => 00-code}/rmmod/README.md (100%) create mode 100644 study/driver/00-code/rmmod/force_rmmod.c rename study/driver/{rmmod/force_rmmod.c => 00-code/rmmod/force_rmmod2.c} (93%) diff --git a/study/driver/Makefile.multi b/study/driver/00-code/Makefile.multi similarity index 100% rename from study/driver/Makefile.multi rename to study/driver/00-code/Makefile.multi diff --git a/study/driver/Makefile.simple b/study/driver/00-code/Makefile.simple similarity index 100% rename from study/driver/Makefile.simple rename to study/driver/00-code/Makefile.simple diff --git a/study/driver/cma/Makefile b/study/driver/00-code/cma/Makefile similarity index 100% rename from study/driver/cma/Makefile rename to study/driver/00-code/cma/Makefile diff --git a/study/driver/cma/cma.c b/study/driver/00-code/cma/cma.c similarity index 100% rename from study/driver/cma/cma.c rename to study/driver/00-code/cma/cma.c diff --git a/study/driver/hello/Makefile b/study/driver/00-code/hello/Makefile similarity index 100% rename from study/driver/hello/Makefile rename to study/driver/00-code/hello/Makefile diff --git a/study/driver/hello/hello.c b/study/driver/00-code/hello/hello.c similarity index 100% rename from study/driver/hello/hello.c rename to study/driver/00-code/hello/hello.c diff --git a/study/driver/hello_dev/Makefile b/study/driver/00-code/hello_dev/Makefile similarity index 100% rename from study/driver/hello_dev/Makefile rename to study/driver/00-code/hello_dev/Makefile diff --git a/study/driver/hello_dev/hello.c b/study/driver/00-code/hello_dev/hello.c similarity index 100% rename from study/driver/hello_dev/hello.c rename to study/driver/00-code/hello_dev/hello.c diff --git a/study/driver/hello_proc/Makefile b/study/driver/00-code/hello_proc/Makefile similarity index 100% rename from study/driver/hello_proc/Makefile rename to study/driver/00-code/hello_proc/Makefile diff --git a/study/driver/hello_proc/hello.c b/study/driver/00-code/hello_proc/hello.c similarity index 100% rename from study/driver/hello_proc/hello.c rename to study/driver/00-code/hello_proc/hello.c diff --git a/study/driver/irq/Makefile b/study/driver/00-code/irq/Makefile similarity index 100% rename from study/driver/irq/Makefile rename to study/driver/00-code/irq/Makefile diff --git a/study/driver/irq/tiger.c b/study/driver/00-code/irq/tiger.c similarity index 100% rename from study/driver/irq/tiger.c rename to study/driver/00-code/irq/tiger.c diff --git a/study/driver/param/Makefile b/study/driver/00-code/param/Makefile similarity index 100% rename from study/driver/param/Makefile rename to study/driver/00-code/param/Makefile diff --git a/study/driver/param/README.md b/study/driver/00-code/param/README.md similarity index 100% rename from study/driver/param/README.md rename to study/driver/00-code/param/README.md diff --git a/study/driver/param/param.c b/study/driver/00-code/param/param.c similarity index 100% rename from study/driver/param/param.c rename to study/driver/00-code/param/param.c diff --git a/study/driver/patch/Makefile b/study/driver/00-code/patch/Makefile similarity index 100% rename from study/driver/patch/Makefile rename to study/driver/00-code/patch/Makefile diff --git a/study/driver/patch/patch.c b/study/driver/00-code/patch/patch.c similarity index 100% rename from study/driver/patch/patch.c rename to study/driver/00-code/patch/patch.c diff --git a/study/driver/register/kerrw/Makefile b/study/driver/00-code/register/kerrw/Makefile similarity index 100% rename from study/driver/register/kerrw/Makefile rename to study/driver/00-code/register/kerrw/Makefile diff --git a/study/driver/register/kerrw/README.md b/study/driver/00-code/register/kerrw/README.md similarity index 100% rename from study/driver/register/kerrw/README.md rename to study/driver/00-code/register/kerrw/README.md diff --git a/study/driver/register/kerrw/ker_rw.c b/study/driver/00-code/register/kerrw/ker_rw.c similarity index 100% rename from study/driver/register/kerrw/ker_rw.c rename to study/driver/00-code/register/kerrw/ker_rw.c diff --git a/study/driver/register/kerrw/regeditor.c b/study/driver/00-code/register/kerrw/regeditor.c similarity index 100% rename from study/driver/register/kerrw/regeditor.c rename to study/driver/00-code/register/kerrw/regeditor.c diff --git a/study/driver/rmmod/Makefile b/study/driver/00-code/rmmod/Makefile similarity index 93% rename from study/driver/rmmod/Makefile rename to study/driver/00-code/rmmod/Makefile index 0de899b..ca8ea41 100644 --- a/study/driver/rmmod/Makefile +++ b/study/driver/00-code/rmmod/Makefile @@ -27,6 +27,7 @@ DRIVER_LICENSE := "Dual BSD/GPL" MODULE_NAME := force_rmmod #MODCFLAGS:=-O2 -Wall -DMODULE -D__KERNEL__ -DLINUX -std=c99 #EXTRA_CFLAGS += $(MODULE_FLAGS) $(CFG_INC) $(CFG_INC) +EXTRA_CFLAGS += -g -std=gnu99 diff --git a/study/driver/rmmod/README.md b/study/driver/00-code/rmmod/README.md similarity index 100% rename from study/driver/rmmod/README.md rename to study/driver/00-code/rmmod/README.md diff --git a/study/driver/00-code/rmmod/force_rmmod.c b/study/driver/00-code/rmmod/force_rmmod.c new file mode 100644 index 0000000..b2fb26f --- /dev/null +++ b/study/driver/00-code/rmmod/force_rmmod.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * 加载模块的时候, 传递字符串到模块的一个全局字符数组里面 + * + * module_param_string(name, string, len, perm) + * + * @name 在加载模块时,参数的名字 + * @string 模块内部的字符数组的名字 + * @len 模块内部的字符数组的大小 + * #perm 访问权限 + * + * */ +static char *string = NULL; +module_param(string, charp, 0644); +MODULE_PARM_DESC(string, "Get an string(char *) value from user...\n"); + + +/* +static char buffer[20] = "gatieme"; +module_param_string(buffer, buffer, sizeof(buffer), 0644); +MODULE_PARM_DESC(value_charp, "Get an string buffer from user...\n"); +*/ + +static void force_exit_module(void) +{ + int symbol_addr; + + printk("XXXXXX, force!\n"); + symbol_addr = kallsyms_lookup_name(string); + + platform_device_unregister((struct platform_device*)(*(int*)symbol_addr)); +} + +static int force_cleanup_module(char *del_mod_name) +{ + struct module *list_mod, *mod, *relate; + int cpu; + + /* 遍历模块列表, 查找 del_mod_name 模块 */ + list_for_each_entry(list_mod, THIS_MODULE->list.prev, list) + { + if (strcmp(list_mod->name, del_mod_name) == 0) + { + mod = list_mod; + } + } + + /* 如果未找到 del_mod_name 则直接退出 */ + if(mod == NULL) + { + printk("[%s] module %s not found\n", THIS_MODULE->name, string); + return -1; + } + + printk("[before] name:%s, state:%d, refcnt:%u\n", + mod->name ,mod->state, module_refcount(mod)); + + /* 如果有其他模块依赖于 del_mod */ + if (!list_empty(&mod->source_list)) + { + /* 打印出所有依赖target的模块名 */ + list_for_each_entry(relate, &mod->source_list, source_list) + { + printk("[relate]:%s\n", relate->name); + } + } + else + { + printk("No modules depond on %s...\n", del_mod_name); + } + + mod->state = 0; + //mod->exit = force; + + for_each_possible_cpu(cpu) + { + local_set((local_t*)per_cpu_ptr(&(mod->refcnt), cpu), 0); + //local_set(__module_ref_addr(mod, cpu), 0); + //per_cpu_ptr(mod->refptr, cpu)->decs; + //module_put(mod); + } + atomic_set(&mod->refcnt, 1); + + printk("[after] name:%s, state:%d, refcnt:%u\n", + mod->name, mod->state, module_refcount(mod)); + + return 0; +} + + +static int __init force_rmmod_init(void) +{ + int symbol_addr; + int ret; + + /* 打印内核模块的信息*/ + printk("=======name : %s, state : %d INIT=======\n", THIS_MODULE->name, THIS_MODULE->state); + + if(string == NULL) + { + printk("[%s] module_name (NULL)\n", THIS_MODULE->name); + return 0; + } + + /* 打印内核模块的地址 */ + if((symbol_addr = kallsyms_lookup_name(string)) == NULL) + { + printk("[%s] %s symbol_addr : (null)\n", THIS_MODULE->name, string); + return 0; + } + printk("[%s] %s symbol_addr : 0x%x\n", THIS_MODULE->name, string, symbol_addr); + + + return force_cleanup_module(string); +} + + +static void __exit force_rmmod_exit(void) +{ + printk("=======name : %s, state : %d EXIT=======\n", THIS_MODULE->name, THIS_MODULE->state); +} + +module_init(force_rmmod_init); +module_exit(force_rmmod_exit); + +MODULE_LICENSE("GPL"); diff --git a/study/driver/rmmod/force_rmmod.c b/study/driver/00-code/rmmod/force_rmmod2.c similarity index 93% rename from study/driver/rmmod/force_rmmod.c rename to study/driver/00-code/rmmod/force_rmmod2.c index 91ed5d1..b1bbac5 100644 --- a/study/driver/rmmod/force_rmmod.c +++ b/study/driver/00-code/rmmod/force_rmmod2.c @@ -19,7 +19,7 @@ static int __init mymod_init(void) { if(strcmp(mod->name,"hello")==0) { - mod = list_mod' + mod = list_mod; } } @@ -27,7 +27,6 @@ static int __init mymod_init(void) printk(KERN_ALERT"name:%s state:%d refcnt:%u ",mod->name,mod->state,module_refcount(mod)); - // 打印出所有依赖target的模块名 if(!list_empty(&mod->modules_which_use_me)) { @@ -45,7 +44,8 @@ static int __init mymod_init(void) for_each_possible_cpu(cpu) { //local_set(__module_ref_addr(mod,cpu),0); - mod->ref[i].count=*(local_t *)&zero; + //mod->ref[i].count=*(local_t *)&zero; + atomic_set(&mod->refcnt, 0); } // 再看看target的名称、状态、引用计数