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

 #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. NSValue 类的使用

    NSValue对象是用来存储一个C或者Objective-C数据的简单容器.它可以保存任意类型的数据int,float,char等,也可以是指pointers, structures, and obj ...

  2. [转]解决IIS下UTF-8文件报错乱码的问题

    找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后 ...

  3. Jquery中each的三种遍历方法

    Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...

  4. js取两个数组的交集|差集|并集|补集|去重示例代码

    http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...

  5. 一次U盘拯救的经历

    U盘拷资料,突然就弹出框框,复制终止了,然后U盘里面的只是编程可读的了. 倒是没有啥重要的资料,就是只有这一个U盘了,平时传资料都靠它,不能就这么垮了啊,于是就来了一次拯救行动. 一共有三个步骤 第一 ...

  6. DataTables 自定义

    自定义取的参数方法 getQueryCondition = function(data) { var param = {}; ]) { param.order =data.columns[data.o ...

  7. 剑指offer六:反转链表

    输入一个链表,反转链表后,输出链表的所有元素 public class ListNode { int val; ListNode next = null; ListNode(int val) { th ...

  8. iOS - Push 通知推送

    1.UserNotifications 通知是 App 用来和用户交流的一种方式,特别是当 App 并没有在前台运行的时候.通知,正如它的名称所强调的,被用作向用户'通知'一个事件,或者仅仅向用户提示 ...

  9. static 作用

    静态,定义静态变量或者静态函数的时候使用该关键字. 被定义为static的函数,可以不需要new一个新类别而直接调用 比如Math类里有一个,public static sub()方法,那么你可以直接 ...

  10. Hadoop在eclipse中的配置

    在安装完linux下的hadoop框架,实现完所现有的wordCount程序,能够完美输出结果之后,我们开始来搭建在window下的eclipse的环境,进行相关程序的编写. 在网上有很多未编译版本, ...