memdev.h

#ifndef _MEMDEV_H
#define _MEMDEV_H#define MEM_MAGIC 'm'
#define MEM_RESTART _IO(MEM_MAGIC, 0)//使用内核提供的宏产生命令,
#define MEM_SET     _IOW(MEM_MAGIC, 1, int)//改命令向内核传递一个整形的參数#endif

驱动程序memdev.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include "memdev.h"struct cdev mdev;
dev_t devno;static long mem_ioctl(struct file* filp, unsigned int cmd, unsigned long arg)
{switch(cmd){case MEM_RESTART:printk("memdev restart.\n");break;case MEM_SET:printk("arg is %ld\n", arg);//将用户传递下来的參数打印出来看是否一致break;default:return -EINVAL;break;}return 0;
}struct file_operations memfops = {.llseek = mem_lseek,.unlocked_ioctl = mem_ioctl,//在2.6.36之前内核中为ioctl,2.6.36之后为unlocked_ioctl,函数參数也有变化
};static __init int memdev_init(void)
{cdev_init(&mdev, &memfops);alloc_chrdev_region(&devno, 0, 2, "memdev");cdev_add(&mdev, devno, 2);printk("memdev_init success\n");return 0;
}static void __exit memdev_exit(void)
{cdev_del(&mdev);unregister_chrdev_region(devno, 2);printk("memdev_exit success\n");
}module_init(memdev_init);
module_exit(memdev_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("liuwei");
MODULE_DESCRIPTION("char driver");

应用程序mem_read.c

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "memdev.h"int main(int argc, char *argv[])
{int fd = open("/dev/memdev", O_RDWR);if (fd ==  -1){perror("open");return -1;}ioctl(fd, MEM_RESTART);//发送两个控制命令。一个不带參数。一个带一个整形的參数ioctl(fd, MEM_SET, 10);close(fd);return 0;
}

驱动程序中动态分配设备号,通过cat /proc/devices 查看系统为memdev分配的设备号。

使用命令mknod /dev/memdev c 252 0创建设备节点。

当中252系统分配的设备号。

驱动简单的Makefile

ifeq ($(KERNELRELEASE),)PWD := $(shell pwd)
KERNELDIR ?

= /home/farsight/samba/linux-2.6.36 INSTALLDIR ?

= /nfs/rootnfs/ modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules install: cp *.ko /nfs/rootnfs/ clean: rm -rf *.o *.ko *.mod.c .*.cmd modules.order Module.symvers .tmp_versions else obj-m := memdev.o endif

转载于:https://www.cnblogs.com/blfshiye/p/5094299.html

Linux设备驱动中的ioctl相关推荐

  1. linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O

    今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...

  2. Linux设备驱动中的并发控制总结

    并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions).   SMP是一 ...

  3. linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)

    本章导读 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态). Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 7.1讲解了并 ...

  4. Linux设备驱动开发详解:第7章 Linux设备驱动中的并发控制

    7.1并发与竞态 (1).竞态的发生场景:CPU0的进程与CPU1的进程之间.CPU0的中断与CPU1的进程之间.CPU0的中断与CPU1的中断之间: (2).解决竞态问题的途径是保证对共享资源的互斥 ...

  5. linux write引起进程挂起,Linux设备驱动中的阻塞与非阻塞总结

    Linux设备驱动中的阻塞与非阻塞总结 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作. 非阻塞操作的进程在不能进行设备操作时,并不挂起.被挂起的进程进入sl ...

  6. Linux设备驱动中的阻塞和非阻塞IO

    这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞. 阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取. 非阻塞:非阻塞是在不能获取设备资源时 ...

  7. Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程--网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  8. Linux设备驱动中的阻塞与非阻塞I/O

    阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式 本例子讲述了这两者的区别 并实现I/O的等待队列机制, 并进行了用户空间的验证 基本概念: 1> ...

  9. Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

    阻塞和非阻塞访问.poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了. 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态 ...

最新文章

  1. 利用spring aop统一处理异常和打日志
  2. 电脑图标有阴影如何去除
  3. hdu2102 水搜索
  4. python祝福祖国代码_国庆节踩空间留言代码_国庆节祝福正在加载中
  5. java线程——信号量(Semaphore)+障栅(CyclicBarrier)
  6. tensorflow之saver
  7. 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
  8. centos6 下安装xfce+vnc
  9. paip.python错误解决22
  10. 关于FND_PROFILE与FND_GLOBLE[Z]
  11. C语言pthread.h运用
  12. SWFObject参数
  13. 重庆邮电大学 计算机学院导师,宋秀丽_重庆邮电大学研究生导师信息
  14. 解决win10使用电池时自动调节亮度问题
  15. 微信硬件平台蓝牙打印机
  16. 浅谈 什么是封装、继承与多态?
  17. 华为网管地址配置实验
  18. C语言练习题(n个自然数的立方和)
  19. 常见的登陆注册原型模板,墨刀都为你准备好了(直接使用)
  20. 同一局域网下两台电脑传文件

热门文章

  1. InnoDB行格式(compact,redundant)对照
  2. java上机练习01
  3. 多面体体积 matlab,matlab计算多面体体积实现代码
  4. Matlab如何从dat或者txt文件读入数据
  5. I/O映射和内存映射
  6. ipython中matplotlib无法显示图片Could not connect to any x display
  7. linux基础(day22)
  8. c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组...
  9. c++中的函数模版和类模版
  10. Notes客户端重新配置批处理