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

 #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. openGL 环境配置

    1.(glfw) 参考地址:http://www.cnblogs.com/be2n2me/p/3701338.html 在Mac OS X EI Capitan上sudo make install时遇 ...

  2. 文档对象模型(DOM)中的结点属性

    在文档对象模型中,每个结点都是一个对象.DOM结点有三个重要的属性:nodeName .nodeValue和nodeType,分别表示结点名称.结点的值和结点的类型 一.nodeName,结点名称,只 ...

  3. 【前端】iterable类型的 forEach方法

    看三个例子: a = [ age: 1 , age: 2 ] a.forEach (item) -> item.age = 0 # 有效 console.log a # [ # age: 0 # ...

  4. 创建XMLHttpRequest对象

    创建XMLHttpRequest对象 XMLHttpRequest对象: 用于在后台与服务器交换数据,可以在不重新加载整个页面的情况下,对页面的部分内容进行更新. 创建XMLHttpRequest对象 ...

  5. Apache配置文件讲解

        持续作用扩展自 HTTP/1.0 和 HTTP/1.1 的长连接特性.提供了长效的 HTTP 会话,用以在同 一个 TCP 连接中进行多次请求. 在某些情况下, 这样的方式会对包含大量图片的 ...

  6. 常用open api

    SNS类网站API Facebook - http://developers.facebook.com/ 人人网开放平台 - http://dev.renren.com/ 51.com开放平台 - h ...

  7. mysql中更新或者删除语句中子语句不能操作同一个表You can't specify target table 'test' for update in FROM clause

    问题描述:有个数据表test,有个字段value,如下 mysql> select * from test;+----+------------------------------------+ ...

  8. 微信小程序-视图事件

    事件 什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如 ...

  9. 非root用户安装软件

    下面简要说一下Linux下非root用户安装软件的一般流程: 1. 获取源代码,一般是wget方式,ubuntu可以使用apt-get source来获取源代码. 2. 解压源代码,一般使用tar - ...

  10. Fair Scheduler 队列设置经验总结

    Fair Scheduler 队列设置经验总结 由于公司的hadoop集群的计算资源不是很充足,需要开启yarn资源队列的资源抢占.在使用过程中,才明白资源抢占的一些特点.在这里总结一下. 只有一个队 ...