一个简单的字符设备驱动

本文介绍了一个简单的字符设备驱动程序的设计与实现,包括内核模块的编写、文件操作接口的定义及应用层读写操作的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//一个简单字符设备驱动

内核中:test.c ;Makefile;

应用层:read.c ;write.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/thread_info.h>
#include <linux/sched.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/fs.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("bunter");


int my_open(struct inode *no, struct file *fp);
int my_release(struct inode *no, struct file *fp);
ssize_t my_read(struct file *fp, char *buff, size_t size, loff_t *off);
ssize_t my_write(struct file *fp, char *buff, size_t size, loff_t *off);


//struct cdev wangcai;
//struct cdev tom;
//dev_t devno1;
//dev_t devno2;
//unsigned char data[1024];
struct updev{
struct cdev d;
dev_t devno;
unsigned char data[1024];
};


struct file_operations ops;


struct updev wangcai, tom;


int test_init()
{
ops.open = my_open;
ops.read = my_read;
ops.write = my_write;
ops.release = my_release;


//cdev_init(&wangcai, &ops);
//cdev_init(&tom, &ops);
cdev_init(&wangcai.d, &ops);
cdev_init(&tom.d, &ops);

//devno1 = MKDEV(9, 1);
//devno2 = MKDEV(9, 2);
wangcai.devno = MKDEV(9, 1);
tom.devno = MKDEV(9, 2);

//cdev_add(&wangcai, devno1, 1);
//cdev_add(&tom, devno2, 1);
cdev_add(&wangcai.d, wangcai.devno, 1);
cdev_add(&tom.d, tom.devno, 1);

return 0;
}


void test_exit()
{
printk("this is test exit\n");
}


module_init(test_init);
module_exit(test_exit);


int my_open(struct inode *no, struct file *fp)
{
struct cdev *c = no->i_cdev;
struct updev *this = (struct updev *)c;
fp->private_data = this;

return 0;
}


int my_release(struct inode *no, struct file *fp)
{
return 0;
}


ssize_t my_read(struct file *fp, char *buff, size_t size, loff_t *off)
{
struct updev *this = fp->private_data;
memcpy(buff, this->data, size);


return size;
}


ssize_t my_write(struct file *fp, char *buff, size_t size, loff_t *off)
{
struct updev *this = fp->private_data;
memcpy(this->data, buff, size);


return size;
}



Makefile:

default:
make -C /home/linux-2.6.28_smdk6410 M=`pwd`


clean:
make -C /home/linux-2.6.28_smdk6410 M=`pwd` clean
rm -rf modules.order


obj-m += test.o

应用层:

write.c

//应用层实现
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
if(argc < 3){
printf("%s <file> <content> \n", argv[0]);
return 0;
}
int fd = open(argv[1], O_RDWR);
if(fd < 0){
perror("open");
return 1;
}
int ret = write(fd, argv[2], strlen(argv[2]));
if(ret < 0){
perror("write");
return 1;
}
close(fd);
}
read.c:


//应用层实现我们刚刚些的小驱动
#include <stdio.h>
#include <fcntl.h>


int main(int argc, char *argv[])
{
if(argc < 2){
printf("%s <file>\n", argv[0]);
return 0;
}

int fd = open(argv[1], O_RDWR);
if(fd < 0){
perror("open");
return 1;
}

unsigned char buff[1024] = {0};
int ret = read(fd, buff, 1024);
if(ret < 0){
perror("read");
return 1;
}

printf("buff is %s\n", buff);

close(fd);
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值