mirror of
https://github.com/gatieme/LDD-LinuxDeviceDrivers.git
synced 2026-08-18 17:17:39 +08:00
测试的proc_test的驱动proc_final包括只读proc_entry, 只写proc_entry和可读写proc_entry...
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
kernel//home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/proc/proc_final/proc-test.ko
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
/////////////////
|
||||
|
||||
Reference in New Issue
Block a user