编写一个虚拟字符设备驱动程序char.c,

  1. 以内核模块的形式插入内核,编译方法与内核编译方法一致。
  2. 创建设备节点,然后通过编写一个测试程序,
  3. 功能:首先向设备中写入数据,再从设备中读出数据,并把数据显示在屏幕上。

4. 要求:设备名为:demo,主设务号为250,次设备号为0。

1、首先,要确保环境已经安装好了

开始写

写三个文件

char.c

Makefile    ps:M必须大写

test.c   用于测试

vi char.c
vi Makefile
vi test.c

这三个文件的具体代码我放在文末

写好了之后执行make命令

make

然后加载驱动程序

sudo insmod char.ko
lsmod //查看是否加载成功

必须使用管理员权限

在dev目录下创建设备文件

sudo mknod /dev/mychar c 250 0
//要使用管理员权限
//1. 命令中的数字要和驱动程序定义的major,minor保持一致。
//2. Mychar文件名与测试程序 中的名字一致

编译运行测试程序

gcc test.c -o test
sudo ./test

char.c代码

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<asm/ioctl.h>
#include<asm/io.h>
#include<asm/uaccess.h>MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Bob Geng");
MODULE_DESCRIPTION("a simple driver");#define N    128int major  = 250;
int minor  = 0;
struct cdev mycdev;    //字符型结构体char buf[N] ={"hello world !!"};
int char_open (struct inode * myinode, struct file *fp)
{printk("char is opened\n");return 0;
}
int char_release (struct inode *myinode, struct file *fp)
{printk("char is closeed\n");return 0;
}static ssize_t char_read (struct file *filep, char __user *user_buf, size_t count, loff_t * off)
{  // 1. ssize_t :ssize_t是signed size_t;size_t: unsigned int
//2. Off:当前文件的偏移量ssize_t ret =0;long num =0;printk("char_read is called\n");printk("count is %d\n",count);num = copy_to_user(user_buf,buf,count);if(num < 0 ){printk("copy_to_user is failed\n");return ret;}return ret;
}ssize_t char_write (struct file *filep, const char __user *from, size_t count, loff_t *off)
{ssize_t ret =0; long num =0;printk("char_write is called \n");printk("count is %d\n",count);//   if(count > N )  return -ENOMEM;if(count > N )   count = N ;num = copy_from_user(buf,from,count);if(num < 0 ){printk("copy_to_user is failed\n");return ret;}printk("from  user is  %s\n",buf);return ret;
}
struct file_operations fops={.owner = THIS_MODULE,.open  = char_open,.release = char_release,   .read  = char_read, .write  = char_write,
};
static int __init char_init(void)
{int ret;dev_t devno = MKDEV(major,minor);ret = register_chrdev_region(devno,1,"char");  //静态申请设备号if(ret < 0 ){printk("fail to get devno\n");return ret;}mycdev.owner = THIS_MODULE;cdev_init(&mycdev,&fops);ret = cdev_add(&mycdev,devno,1);if(ret < 0 ){printk("cdev_add fail to system\n");return ret;}printk("init_module\n");return 0;
}static void __exit char_exit(void)
{dev_t devno = MKDEV(major,minor);cdev_del(&mycdev);unregister_chrdev_region(devno, 1);printk("cleanup_module\n");
}module_init(char_init);
module_exit(char_exit);

Makefile代码

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
#KERNELDIR ?= /home/linux/workdir/source-pack/linux-3.2-net/ (交叉编译)
M=$(PWD) modules
PWD := $(shell pwd)
modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
.PHONY: modules modules_install clean
else
obj-m :=char.o
endif

test.c代码

#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <string.h>#define   N   128
char buf[N] ;
int main()
{int fd;if (  (fd = open("/dev/mychar",O_RDWR)) <  0){perror("open");exit(-1);}if(read(fd,buf,N ) < 0 ){perror("read");exit(-1);}printf("read from mychar is %s\n",buf);// memset(buf,0,sizeof(buf));//strcpy(buf,"goddbye\0");printf("please input second buf:\n");scanf("%s",buf);if(write(fd,buf,N+1) < 0){perror("write");exit(-1);}if(read(fd,buf,N ) < 0 ){perror("read");exit(-1);}printf("second read from mychar is %s\n",buf);getchar();printf("mychar is opened\n");close(fd);
}

