学习Linux的累计时间已经有两年多了,工作关系,学习的过程总是断断续续的,现在整理一下,下面要分享的是一个简单的linux驱动程序,将内存当作一个虚拟的设备去读写,没有什么实际的用处,像hello wold!程序一样,我们简单体会一下linux驱动程序的特点,Linux设备驱动程序开发第三版是一本不错的参考书,讲的比较详细,值得入手,话不多说了,简单讲一下步骤:

1、我电脑上的Linux系统是Ubuntu14.04。

2、 新建一个duxie.c文件作为驱动程序源文件,一个ce.c作为应用层的测试程序,一个Makefile文件用来编译驱动程序产生*.ko文件。

3、下面贴出代码:

duxie.c 源代码如下:

/**************************************************************
    duxie.c  
    It can be compiled for x86 PC #include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h> /* printk() */
    author:
    date:  
***************************************************************/
 
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>   /* printk() */
 
#include <linux/errno.h>    /* error codes */
#include <linux/poll.h>    /* COPY_TO_USER */
 
 
#define DEVICE_NAME    "rwd"
 
static int rwdMajor = 0;
static int MAX_BUF_LEN=1024;
static char drv_buf[1024];
static int WRI_LENGTH=0;
 
 
 
/*************************************************************************************/
static ssize_t  dx_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
{  
    if(count > MAX_BUF_LEN)count = MAX_BUF_LEN;
    copy_from_user(drv_buf , buffer, count);
    WRI_LENGTH = count;
    printk("user write data to driver\n");
    return count;
}
/*************************************************************************************/
static ssize_t  dx_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos)
{
    if(count > MAX_BUF_LEN)
        count=MAX_BUF_LEN;
    copy_to_user(buffer, drv_buf,count);
    printk("user read data from driver\n");
    return count;
}
 
static int dx_open(struct inode *inode, struct file *filp)
{
    printk("device open sucess!\n");
    return 0;
}
/*************************************************************************************/
static int  dx_release(struct inode *inode, struct file *filp)
{
    printk("device release\n");
    return 0;
}
 
/*************************************************************************************/
static struct file_operations pxa270_fops = {
    owner:    THIS_MODULE,
    write:    dx_write,    
    read:    dx_read,    
    open:    dx_open,
    release:dx_release,
};
/*************************************************************************************/
 
static int __init dx_init(void)
{
 int ret;
        ret = register_chrdev(0, DEVICE_NAME, &pxa270_fops);
    if (ret < 0) {
        printk(DEVICE_NAME " can't get major number\n");
        return ret;
    }
    rwdMajor=ret;
 
    printk("dx module major number is %d\n", ret);
    return 0;
}
 
/*************************************************************************************/
 
void __exit  dx_exit(void)
{
  unregister_chrdev(rwdMajor, DEVICE_NAME);
}
module_exit(dx_exit);
module_init(dx_init);
MODULE_LICENSE("GPL");

Makefile的源代码如下:

ifneq ($(KERNELRELEASE),)
obj-m := duxie.o
else
KDIR := /usr/src/linux-headers-3.19.0-31-generic
all:make -C $(KDIR) M=$(PWD) modules
clean:rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*
endif

应用层的测试程序ce.c源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include<string.h>

void showbuf(char *buf);
int MAX_LEN=32;

int main()
{
    int fd;
    int i;
    char buf1[255];
    char buf2[255];
    
    printf("please input a string:\n");
    scanf("%s",buf1);
        MAX_LEN=strlen(buf1);

fd=open("/dev/rwd",O_RDWR);
    if(fd < 0){
        printf("####rwd  device open fail####\n");
        return (-1);
    }
    printf("write %d bytes data to /dev/rwd \n",MAX_LEN);
    printf("%s\n",buf1);

write(fd,buf1,MAX_LEN);

printf("Read %d bytes data from /dev/rwd \n",MAX_LEN);
    read(fd,buf2,MAX_LEN);
    printf("%s\n",buf2);
    
    close(fd);
    return 0;

}

具体实现的功能可以自己看一下。

4、 编译生成duxie.ko文件,用insmod duxie.ko加载驱动程序。

