首页 技术 正文
技术 2022年11月8日
0 收藏 977 点赞 1,983 浏览 3538 个字

现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下.

测试环境是 Ubuntu 16.04 64bit

驱动程序:

#include <linux/fs.h>#include <linux/module.h>#include <linux/init.h>#include <linux/cdev.h>#include <linux/uaccess.h>#define CDEVDEMO_MAJOR 0#define BUFFER_SIZE 512static int cdevdemo_major = CDEVDEMO_MAJOR;static char msgbuff[BUFFER_SIZE];void cdevdemo_exit(void);int  cdevdemo_init(void);MODULE_LICENSE("Dual BSD/GPL");module_param(cdevdemo_major,int,S_IRUGO);
//注册初始化方法module_init(cdevdemo_init);
//注册退出方法module_exit(cdevdemo_exit);struct cdev *my_cdev;ssize_t cdev_write(struct file *, const char __user *, size_t, loff_t *);ssize_t cdev_read (struct file *, char __user *, size_t, loff_t *);int cdev_open (struct inode *,struct file *);int cdev_release (struct inode *,struct file *);struct file_operations my_fops = { .owner = THIS_MODULE, .open = cdev_open, .release = cdev_release, .read = cdev_read, .write = cdev_write,};void init_cdev(void){ int ret; my_cdev = cdev_alloc(); my_cdev->owner = THIS_MODULE; my_cdev->ops = &my_fops; //添加字符设备 ret = cdev_add(my_cdev,MKDEV(cdevdemo_major,),); ) { printk(KERN_NOTICE "=== cdev_add fail"); } printk(KERN_NOTICE "=== init_cdev finish");}int __init cdevdemo_init(void){ int ret; dev_t devno; printk(KERN_NOTICE "=== cdevdemo_init 0"); devno = MKDEV(cdevdemo_major,); if(cdevdemo_major) { printk(KERN_NOTICE "=== cdevdemo_init try register"); ret = register_chrdev_region(devno,,"cdevdemo"); }else { printk(KERN_NOTICE "=== cdevdemo_init auto register"); ret = alloc_chrdev_region(&devno,,,"cdevdemo"); cdevdemo_major = MAJOR(devno); } ) { printk(KERN_NOTICE "=== cdevdemo_init register fail"); return ret; } init_cdev(); printk(KERN_NOTICE "=== cdevdemo_init finish"); ;}void __exit cdevdemo_exit(void){ printk (KERN_NOTICE "=== cdevdemo_exit"); //去除字符设备 cdev_del(my_cdev); unregister_chrdev_region(MKDEV(cdevdemo_major,),);}ssize_t cdev_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp){ int ret; printk(KERN_NOTICE "=== cdev_write"); ret = copy_from_user(msgbuff,buf,count%BUFFER_SIZE); ) { printk(KERN_NOTICE "=== cdev_write copy_from_user fail %d",ret); return -EFAULT; } msgbuff[count] = '-'; msgbuff[count+] = '-'; msgbuff[count+] = 'k'; msgbuff[count+] = 'e'; msgbuff[count+] = 'r'; msgbuff[count+] = 'n'; msgbuff[count+] = 'e'; msgbuff[count+] = 'l'; msgbuff[count+] = '\0'; printk(KERN_NOTICE "--- cdev_write : %s",msgbuff); return count%BUFFER_SIZE;}ssize_t cdev_read (struct file *filp, char __user *buf, size_t count, loff_t *offp){ int ret; printk(KERN_NOTICE "=== cdev_read"); ret = copy_to_user(buf,msgbuff,count%BUFFER_SIZE); ) { printk(KERN_NOTICE "=== cdev_read copy_to_user fail %d",ret); return -EFAULT; } printk(KERN_NOTICE "--- cdev_read :%s",msgbuff); return count%BUFFER_SIZE;}int cdev_open (struct inode *inode,struct file *filp){ printk(KERN_NOTICE "=== cdev_open"); ;}int cdev_release (struct inode *inode,struct file *filp){ printk(KERN_NOTICE "=== cdev_release"); ;}

Makefile

ifneq ($(KERNELRELEASE),)mymodule-objs := cdevobj-m := cdev.oelsePWD  := $(shell pwd)KVER ?= $(shell uname -r)KDIR := /lib/modules/$(KVER)/buildall:    $(MAKE) -C $(KDIR) M=$(PWD)clean:    rm -rf *.cmd *.o *.mod.c *.ko .tmp_versionsendif

install.sh

#!/bin/bashmodule="cdev"device="cdev"name="cdevdemo"insmod $module.ko ]then    exitfimajor=$(awk "{if(\$2==\"$name\"){print \$1}}"  /proc/devices) /dev/$device

uninstall.sh

#!/bin/bashmodule="cdev"device="cdev"file="/dev/$device"if [ -e $file ]then    rm -rf /dev/$device    echo 'rm device'fiecho 'rm module'/sbin/rmmod $module

测试程序

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>int main(void){    int fd,ret;    ] = "hello I'm from user";    ] = {};    fd = open("/dev/cdev",O_RDWR);    )    {        puts("open fail");        ;    }    ret = write(fd,buff,strlen(buff));    printf("write ret :%d\n",ret);    ret = read(fd,rbuff,);    printf("read  ret :%d\n%s",ret,rbuff);    ;}

运行结果:

write ret :read  ret :hello I'm from user--kernel
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295