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

Linux设备驱动中的ioctl的更多相关文章

  1. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  2. 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O

    今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...

  3. Linux设备驱动中的阻塞和非阻塞I/O <转载>

    Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O   [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...

  4. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

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

  5. Linux设备驱动中的软件架构思想

    目录 更新记录 一.Linux驱动的软件架构 1.1 出发点 1.2 分离思想 1.3 分层思想 二.platform设备驱动 2.1 platform设备 2.2 platform驱动 2.3 pl ...

  6. Linux设备驱动中的异步通知与异步I/O

    异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...

  7. Linux设备驱动中的并发控制

    1.并发是指多个执行单元同时.并行的执行.并发的执行单元对共享资源的访问很容易导致竞态. 在 Linux 内核中,主要的竞态发生于如下几种情况: ①对称多处理器(SMP)的多个 CPU ②单CPU内进 ...

  8. 蜕变成蝶~Linux设备驱动中的并发控制

    并发和竞争发生在两类体系中: 对称多处理器(SMP)的多个CPU 内核可抢占的单CPU系统 访问共享资源的代码区域称为临界区(critical sections),临界区需要以某种互斥机制加以保护.在 ...

  9. linux设备驱动中的并发控制【转】

    转自:http://www.cnblogs.com/plinx/archive/2013/01/28/2873121.html 在linux内核中,主要的静态发生于以下几种情况: 1.对称多处理器(S ...

随机推荐

  1. 关于 firefox 无法在 passport.csdn.net 找到该服务器

    很奇怪的现象:用firefox上网,某些网站打开总是会提示 无法在XXX找到该服务器.但是使用其他浏览器,比如360却可以正常打开. 我已经将firefox加入了防火墙的信任列表,但是仍旧是这样. 而 ...

  2. 复习知识点:TabBarViewController(微信框架)

    TabBarViewController:标签视图控制器 在application设置 创建四个视图控制器 引入视图控制器头文件 #import "AppDelegate.h" # ...

  3. c/c++内存分配方式(转)

    原文链接:http://blog.csdn.net/jing0611/article/details/4030237 1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在 程序编译 ...

  4. javascript学习(10)——[知识储备]链式调用

    上次我们简单的说了下单例的用法,这个也是在我们java中比较常见的设计模式. 今天简单说下链式调用,可能有很多人并没有听过链式调用,但是其实只要我简单的说下的话,你肯定基本上都在用,大家熟知的jQue ...

  5. [javascript]一种兼容性比较好的简单拖拽

    作为一个马上要找工作.非计算机专业.热爱前端的大四狗,最近开始疯狂写demo.看书,准备九.十月份的校招. 晚上用js实现了一个比较简单(low)的拖拽效果,初步测试兼容性还是不错的,于是写一段小博文 ...

  6. 10个值得我们关注的python博客

    大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...

  7. Base64编码的java实现

    Java本身是提供了Base64编码的工具包的,做项目的时候自己实现了个,在这里记录一下: /** Base64编码数组 */ private static final String base64En ...

  8. web前端如何让网页布局稳定性和标准性?

    刚开始学css+div布局的同学们,都比较困惑和难写的就是兼容性的问题了,特别是ie6等低版本的浏览器,随意国内逐步慢慢消失取代,但是现阶段还是会有点考虑因素再里面.我们写的网页布局怎么样才是合理的, ...

  9. c++ - Create empty json array with jsoncpp - Stack Overflow

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     multiprocessing.pool c++ - Create empty json array wit ...

  10. 金融管理 - MBA智库百科

    金融管理 - MBA智库百科     金融管理    出自 MBA智库百科(http://wiki.mbalib.com/)     金融管理(Financial Management)    目录  ...