linux内核探索(5)--基于proc实现内核和用户态通信

目录

1、编写proc文件

2、编写配套的Makefile

3、测试


要求:实现一个proc文件,一个只读文件output,一个可写文件input;功能是:向input文件写入字符串后,可以从output文件中,读出input文件中反转后的字符串


1、编写proc文件

vim my_proc.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h> 
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#define BUFSIZE  1024

static struct proc_dir_entry *input, *output;
static char *buf;
static unsigned int len;

void reverse(void)
{
	int i = 0;
	int j = len - 2;
	printk("in reverse = %u\n", len);
	while(i < j)
	{
		char c;
		c = buf[i];
		buf[i++] = buf[j];
		buf[j--] = c;
	}
}

static ssize_t mywrite(struct file *file, const char __user *ubuf,size_t count, loff_t *ppos) 
{
	
	if(count <= 0)
		return -EFAULT;
	printk("---start write---\n");
	
	len = count > BUFSIZE ? BUFSIZE : count;

	// kfree memory by kmalloc before
	if(buf != NULL)
		kfree(buf);
	buf = (char*)kmalloc(len+1, GFP_KERNEL);
	if(buf == NULL)
	{
		printk("kmalloc failure\n");
		return -EFAULT;
	}

	//memset(buf, 0, sizeof(buf));
	memset(buf, 0, len+1);

	if(copy_from_user(buf, ubuf, len))
		return -EFAULT;
	printk("writing :%s",buf);
	return len;
}

static ssize_t myread(struct file *file, char __user *ubuf,size_t count, loff_t *ppos) 
{
	if(*ppos > 0)
		return 0;

	printk("---start read---\n");
	printk("origin = %s\n", buf);
	reverse();
	printk("after = %s\n", buf);

	if(copy_to_user(ubuf, buf, len))
		return -EFAULT;
	*ppos = *ppos + len;
	return len;
}

static struct file_operations fo_input = 
{
	.owner = THIS_MODULE,
	.write = mywrite,
};
static struct file_operations fo_output = 
{
	.owner = THIS_MODULE,
	.read = myread,
};

static int proc_init(void)
{
	input=proc_create("input",0660,NULL,&fo_input);
	if(input == NULL)
		return -ENOMEM;

	output=proc_create("output",0660,NULL,&fo_output);
	if(output == NULL)
		return -ENOMEM;

	printk("input & ouput init success!\n");
	return 0;
}

static void proc_cleanup(void)
{
	proc_remove(input);
	proc_remove(output);
	printk("input & output cleanup\n");
}
module_init(proc_init);
module_exit(proc_cleanup);
MODULE_LICENSE("GPL");

2、编写配套的Makefile

vim Makefile:

obj-m += my_proc.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

3、测试

make 编译一下

如下

make -C /lib/modules/4.18.11/build M=/home/zj/neihe/proc_module_making/my_proc clean
make[1]: 正在进入目录 `/usr/src/linux-4.18.11'
  CLEAN   /home/zj/neihe/proc_module_making/my_proc/.tmp_versions
  CLEAN   /home/zj/neihe/proc_module_making/my_proc/Module.symvers
make[1]:正在离开目录 `/usr/src/linux-4.18.11'
 

然后sudo su 切换的root用户下

ls /proc/

发现多了2个文件:input ,output

ehco "test" >> /proc/input

cat /proc/input

打印:tset

ps:dmesg

内核探索暂时先到这里,先告一段落= =

猜你喜欢

转载自blog.csdn.net/qq_41603102/article/details/83411568