Linux---字符设备驱动程序设计相关推荐

  1. Linux USB设备驱动程序设计 和 USB下载线驱动设计

    Linux USB设备驱动程序设计 和 USB下载线驱动设计 USB设备驱动模型 USB设备包括配置(configuration).接口(interface)和端点(endpoint),一个USB设备 ...

  2. ()shi linux字符设备,Linux字符设备驱动基础(三)

    Linux字符设备驱动基础(三) 6 创建设备节点 6.1 手动创建设备节点 查看申请的设备名及主设备号: cat /proc/devices # cat /proc/devices Characte ...

  3. linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说

    一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...

  4. linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化

    因为Linux字符设备驱动主要依赖于struct cdev结构,原型为: 所以我们需要对所使用到的结构成员进行配置,驱动开发所使用到的结构成员分别为:[unsigned int count;].[de ...

  5. linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点

    嵌入式Linux字符设备驱动开发流程--以LED为例 前言 留空 头文件 #include 查看系统设备类 ls /sys/class 设备类结构体 文件(路径):include/linux/devi ...

  6. linux字符设备驱动的 ioctl 幻数

    在Linux字符设备驱动入门(一)中,我们实现了字符设备的简单读写字符功能,接下来我们要在这个基础上加入ioctl功能.首先,我们先来看看3.0内核下../include/linux/fs.h中fil ...

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

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

  8. linux字符设备驱动在哪里设置,从点一个灯开始学写Linux字符设备驱动!

    原标题:从点一个灯开始学写Linux字符设备驱动! [导读] 前一篇文章,介绍了如何将一个hello word模块编译进内核或者编译为动态加载内核模块,本篇来介绍一下如何利用Linux驱动模型来完成一 ...

  9. Linux字符设备驱动

    /*Linux字符设备驱动源代码scdd.c*/ #include <linux/init.h>   /*模块头文件*/ #include <linux/module.h> # ...

  10. Linux字符设备驱动中container_of宏的作用

    Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...

最新文章

  1. FZ35恒流电子负载检测测试
  2. linux系统命令基础知识
  3. 一款基于jquery带百分比的响应式进度加载条
  4. 如何通过代码获得当前SAP Spartacus Component渲染所基于的slot名称
  5. [转]npm生成的package.json文件中依赖项版本号前的波浪号(~)和插入符号(^)是啥意思?
  6. Java HashSet的实现原理详解
  7. echart 导出保存图片
  8. 苹果高通虽已和解 但5G iPhone最快仍要明年才能推出
  9. 可视化排班管理_企业人事资源管理系统
  10. 外贸常见的付款方式你了解吗?
  11. ExactScan pro for mac(万能扫描仪整合工具)
  12. java截取字符串的几种方法的总结,欢迎提出问题
  13. 《女神异闻录5》那套酷炫界面的背后,是18年来的始终如一
  14. 关于AS5 SSH支持key认证的完全解决方案
  15. Java SimpleDateFormat用法
  16. js -- 打开新窗口(window.open)、关闭窗口(window.close)
  17. I-deas TMG 基础培训教程 - 小例题 (7)
  18. 第四章第十三题(判断元音还是辅音)(Vowel or consonant?)
  19. 计算机图形学和工程图学,计算机图形学与印刷工程我与工程图学及计算机图形学...
  20. 研磨设计模式之装饰模式-3

热门文章

  1. Centos7网络配置
  2. 【Remoting-4】
  3. 爱不意味这“sorry”
  4. exchange2010 DAG备份
  5. silverlight 学习笔记 (八):Prism中MEF的初步认识
  6. Lync部署学习笔记(一)
  7. mysql中to_char()和str_to_date()函数
  8. 前端页面加载速度优化---Ngnix之GZIP压缩
  9. 《C++面向对象高效编程(第2版)》——4.5 对象复制的语义
  10. WebLogic(12C)——windows下安装教程