From a9f6f5095d18d1e507ef24a6567b0ef32465d11d Mon Sep 17 00:00:00 2001 From: gatieme Date: Sat, 30 Jul 2016 11:03:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84proc=5Ftest=E7=9A=84?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8proc=5Ffinal=E5=8C=85=E6=8B=AC=E5=8F=AA?= =?UTF-8?q?=E8=AF=BBproc=5Fentry,=20=E5=8F=AA=E5=86=99proc=5Fentry?= =?UTF-8?q?=E5=92=8C=E5=8F=AF=E8=AF=BB=E5=86=99proc=5Fentry...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- .../05-schedule/07-cfs/01-cfs/README.md | 5 + .../05-schedule/images/cfs_do_fork.jpg | Bin 0 -> 51302 bytes study/proc/proc_final/.main.o.cmd | 893 ++++++++++++++++++ study/proc/proc_final/.proc-test.ko.cmd | 1 + study/proc/proc_final/.proc-test.mod.o.cmd | 594 ++++++++++++ study/proc/proc_final/.proc-test.o.cmd | 1 + study/proc/proc_final/.rw.o.cmd | 893 ++++++++++++++++++ .../proc_final/.tmp_versions/proc-test.mod | 2 + study/proc/proc_final/.wo.o.cmd | 893 ++++++++++++++++++ study/proc/proc_final/Module.symvers | 3 + study/proc/proc_final/common.h | 3 + study/proc/proc_final/main.c | 82 +- study/proc/proc_final/main.h | 9 +- study/proc/proc_final/modules.order | 1 + study/proc/proc_final/proc-test.mod.c | 37 + study/proc/proc_final/rw.c | 29 +- study/proc/proc_final/wo.c | 8 +- 18 files changed, 3400 insertions(+), 56 deletions(-) create mode 100644 study/kernel/01-process/05-schedule/images/cfs_do_fork.jpg create mode 100644 study/proc/proc_final/.main.o.cmd create mode 100644 study/proc/proc_final/.proc-test.ko.cmd create mode 100644 study/proc/proc_final/.proc-test.mod.o.cmd create mode 100644 study/proc/proc_final/.proc-test.o.cmd create mode 100644 study/proc/proc_final/.rw.o.cmd create mode 100644 study/proc/proc_final/.tmp_versions/proc-test.mod create mode 100644 study/proc/proc_final/.wo.o.cmd create mode 100644 study/proc/proc_final/Module.symvers create mode 100644 study/proc/proc_final/modules.order create mode 100644 study/proc/proc_final/proc-test.mod.c diff --git a/Makefile b/Makefile index 95b75fb..5ef71a2 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all:github -COMMIT="测试的proc_test驱动包括只读proc_entry, 只写proc_entry和可读写proc_entry..." +COMMIT="测试的proc_test的驱动proc_final包括只读proc_entry, 只写proc_entry和可读写proc_entry..." .PHONY : github github: diff --git a/study/kernel/01-process/05-schedule/07-cfs/01-cfs/README.md b/study/kernel/01-process/05-schedule/07-cfs/01-cfs/README.md index b0659e6..4f76eb6 100644 --- a/study/kernel/01-process/05-schedule/07-cfs/01-cfs/README.md +++ b/study/kernel/01-process/05-schedule/07-cfs/01-cfs/README.md @@ -309,3 +309,8 @@ struct cfs_rq { [理解CFS组调度](http://www.360doc.com/content/15/1006/18/18252487_503643269.shtml) [从几个问题开始理解CFS调度器](http://linuxperf.com/?p=42) + + +[Linux 任务调度策略](http://blog.csdn.net/mtofum/article/details/44108043) + +[Linux内核学习6:内存管理(2)-进程地址空间](http://blog.csdn.net/gzbaishabi/article/details/39371523) \ No newline at end of file diff --git a/study/kernel/01-process/05-schedule/images/cfs_do_fork.jpg b/study/kernel/01-process/05-schedule/images/cfs_do_fork.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a555306a8c1ec28137e84ab08a0b09665bdf872 GIT binary patch literal 51302 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 (8 * sizeof(int) - 3) & 0x07) /// 取出当前信息的高1位 #define HIGH_1BIT(v) ((v) >> (8 * sizeof(int) - 1) & 0x01) + +#ifndef ALIGN #define ALIGN(size, align) ((size + align - 1) & (~(align - 1))) +#endif #define BitGet(number, pos) ((number) >> (pos) & 1) /// 用宏得到某数的某位 #define BitSet(number, pos) ((number) |= 1 << (pos)) /// 把某位置1 diff --git a/study/proc/proc_final/main.c b/study/proc/proc_final/main.c index cf202fe..3d1a7b1 100644 --- a/study/proc/proc_final/main.c +++ b/study/proc/proc_final/main.c @@ -45,14 +45,14 @@ static int __init proc_test_init(void) * as the interface between the kernel and the user program. * */ - dir = proc_mkdir("proc_test", NULL); + dir = proc_mkdir(PROC_DIR, NULL); if(dir == NULL) { - dbginfo("Can't create "PROC_DIR"\n"); + printk("Can't create " PROC_ROOT "/" PROC_DIR "\n"); return FAIL; } - dbginfo("PROC_MKDIR "); - printk("Create /proc/memoryEngine success...\n"); + printk("PROC_MKDIR "); + printk("Create " PROC_ROOT "/" PROC_DIR "success...\n"); #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) /// modify by gatieme for system porting NeoKylin-linux-3.14/16 @@ -90,54 +90,57 @@ static int __init proc_test_init(void) //////////////////////////////////////////////////////////////////////////// #ifdef CREATE_PROC_ENTRY - proc_read_only = create_proc_entry("ctl", PERMISSION, dir); + proc_read_only = create_proc_entry(PROC_READ_ONLY_ENTRY, PERMISSION, dir); if(proc_read_only == NULL) { - dbginfo("Can't create "PROC_DIR PROC_READ_ONLY_ENTRY "\n"); + printk("Can't create " PROC_READ_ONLY_FILE "\n"); ret = FAIL; goto create_read_only_failed; } - proc_read_only->write_proc = proc_read_only; // write only + proc_read_only->write_proc = proc_read_ro; // write only +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) + proc_read_only->owner = THIS_MODULE; +#endif - //proc_read_only->owner = THIS_MODULE; - - dbginfo("CREATE_PROC_ENTRY "); + printk("CREATE_PROC_ENTRY "); #elif defined PROC_CREATE - proc_read_only = proc_create("ctl", PERMISSION, dir, &proc_read_only_fops); + proc_read_only = proc_create(PROC_READ_ONLY_ENTRY, PERMISSION, dir, &proc_read_only_fops); if(proc_read_only == NULL) { - dbginfo("Can't create "PROC_DIR PROC_READ_ONLY_ENTRY "\n"); + printk("Can't create " PROC_READ_ONLY_FILE "\n"); ret = FAIL; goto create_read_only_failed; } - dbginfo("PROC_CREATE "); + printk("PROC_CREATE "); #endif - printk("Create "PROC_DIR PROC_READ_ONLY_ENTRY " success...\n"); + printk("Create " PROC_READ_ONLY_FILE " success...\n"); //////////////////////////////////////////////////////////////////////////// /// create a file named "write only" in direntory //////////////////////////////////////////////////////////////////////////// #ifdef CREATE_PROC_ENTRY - proc_write_only = create_proc_entry(PROC_DIR, PERMISSION, dir); + proc_write_only = create_proc_entry(PROC_WRITE_ONLY_ENTRY, PERMISSION, dir); if(proc_write_only == NULL) { - dbginfo("Can't create " PROC_DIR PROC_WRITE_ONLY_ENTRY"\n"); + printk("Can't create " PROC_WRITE_ONLY_FILE "\n"); ret = FAIL; goto create_write_only_failed; } - proc_write_only->write_proc = proc_write_pid; /// write only - //proc_write_only->owner = THIS_MODULE; + proc_write_only->write_proc = proc_write_wo; /// write only +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) + proc_write_only->owner = THIS_MODULE; +#endif - dbginfo("CREATE_PROC_ENTRY "); + printk("CREATE_PROC_ENTRY "); #elif defined PROC_CREATE @@ -145,14 +148,14 @@ static int __init proc_test_init(void) if(proc_write_only == NULL) { - dbginfo("Can't create " PRPC_DIR PROC_WRITE_ONLY_ENTRY "\n"); + printk("Can't create " PROC_WRITE_ONLY_FILE "\n"); ret = FAIL; goto create_write_only_failed; } - dbginfo("PROC_CREATE "); + printk("PROC_CREATE "); #endif - printk("Create " PRPC_DIR PROC_WRITE_ONLY_ENTRY " success...\n"); + printk("Create " PROC_WRITE_ONLY_FILE " success...\n"); @@ -162,36 +165,39 @@ static int __init proc_test_init(void) //////////////////////////////////////////////////////////////////////////// #ifdef CREATE_PROC_ENTRY - proc_read_write = create_proc_entry("virtualAddr", PERMISSION, dir); + proc_read_write = create_proc_entry(PROC_READ_WRITE_ENTRY, PERMISSION, dir); if(proc_read_write == NULL) { - dbginfo("Can't create " PRPC_DIR PROC_READ_WRITE_ENTRY "\n"); + printk("Can't create " PROC_READ_WRITE_FILE "\n"); ret = FAIL; goto create_read_write_failed; } - proc_read_write->read_proc = proc_read_va; // can read - proc_read_write->write_proc = proc_write_va; // can write - //proc_read_write->owner = THIS_MODULE; + proc_read_write->read_proc = proc_read_rw; // can read + proc_read_write->write_proc = proc_write_rw; // can write +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) + proc_read_write->owner = THIS_MODULE; +#endif + + printk("CREATE_PROC_ENTRY "); - dbginfo("CREATE_PROC_ENTRY "); #elif defined PROC_CREATE - proc_read_write = proc_create("virtualAddr", PERMISSION, dir, &proc_read_write_fops); + proc_read_write = proc_creat(PROC_READ_WRITE_ENTRY, PERMISSION, dir, &proc_read_write_fops); if(proc_read_write == NULL) { - dbginfo("Can't create " PRPC_DIR PROC_READ_WRITE_ENTRY "\n"); + printk("Can't create " PROC_READ_WRITE_FILE "\n"); ret = FAIL; goto create_va_failed; } - dbginfo("PROC_CREATE "); + printk("PROC_CREATE "); #endif - printk("Create " PRPC_DIR PROC_READ_WRITE_ENTRY " success...\n"); + printk("Create " PROC_READ_WRITE_FILE " success...\n"); - dbginfo("Memory engine module init\n"); + printk("Memory engine module init\n"); return OK; @@ -206,7 +212,7 @@ create_write_only_failed : create_read_only_failed : remove_proc_entry(PROC_DIR, NULL); - return ret; + return FAIL; } @@ -214,7 +220,7 @@ create_read_only_failed : /* * uninit memory fault injection module */ -static void __exit exitME(void) +static void __exit proc_test_exit(void) { remove_proc_entry("read_write", dir); printk("Remove /proc/proc_test/read_write success\n"); @@ -225,11 +231,11 @@ static void __exit exitME(void) remove_proc_entry("read_only", dir); printk("Remove /proc/proc_test/read_only success\n"); - dbginfo("Memory proc_test module exit\n"); + printk("Memory proc_test module exit\n"); } -module_init(initPROC); -module_exit(exitPROC); +module_init(proc_test_init); +module_exit(proc_test_exit); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Gatieme @ HIT CS HDMC team"); diff --git a/study/proc/proc_final/main.h b/study/proc/proc_final/main.h index a130a39..6125a51 100644 --- a/study/proc/proc_final/main.h +++ b/study/proc/proc_final/main.h @@ -26,9 +26,16 @@ /* * proc files */ -#define PROC_DIR "/proc/proc_test" +#define PROC_ROOT "proc" +#define PROC_DIR "proc_test" #define PROC_READ_ONLY_ENTRY "read_only" #define PROC_WRITE_ONLY_ENTRY "write_only" #define PROC_READ_WRITE_ENTRY "read_write" +#define PROC_READ_ONLY_FILE PROC_ROOT "/" PROC_DIR "/" PROC_READ_ONLY_ENTRY +#define PROC_WRITE_ONLY_FILE PROC_ROOT "/" PROC_DIR "/" PROC_WRITE_ONLY_ENTRY +#define PROC_READ_WRITE_FILE PROC_ROOT "/" PROC_DIR "/" PROC_READ_WRITE_ENTRY + + + #endif // #define __MAIN_H_INCLUDE__ diff --git a/study/proc/proc_final/modules.order b/study/proc/proc_final/modules.order new file mode 100644 index 0000000..1d4b574 --- /dev/null +++ b/study/proc/proc_final/modules.order @@ -0,0 +1 @@ +kernel//home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.ko diff --git a/study/proc/proc_final/proc-test.mod.c b/study/proc/proc_final/proc-test.mod.c new file mode 100644 index 0000000..c8865b7 --- /dev/null +++ b/study/proc/proc_final/proc-test.mod.c @@ -0,0 +1,37 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +__visible struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const struct modversion_info ____versions[] +__used +__attribute__((section("__versions"))) = { + { 0xcd71858e, __VMLINUX_SYMBOL_STR(module_layout) }, + { 0x2c903330, __VMLINUX_SYMBOL_STR(remove_proc_entry) }, + { 0x91715312, __VMLINUX_SYMBOL_STR(sprintf) }, + { 0xc42b8c14, __VMLINUX_SYMBOL_STR(proc_mkdir) }, + { 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) }, + { 0x20c55ae0, __VMLINUX_SYMBOL_STR(sscanf) }, + { 0xdb7305a1, __VMLINUX_SYMBOL_STR(__stack_chk_fail) }, + { 0xbdfb6dbb, __VMLINUX_SYMBOL_STR(__fentry__) }, + { 0x4f6b400b, __VMLINUX_SYMBOL_STR(_copy_from_user) }, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + + +MODULE_INFO(srcversion, "83B86D0E8C516766DC68A09"); diff --git a/study/proc/proc_final/rw.c b/study/proc/proc_final/rw.c index 4e2b37d..93955e3 100644 --- a/study/proc/proc_final/rw.c +++ b/study/proc/proc_final/rw.c @@ -10,7 +10,7 @@ #include "main.h" - +unsigned long rw_data; /* * @@ -22,11 +22,16 @@ int proc_write_rw(struct file *file, const char *buffer, unsigned long count, vo if(count <= 0) { return FAIL; } memset(srw, '\0', sizeof(srw)); - iRet = copy_from_user(srw, buffer, count); - if(iRet) { return FAIL; } - iRet = sscanf(srw,"%lx",&rw); - if(iRet != 1) { return FAIL; } - dbginfo("Rcv rw:0x%lx\n",rw); + + iRet = copy_from_user(srw, buffer, count); + + if(iRet) { return FAIL; } + + iRet = sscanf(srw,"%lx",&rw_data); + + if(iRet != 1) { return FAIL; } + + printk(KERN_INFO "Rcv rw:0x%lx\n", rw_data); return count; } @@ -37,8 +42,8 @@ int proc_write_rw(struct file *file, const char *buffer, unsigned long count, vo int proc_read_rw(char * rwge,char **start, off_t off, int count, int * eof,void * data) { int iLen; - dbginfo("0x%lx\n", ack_rw); - iLen = sprintf(rwge, "%lx", ack_rw); + printk("0x%lx\n", rw_data); + iLen = sprintf(rwge, "%lx", rw_data); return iLen; } @@ -57,12 +62,12 @@ static int seq_show_rw(struct seq_file *m, void *v) /* char buf[MAX_LINE]; int ret = 0; - dbginfo("0x%lx\n", ack_rw); - ret = sprintf(buf, "%lx", ack_rw); + printk("0x%lx\n", rw_data); + ret = sprintf(buf, "%lx", rw_data); */ - dbginfo("0x%lx\n", ack_rw); - seq_printf(m, "%lx", ack_rw); + printk("0x%lx\n", rw_data); + seq_printf(m, "%lx", rw_data); return 0; //!! must be 0, or will show nothing T.T } diff --git a/study/proc/proc_final/wo.c b/study/proc/proc_final/wo.c index f973cd0..8b8bbc2 100644 --- a/study/proc/proc_final/wo.c +++ b/study/proc/proc_final/wo.c @@ -16,8 +16,8 @@ -//char wo_buffer[MAX_LINE] = "WRITE ONLY!!!"; -unsigned long wo_buffer; +char wo_buffer[MAX_LINE] = "WRITE ONLY!!!"; +//unsigned long wo_data; /* * */ @@ -42,12 +42,12 @@ int proc_write_wo( struct file *file, return FAIL; } - iRet = sscanf(temp,"%d",&wo_buffer); + iRet = sscanf(temp,"%s",wo_buffer); if(iRet != 1) { return FAIL; } - dbginfo("Rcv wo : %d\n", wo_buffer); + printk(KERN_INFO "Rcv wo : %s\n", wo_buffer); ///////////////// // do something /////////////////