Linux设备驱动中的ioctl
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相关推荐
- linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...
- Linux设备驱动中的并发控制总结
并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions). SMP是一 ...
- linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)
本章导读 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态). Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 7.1讲解了并 ...
- Linux设备驱动开发详解:第7章 Linux设备驱动中的并发控制
7.1并发与竞态 (1).竞态的发生场景:CPU0的进程与CPU1的进程之间.CPU0的中断与CPU1的进程之间.CPU0的中断与CPU1的中断之间: (2).解决竞态问题的途径是保证对共享资源的互斥 ...
- linux write引起进程挂起,Linux设备驱动中的阻塞与非阻塞总结
Linux设备驱动中的阻塞与非阻塞总结 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作. 非阻塞操作的进程在不能进行设备操作时,并不挂起.被挂起的进程进入sl ...
- Linux设备驱动中的阻塞和非阻塞IO
这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞. 阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取. 非阻塞:非阻塞是在不能获取设备资源时 ...
- Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O
在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程--网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...
- Linux设备驱动中的阻塞与非阻塞I/O
阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式 本例子讲述了这两者的区别 并实现I/O的等待队列机制, 并进行了用户空间的验证 基本概念: 1> ...
- Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O
阻塞和非阻塞访问.poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了. 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态 ...
最新文章
- 利用spring aop统一处理异常和打日志
- 电脑图标有阴影如何去除
- hdu2102 水搜索
- python祝福祖国代码_国庆节踩空间留言代码_国庆节祝福正在加载中
- java线程——信号量(Semaphore)+障栅(CyclicBarrier)
- tensorflow之saver
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- centos6 下安装xfce+vnc
- paip.python错误解决22
- 关于FND_PROFILE与FND_GLOBLE[Z]
- C语言pthread.h运用
- SWFObject参数
- 重庆邮电大学 计算机学院导师,宋秀丽_重庆邮电大学研究生导师信息
- 解决win10使用电池时自动调节亮度问题
- 微信硬件平台蓝牙打印机
- 浅谈 什么是封装、继承与多态?
- 华为网管地址配置实验
- C语言练习题(n个自然数的立方和)
- 常见的登陆注册原型模板,墨刀都为你准备好了(直接使用)
- 同一局域网下两台电脑传文件
热门文章
- InnoDB行格式(compact,redundant)对照
- java上机练习01
- 多面体体积 matlab,matlab计算多面体体积实现代码
- Matlab如何从dat或者txt文件读入数据
- I/O映射和内存映射
- ipython中matplotlib无法显示图片Could not connect to any x display
- linux基础(day22)
- c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组...
- c++中的函数模版和类模版
- Notes客户端重新配置批处理