测试的proc_test的驱动proc_final包括只读proc_entry, 只写proc_entry和可读写proc_entry...

This commit is contained in:
gatieme
2016-07-30 11:03:23 +08:00
parent a3aac630c8
commit a9f6f5095d
18 changed files with 3400 additions and 56 deletions
+1 -1
View File
@@ -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:
@@ -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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
cmd_/home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.ko := ld -r -m elf_x86_64 -T ./scripts/module-common.lds --build-id -o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.ko /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.mod.o
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
cmd_/home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.o := ld -m elf_x86_64 -r -o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/ro.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/wo.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/rw.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/main.o
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,2 @@
/home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.ko
/home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/ro.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/wo.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/rw.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/main.o
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
0x35a0b04d read_write /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test EXPORT_SYMBOL
0x50efacf5 write_only /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test EXPORT_SYMBOL
0xe5fefaf3 read_only /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test EXPORT_SYMBOL
+3
View File
@@ -75,7 +75,10 @@
#define HIGH_3BIT(v) ((v) >> (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
+44 -38
View File
@@ -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");
+8 -1
View File
@@ -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__
+1
View File
@@ -0,0 +1 @@
kernel//home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.ko
+37
View File
@@ -0,0 +1,37 @@
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
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");
+17 -12
View File
@@ -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
}
+4 -4
View File
@@ -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
/////////////////