已经无法再精简,适合入门。

 #include<linux/module.h>
#include<linux/init.h> #include<asm/uaccess.h>
#include <linux/types.h>
#include<linux/fs.h>
#include<linux/cdev.h>
struct mengc_dev{
char data[];
struct cdev cdev;
};
int mengmajor;
struct mengc_dev meng_device; void exit_mengc_dev(void)
{
dev_t devno = MKDEV(mengmajor,);
cdev_del(&meng_device.cdev);
unregister_chrdev_region(devno,);
}
int meng_open(struct inode*inode,struct file *filep)
{
return ;
}
int meng_release(struct inode*inode,struct file *filep)
{
return ;
} ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops)
{
if(*f_ops>=strlen(meng_device.data))
return ;
if(copy_to_user(buf,meng_device.data,strlen(meng_device.data)))
{
return -;
}
*f_ops+=strlen(meng_device.data);
return strlen(meng_device.data);
} ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops)
{
if(count>)
count=;
if(copy_from_user(meng_device.data,buf,count))
{
return -EFAULT;
}
return count;
} struct file_operations meng_fops=
{
.read=meng_read,
.write=meng_write,
.open=meng_open,
.release=meng_release
};
int init_mengc_dev(void)
{
int re;
dev_t dev=;
re=alloc_chrdev_region(&dev,,,"mengcdev");
if(re<)
{
printk("meng_devc register failed.\n");
return re;
}
mengmajor=MAJOR(dev);
memset(&meng_device,,sizeof(meng_device));
cdev_init(&meng_device.cdev,&meng_fops);
meng_device.cdev.owner=THIS_MODULE;
meng_device.cdev.ops=&meng_fops;
re=cdev_add(&meng_device.cdev,dev,);
if(re)
{
printk("mengdevc add faild.\n");
}
return ;
}
module_init(init_mengc_dev);
module_exit(exit_mengc_dev);

将上面的文件保存成mengcdev.c

然后在相同目录下建立一个Makefile文件,文件内容如下(只需这一行):

obj-m :=mengcdev.o

然后在此目录下执行 make -C /lib/modules/`uname -r`/build/ M=`pwd` 这条命令执行成功的前天是安装了源代码包,具体可以参阅其他资料,Ubuntu只需apt-get install 几个包,Redhat系列只需yuminstall 几个。当然需要有开发环境了,即gcc之类的。

一旦编译完成即可生成mengcdev.ko 这个模块

用root插入这个模块 insmod mengcdev.ko

然后去/proc/device中找相应的设备号

cat /proc/devices |grep meng

如果输出如下:

248 mengcdev

则执行

mknod /dev/mengcdev c 248 1,注意把248换成实际输出的值

然后就可以进行测试了  echo hello >/dev/mengcdev

cat /dev/mengcdev

Linux 设备驱动程序 字符设备的更多相关文章

  1. Linux驱动设计——字符设备驱动(一)

    Linux字符设别驱动结构 cdev结构体 struct cdev { struct kobject kobj; struct module *owner; const struct file_ope ...

  2. 【Linux驱动】字符设备驱动

    一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面 ...

  3. 手把手教Linux驱动3-之字符设备架构详解,有这篇就够了

    一.Linux设备分类 Linux系统为了管理方便,将设备分成三种基本类型: 字符设备 块设备 网络设备 字符设备: 字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程 ...

  4. Linux平台块设备到字符设备(裸设备)的三种映射方式(转载)

    在Linux平台oracle rac的组建过程中,如果使用ASM+RAW的存储方式的话,由于asm不支持块设备,支持持字符访问设备,所以需要配置将Block Device Drive转变成Charac ...

  5. Linux块设备和字符设备

    块设备:系统能够随机无序访问固定大小的数据片的设备,这些数据片称为块.块设备是以固定大小长度来传送资料的,它使用缓冲区暂存数据,时机成熟后从缓存中一次性写入到设备或者从设备中一次性放到缓存区.常见的块 ...

  6. Linux学习 :字符设备框架

    一.系统功能框架: U-boot : 启动内核 linux kernel: 启动应用 应用: open,read,write 都是通过C库实现,汇编就相当于swi val,引发中断,通过系统调用接口在 ...

  7. linux device driver —— 字符设备

    现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下. 测试环境是 Ubuntu 16.04 64bit 驱动程序: #include <linux/fs.h> ...

  8. 【驱动】linux设备驱动·字符设备驱动开发

    Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...

  9. 【转】linux设备驱动程序之简单字符设备驱动

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用 ...

随机推荐

  1. AngularJS使用指南

    ng-app 定义一个AngularJS应用程序 ng-model 把元素值绑定到AngularJS应用程序 ng-blind 把AngularJS应用程序数据绑定到HTML视图上 ng-init 初 ...

  2. 2017年1月5日 星期四 --出埃及记 Exodus 21:31

    2017年1月5日 星期四 --出埃及记 Exodus 21:31 This law also applies if the bull gores a son or daughter.牛无论触了人的儿 ...

  3. Trading

    http://v.youku.com/v_show/id_XMTA0OTcxMjgw.html?from=y1.2-1-87.3.8-1.1-1-1-7

  4. Boost学习笔记(二) 时间与日期

    timer库概述 timer库包含三个组件:分别是计时器类timer.progress_timer和进度指示类progress_display timer 主要作用是计时,精确度是毫秒级.下面是一个简 ...

  5. MySQL基本数据类型

    MySQL数据类型包括:整型.浮点型.日期类型.字符型,这里用表格的方式详细说明每个数据类型,这些只要记住常用的即可,需要再查阅. 整型 数据类型 存储范围 字节 TINYINT 有符号值:-128 ...

  6. 读《编写可维护的JavaScript》第五章总结

    第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...

  7. fzuoj1111Radar Installation (贪心)

    题目大意是在海岸线布置n个雷达,要求雷达的范围要包含所有的小岛: 思路:逆向思维把小岛看成一个个范围,与海岸线的交集,从最左端的开始找 (贪心最左端的点),接着不用一个一个去遍历,直接用前一个的右端点 ...

  8. 用Charles抓取https接口数据

    由于我之前抓取的某APP接口全面换上了https接口,导致我在抓取过程中遇到了很大的困境 用Charles无法获取到内容,由于现在已经搞定了,无法展示当时的错误信息,我从网站找了一个类似的错误信息 首 ...

  9. 微软亚洲实验室一篇超过人类识别率的论文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification ImageNet Classification

    在该文章的两大创新点:一个是PReLU,一个是权值初始化的方法.下面我们分别一一来看. PReLU(paramter ReLU) 所谓的PRelu,即在 ReLU激活函数的基础上加入了一个参数,看一个 ...

  10. ORACLE迁移votedisk,spfile以及OCRfile的方法

    在安装GUI时,创建了第一块ASM磁盘,命名为DATA1,上面存放了spfile文件,ocrfile文件,并且作为了vote盘.感觉名字和实际不符,容易搞混,所以想删除这个磁盘,直接删除会报错: OR ...