驱动学习3--添加copy_from_user©_to_user
2017-06-03 10:13
459 查看
驱动代码
#include <linux/module.h> // module_init module_exit #include <linux/init.h> // __init __exit #include <linux/fs.h> //register_chrdev file_operations #include <asm/uaccess.h> //copy_from_user copy_to_user #define DEMO_NAME "demo_char" static int my_major; static int demo_chrdev_open(struct inode *inode, struct file *file) { printk(KERN_INFO "demo_chrdev_open\n");/*open的调试代码*/ return 0; } static int demo_chrdev_release(struct inode *inode, struct file *file) { printk(KERN_INFO "demo_chrdev_release\n");/*close的调试代码*/ return 0; } static ssize_t demo_chrdev_write(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos) { int ret = -1; char kbuf[100] = {0}; ret = copy_from_user(kbuf,ubuf,count);/*返回值为0成功*/ if(ret) { printk(KERN_ERR "copy_from_user fail\n"); return -EINVAL; } printk(KERN_INFO "copy_from_user %s\r\n",kbuf); return 0; } static ssize_t demo_chrdev_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { int ret = -1; char kbuf[100] = "demo_chrdev_read."; ret = copy_to_user(ubuf,kbuf,count);/*返回值为0成功*/ if(ret) { printk(KERN_ERR "copy_to_user fail\n"); return -EINVAL; } return 0; } static const struct file_operations demo_fops = { .owner 4000 = THIS_MODULE,/*惯例,直接写即可*/ .open = demo_chrdev_open,/*把open的api与此函数联系起来*/ .release = demo_chrdev_release,/*把close的api于此函数联系起来*/ .write = demo_chrdev_write,/*把write的api于此函数联系起来*/ .read = demo_chrdev_read,/*把read的api于此函数联系起来*/ }; static int __init chrdev_init(void) /*模块安装*/ { my_major = register_chrdev(0,DEMO_NAME,&demo_fops);/*注册设备,0表示自动分配设备号*/ if(my_major<0){ printk(KERN_ERR "chrdev_init error.\n"); return -EINVAL; } printk(KERN_INFO "chrdev_init success.\n"); return 0; } static void __exit chrdev_exit(void)/*模块卸载*/ { unregister_chrdev(my_major,DEMO_NAME);/*注销设备*/ printk(KERN_INFO "chrdev_exit\n"); } module_init(chrdev_init); module_exit(chrdev_exit); MODULE_LICENSE("GPL");/*描述模块的许可证*/ MODULE_AUTHOR("Xin-Ya Zhu<mhzhuxinya@outlook.com>");/*描述模块的作者*/ MODULE_DESCRIPTION("demo test");/*描述模块的介绍信息*/ MODULE_ALIAS("alias xxx");/*描述模块的别名信息*/ /**************运行结果***************** [root@zhuxinya text]# lsmod Module Size Used by Not tainted [root@zhuxinya text]# insmod demo.ko [ 5456.922445] chrdev_init success. [root@zhuxinya text]# lsmod Module Size Used by Not tainted demo 1056 0 [root@zhuxinya text]# cat /proc/devices Character devices: 250 demo_char [root@zhuxinya text]# rmmod demo.ko [ 5524.153407] chrdev_exit *************************************/
应用代码
#include <stdio.h> #include <sys/types.h> //open close #include <sys/stat.h> #include <fcntl.h> #define FILE "/dev/demo_text" int main(void) { int fd = -1,ret = -1; char buf[100] = {0}; fd = open(FILE,O_RDWR); if(fd<0) { printf("open error.\n"); return -1; } ret = write(fd,"123",3); sleep(1); ret = read(fd,buf,100); printf("buf = %s\r\n",buf); sleep(1); close(fd); return 0; } /*************************** 安装好驱动后执行 mknod /dev/demo_text c 250 0 [root@zhuxinya text]# ./app [ 799.487045] demo_chrdev_open [ 799.488461] copy_from_user 123 buf = demo_chrdev_read. [ 801.491904] demo_chrdev_release *****************************/
相关文章推荐
- 为什么驱动里要使用copy_to_user和copy_from_user
- copy_from_user && copy_to_user
- linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问
- 实验终于成功了,copy_to_user() && copy_from_user()
- linux内核学习---copy_to_user和copy_from_user
- 关于copy_to_user和copy_from_user的学习小结
- copy_to_user 和 copy_from_user
- copy_to_user,copy_from_user,get_user和put_user函数实现
- copy_to_user和copy_from_user两个函数的分析
- copy_to_user和copy_from_user两个函数的分析
- Copy_from&to_user详解
- copy_to_user和copy_from_user两个函数的分析(转)
- copy_to_user和copy_from_user两个函数的分析
- Hibernate学习: 异常 identifier of an instance of com.zhssh.vo.TUser was altered from 1 to 1
- 用户空间和内核空间传递数据:get_user;put_user;copy_to_user;copy_from_user
- copy_to_user和copy_from_user两个函数的分析
- copy_to_user和copy_from_user两个函数的分析(转)
- copy_to_user,copy_from_user,get_user,put_user函数比较
- copy_to_user,copy_from_user,get_user,put_user函数比较
- copy_to_user,copy_from_user,get_user,put_user函数比较