代码拉取完成,页面将自动刷新
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#define CHRDEV_MAJOR 200 //主设备号
#define CHRDEV_NAME "chrdev" //名字
static char readbuf[100]; /*读缓冲 */
static char writebuf[100]; /* 写缓冲 */
static char kerneldata[] = {"kernel data!"};
static int chrdev_open(struct inode *inode, struct file *filp)
{
// printk("chrdev_open\r\n");
return 0;
}
static int chrdev_release(struct inode *inode, struct file *filp)
{
// printk("chrdev_release\r\n");
return 0;
}
static ssize_t chrdev_read(struct file *filp, __user char *buf, size_t count,
loff_t *ppos)
{
int ret = 0;
//printk("chrdev_read\r\n");
memcpy(readbuf, kerneldata, sizeof(kerneldata));
ret = copy_to_user(buf, readbuf, count);
if(ret == 0) {
} else {
}
return 0;
}
static ssize_t chrdev_write(struct file *filp, const char __user *buf,
size_t count, loff_t *ppos)
{
int ret = 0;
//printk("chrdev_write\r\n");
ret = copy_from_user(writebuf, buf, count);
if(ret == 0) {
printk("kernel recevdata:%s\r\n", writebuf);
} else {
}
return 0;
}
/*
* 字符设备 操作集合
*/
static struct file_operations chrdev_fops={
.owner = THIS_MODULE,
.open = chrdev_open,
.release = chrdev_release,
.read = chrdev_read,
.write = chrdev_write,
};
static int __init chrdev_init(void)
{
int ret = 0;
printk("chrdev_init\r\n");
/* 注册字符设备 */
ret = register_chrdev(CHRDEV_MAJOR, CHRDEV_NAME, &chrdev_fops);
if(ret < 0) {
printk("chrdev init failed!\r\n");
}
return 0;
}
static void __exit chrdev_exit(void)
{
printk("chrdev_exit\r\n");
/* 注销字符设备 */
unregister_chrdev(CHRDEV_MAJOR, CHRDEV_NAME);
}
/*
模块入口与出口
*/
module_init(chrdev_init); /* 入口 */
module_exit(chrdev_exit); /* 出口 */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zkw");
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。