简单字符驱动程序mycdev.c
来源:互联网 发布:关于网络推广员的文章 编辑:程序博客网 时间:2024/05/16 17:29
[root@bogon 桌面]# gedit mycdev.c
#include
#include
#include
#include
#include
#include
MODULE_AUTHOR("Me");
MODULE_LICENSE("GPL");
#define MYCDEV_MAJOR 231 /*给定的主设备号*/
#define MYCDEV_SIZE 100
static int mycdev_open(struct inode *inode, struct file *fp)
{
return 0;
}
static int mycdev_release(struct inode *inode, struct file *fp)
{
return 0;
}
static ssize_t mycdev_read(struct file *fp, char __user *buf, size_t size, loff_t *pos)
{
unsigned long p = *pos;
unsigned int count = size;
//char kernel_buf[MYCDEV_SIZE]="This is mycdev!";
char kernel_buf[MYCDEV_SIZE];
int i;
memset(kernel_buf,0,MYCDEV_SIZE);
memcpy(kernel_buf, "This is mycdev!", MYCDEV_SIZE);
if(p >= MYCDEV_SIZE)
return -1;
if(count > MYCDEV_SIZE)
count = MYCDEV_SIZE - p;
if (copy_to_user(buf, kernel_buf, count) != 0) {
printk("read error!\n");
return -1;
}
/*
for (i = 0; i < count; i++) {
__put_user(i, buf);//write 'i' from kernel space to user space's buf;
buf++;
}
*/
printk("reader: %d bytes was read...\n", count);
return count;
}
static ssize_t mycdev_write(struct file *fp, const char __user *buf, size_t size, loff_t *pos)
{
return size;
}
/* 填充 mycdev的 file operation 结构*/
static const struct file_operations mycdev_fops =
{
.owner = THIS_MODULE,
.read = mycdev_read,
.write = mycdev_write,
.open = mycdev_open,
.release = mycdev_release,
};
/*模块初始化函数*/
static int __init mycdev_init(void)
{
int ret;
printk("mycdev module is staring..\n");
ret=register_chrdev(MYCDEV_MAJOR,"my_cdev",&mycdev_fops); /*注册驱动程序*/
if(ret<0){
printk("register failed..\n");
return 0;
}else{
printk("register success..\n");
}
return 0;
}
/*模块卸载函数*/
static void __exit mycdev_exit(void)
{
printk("mycdev module is leaving..\n");
unregister_chrdev(MYCDEV_MAJOR,"my_cdev"); /*注销驱动程序*/
}
module_init(mycdev_init);
module_exit(mycdev_exit);
[root@bogon 桌面]# gedit Makefile
obj-m:=mycdev.o
PWD:=$(shell pwd)
CUR_PATH:=$(shell uname -r)
KERNEL_PATH:=/usr/src/kernels/$(CUR_PATH)
all:
make -C $(KERNEL_PATH) M=$(PWD) modules
clean:
make -C $(KERNEL_PATH) M=$(PWD) clean
[root@bogon 桌面]# gedit mycdev_test.c
#include
#include
#include
#include
#include
int main()
{
int testdev;
int i, ret;
char buf[15];
testdev = open("/dev/mycdev", O_RDWR);
if (-1 == testdev) {
printf("cannot open file.\n");
exit(1);
}
if (ret = read(testdev, buf, 15) <15) {
printf("read error!\n");
exit(1);
}
printf("%s\n", buf);
close(testdev);
return 0;
}
[root@bogon 桌面]# make
[root@bogon 桌面]# insmod mycdev.ko
[root@bogon 桌面]# cat /proc/devices
[root@bogon 桌面]# mknod /dev/mycdev c 231 0
[root@bogon 桌面]# chmod 777 /dev/mycdev
[root@bogon 桌面]# gcc mycdev_test.c -o mycdev_test
[root@bogon 桌面]# ./mycdev_test
[root@bogon 桌面]# dmesg
#include
#include
#include
#include
#include
#include
MODULE_AUTHOR("Me");
MODULE_LICENSE("GPL");
#define MYCDEV_MAJOR 231 /*给定的主设备号*/
#define MYCDEV_SIZE 100
static int mycdev_open(struct inode *inode, struct file *fp)
{
return 0;
}
static int mycdev_release(struct inode *inode, struct file *fp)
{
return 0;
}
static ssize_t mycdev_read(struct file *fp, char __user *buf, size_t size, loff_t *pos)
{
unsigned long p = *pos;
unsigned int count = size;
//char kernel_buf[MYCDEV_SIZE]="This is mycdev!";
char kernel_buf[MYCDEV_SIZE];
int i;
memset(kernel_buf,0,MYCDEV_SIZE);
memcpy(kernel_buf, "This is mycdev!", MYCDEV_SIZE);
if(p >= MYCDEV_SIZE)
return -1;
if(count > MYCDEV_SIZE)
count = MYCDEV_SIZE - p;
if (copy_to_user(buf, kernel_buf, count) != 0) {
printk("read error!\n");
return -1;
}
/*
for (i = 0; i < count; i++) {
__put_user(i, buf);//write 'i' from kernel space to user space's buf;
buf++;
}
*/
printk("reader: %d bytes was read...\n", count);
return count;
}
static ssize_t mycdev_write(struct file *fp, const char __user *buf, size_t size, loff_t *pos)
{
return size;
}
/* 填充 mycdev的 file operation 结构*/
static const struct file_operations mycdev_fops =
{
.owner = THIS_MODULE,
.read = mycdev_read,
.write = mycdev_write,
.open = mycdev_open,
.release = mycdev_release,
};
/*模块初始化函数*/
static int __init mycdev_init(void)
{
int ret;
printk("mycdev module is staring..\n");
ret=register_chrdev(MYCDEV_MAJOR,"my_cdev",&mycdev_fops); /*注册驱动程序*/
if(ret<0){
printk("register failed..\n");
return 0;
}else{
printk("register success..\n");
}
return 0;
}
/*模块卸载函数*/
static void __exit mycdev_exit(void)
{
printk("mycdev module is leaving..\n");
unregister_chrdev(MYCDEV_MAJOR,"my_cdev"); /*注销驱动程序*/
}
module_init(mycdev_init);
module_exit(mycdev_exit);
[root@bogon 桌面]# gedit Makefile
obj-m:=mycdev.o
PWD:=$(shell pwd)
CUR_PATH:=$(shell uname -r)
KERNEL_PATH:=/usr/src/kernels/$(CUR_PATH)
all:
make -C $(KERNEL_PATH) M=$(PWD) modules
clean:
make -C $(KERNEL_PATH) M=$(PWD) clean
[root@bogon 桌面]# gedit mycdev_test.c
#include
#include
#include
#include
#include
int main()
{
int testdev;
int i, ret;
char buf[15];
testdev = open("/dev/mycdev", O_RDWR);
if (-1 == testdev) {
printf("cannot open file.\n");
exit(1);
}
if (ret = read(testdev, buf, 15) <15) {
printf("read error!\n");
exit(1);
}
printf("%s\n", buf);
close(testdev);
return 0;
}
[root@bogon 桌面]# make
[root@bogon 桌面]# insmod mycdev.ko
[root@bogon 桌面]# cat /proc/devices
[root@bogon 桌面]# mknod /dev/mycdev c 231 0
[root@bogon 桌面]# chmod 777 /dev/mycdev
[root@bogon 桌面]# gcc mycdev_test.c -o mycdev_test
[root@bogon 桌面]# ./mycdev_test
[root@bogon 桌面]# dmesg
0
上一篇:简单字符驱动程序mycdev_globalmem.c
下一篇:RHEL5.4 两个网段通过双网卡,DHCP配置成功
相关热门文章
- 《深入Linux设备驱动程序机制...
- Linux设备驱动程序学习(1)-...
- Linux设备驱动程序学习(0)-...
- Linux设备驱动程序学习(2)-...
- Linux设备驱动程序学习(18)...
- A sample .exrc file for vi e...
- IBM System p5 服务器 HACMP ...
- 游标的特征
- DB2 9 应用开发(733 考试)认...
- busybox的httpd使用CGI脚本(Bu...
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 简单字符驱动程序mycdev.c
- 简单字符驱动程序mycdev.c
- 简单字符驱动程序mycdev_globalmem.c
- 简单字符驱动程序mycdev_globalmem.c
- 简单字符驱动程序mycdev_globalmem.c
- 简单字符设备驱动程序
- 简单字符设备驱动程序
- 简单字符设备驱动程序
- 简单的字符驱动程序
- 简单字符驱动程序
- 简单字符设备驱动程序
- 简单的字符设备驱动程序
- 一个简单的字符驱动程序
- 简单字符设备驱动程序分析
- 一个简单的字符驱动程序
- Linux设备驱动程序——简单字符设备驱动程序
- 简单字符设备驱动程序浅分析
- (5)一个简单字符设备驱动程序
- Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function问题解决
- [LeetCode]529. Minesweeper
- <!–[if lte IE ]>……<![endif]–>详解
- 为php安装redis扩展模块并测试
- 简单字符驱动程序mycdev_globalmem.c
- 简单字符驱动程序mycdev.c
- RHEL5.4 两个网段通过双网卡,DHCP配置成功
- C# object 类型
- 通过编辑文件的方式对DNS服务器进行配置
- dhcpd.conf.txt
- MPAndroidChart之辅助工具类封装
- 程序员的恋爱观
- 动态网站
- 静态网站
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
世界杯预赛
历届世界杯
世界杯冠军杯
世界杯四强
世界杯欧洲预选赛
足球小将世界杯
世界杯预选赛规则
欧洲世界杯
世界杯预选赛时间
女子世界杯
世界杯那一年
机器人世界杯
世界杯2022
韩日世界杯
下次世界杯
历年世界杯
男子世界杯
98世界杯
02世界杯
世界杯开幕式
世界杯回放
2026年世界杯
世界杯英语
2002世界杯
94世界杯
世界杯解说
世界杯 预选赛
世界杯小组
2030年世界杯
世界杯之歌
82年世界杯
90年世界杯
世界杯歌曲
u20世界杯
激情世界杯
2002年世界杯
86年世界杯
世界杯16强
98世界杯主题曲
世界杯小组赛
1998世界杯冠军