5、查看主设备号,可以用cat /proc/devices | grep rwd 查看主设备号。

6、该驱动程序需要手动注册,可以用mknod /dev/rwd 设备类型 主设备号 次设备号 (例如 mknod /dev/rwd c 248 0)来实现。

7,编译运行ce.c,输入一串字符串,输入什么就输出什么,这样就完成了整个驱动程序的编写、编译、安装及测试工作。

Linux 字符设备驱动开发--内存读写操作相关推荐

  1. Linux 字符设备驱动开发基础(一)—— 编写简单 LED 设备驱动

    现在,我们来编写自己第一个字符设备驱动 -- 点亮LED.(不完善,后面再完善) 硬件平台:Exynos4412(FS4412) 编写驱动分下面几步: a -- 查看原理图.数据手册,了解设备的操作方 ...

  2. Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析

    一.VFS 虚拟文件系统基础概念 Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在.虚拟文件系统,即VFS(Virtual File System)是 ...

  3. Linux 字符设备驱动开发基础(五)—— ioremap() 函数解析

    一. ioremap() 函数基础概念 几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同,CP ...

  4. Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动

    编写驱动的第一步仍是看原理图: 可以看到,该蜂鸣器由 GPD0_0 来控制 ,查手册可知该I/O口由Time0 来控制,找到相应的寄存器: a -- I/O口寄存器及地址 GPD0CON  0x114 ...

  5. Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析

    我们在前面讲到了file_operations,其是一个函数指针的集合,用于存放我们定义的用于操作设备的函数的指针,如果我们不定义,它默认保留为NULL.其中有最重要的几个函数,分别是open().r ...

  6. Linux 字符设备驱动开发基础(四)—— ioctl() 函数解析

    解析完 open.close.read.write 四个函数后,终于到我们的 ioctl() 函数了 一. 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通 ...

  7. Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析

    前面在 Linux 字符设备驱动开发基础 (三)-- 字符设备驱动结构(中) ,我们已经介绍了两种重要的数据结构 struct inode{...}与 struct file{...} ,下面来介绍另 ...

  8. Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析

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

  9. Linux 字符设备驱动结构(三)—— file、inode结构体及chardevs数组等相关知识解析

    前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 (一)-- 字符设备驱动结构(上)  下面继续学习字符设备另外几个重要的数据结构. 先看下面这张图,这是Linux 中虚拟文件系统. ...

最新文章

  1. 正点原子串口函数分析
  2. 新浪宣布2010年第四季度业绩 盘后跌4%
  3. Java实现BST搜索树
  4. 《scikit-learn》数据预处理与特征工程(三)特征选择
  5. linux shell基础(1)
  6. 密码学的发展(第五篇:量子加密)
  7. PAT甲级 1097
  8. 解决:WPS文字行末是英文单词时自动换行问题
  9. 帆软参数设置_报表工具FineReport新版本参数全攻略
  10. 天下足球十大感动台词
  11. Three.js 学习历程与总结
  12. cmake使用boost库
  13. 2015 Syrian Private Universities Collegiate Programming Contest
  14. 谈谈IBM布局的Bluemix和SoftLayer生态体系
  15. 现在学习python怎么样
  16. 程序员面试 10 大潜规则,千万不要踩坑!
  17. 【C语言题目】循环-约瑟夫环
  18. 敏捷开发团队 项目分工_如何为您的软件开发项目建立敏捷团队
  19. 指数增长问题--python
  20. windows下node版本管理

热门文章

  1. ros navigation 局部路径算法dwa解析(一)
  2. adb shell 修改文件名_教你三招快速文件批量重命名方法-linux修改文件名
  3. 第三次延迟披露财报?东芝:暂无计划
  4. 中国风国潮设计资源合集,这样的新国风实在太美了
  5. usb3.0cd-rom
  6. word中查看有多少个分隔符
  7. 充满科技感的词汇_科技展厅的定义
  8. 网吧Samba服务器和vsftpd服务器综合应用案例
  9. 微型计算机飞傲m9,千元级全功能覆盖的水桶机 飞傲M9评测
  10. TensorFlow 从入门到精通(11)—— DeepDream(上)