本文介绍Linux字符设备的静态注册方法,
其中涉及到的模块加载,不了解的可以先参考


1. 还是线上源代码:



//memdev.h

#ifndef _MEMDEV_H_

#define _MEMDEV_H_

 

#ifndef MEMDEV_MAJOR

#

#endif

 

#ifndef MEMDEV_NR_DEVS

#

#endif

 

#ifndef MEMDEV_SIZE

#

#endif

 

struct mem_dev{

    char* data;

    unsigned
long size;

 

};

 

#endif
 

//memdev.c  

# include
< linux / module.h
>

# include
< linux / types.h
>

# include
< linux / fs.h
>

# include
< linux / errno.h
>

# include
< linux / mm.h
>

# include
< linux / sched.h
>

# include
< linux / init.h
>

# include
< linux / cdev.h
>

# include
< asm
/ io.h >

# include
< asm
/ system.h >

# include
< asm
/ uaccess.h >

# include
< linux / wait.h
>

# include
< linux / completion.h
>

 

# include
"memdev.h"

 

MODULE_LICENSE( "Dual BSD/GPL" );

 

static
int   mem_major = MEMDEV_MAJOR;

 

struct mem_dev
* mem_devp; /*设备结构体指针*/

 

struct cdev cdev;

 

/*文件打开函数*/

int mem_open(
struct inode * inode,
struct file * filp)

{

printk( "open own file\n" );

      ;

}

 

/*文件操作结构体*/

static
const struct file_operations mem_fops=

{

  .owner = THIS_MODULE,

  .open = mem_open,

};

 

/*设备驱动模块加载函数*/

static
int memdev_init( void )

{

   int result;

   int i;

 

  dev_t devno );

 

   /* 静态申请设备号*/

    result , "memdev" );

   if (result
< )

     return result;

 

   /*初始化cdev结构*/

  cdev_init( & cdev,
& mem_fops);

 

   /* 注册字符设备 */

  cdev_add( ), MEMDEV_NR_DEVS);

 

   return result;

}

 

/*模块卸载函数*/

static
void memdev_exit( void )

{

  cdev_del( & cdev);    /*注销设备*/

  unregister_chrdev_region(MKDEV(mem_major, ), );
/*释放设备号*/

}

 

module_init(memdev_init);

module_exit(memdev_exit);
 

#Makefile

ifneq ($(KERNELRELEASE),)

    obj-m := memdev.o

else

    KERNELDIR ?=/lib/modules/$(shell uname-r)/build

    PWD = $(shell pwd)

default:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:

    rm memdev.mod*  module* memdev.o memdev.ko Module.*

endif

 
 
2. 测试
    首先先make下,生成memdev.ko
    然后insmod memdev.ko生成memdev模块
    创建设备节点:sudo mknod /dev/memdev_t c 200 0
    接下开使用设备文件
    下面是一个测试程序



  // memusr.c

#include
<stdio.h>

#include
<string.h>

 

int main()

{

    FILE *fp0;

    /*打开设备文件*/

    fp0 = fopen("/dev/memdev_t","r+");

    if (fp0
== NULL) {

        printf("Open Memdev0 Error!\n");

        return
-;

    }

}

 

 

 

 

 

 
编译运行,然后使用dmesg可以看到日志文件里输出
[38439.741816] Hello World!
[38657.654345] Goodbye
[40393.039520] open own file
 
记得要使用sudo 运行memusr   否则会显示设备打开失败。
 

Linux设备驱动——简单的字符驱动的更多相关文章

  1. linux驱动初探之字符驱动

    关键字:字符驱动.动态生成设备节点.helloworld linux驱动编程,个人觉得第一件事就是配置好平台文件,这里以字符设备,也就是传说中的helloworld为例~ 此驱动程序基于linux3. ...

  2. Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】

    转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...

  3. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  4. MPU6050带字符驱动的i2c从设备驱动1

    开干: 1.闲言碎语 这个驱动,越写觉的越简单,入门难,入门之后感觉还好.Linux开发还是比较友好的. 2.编写MPU6050带字符驱动的i2c从设备驱动 要实现的功能就是,将MPU6050作为字符 ...

  5. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl 0. 导语 在嵌入式的道路上寻寻觅觅很久,进入嵌入式这个行业也有几年的时间了,从2011年后 ...

  6. linux设备驱动第二篇:构造和运行模块

      上一篇介绍了Linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输 ...

  7. 【转】linux设备驱动程序之简单字符设备驱动

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用 ...

  8. linux设备驱动第三篇:如何实现一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  9. linux设备驱动第三篇:如何写一个简单的字符设备驱动?

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

随机推荐

  1. 深入探讨JS中的数组排序函数sort()和reverse()

    最近在研究Javascript发现了其中一些比较灵异的事情.有点让人感到无语比如: alert(typeof( NaN == NaN));//结果为假. alert(typeof( NaN != Na ...

  2. CF1157D N Problems During K Days(简单构造)

    题目 题目 原数据是水成啥样了,\(<\longrightarrow <=,>=\longrightarrow <=,\)这也能过 被\(hack\)后身败名裂 做法 简单的贪 ...

  3. 20145231熊梓宏 《网络对抗》 实验9 Web安全基础实践

    20145231熊梓宏 <网络对抗> 实验9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? •SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面 ...

  4. Socket 是嘛玩意儿(简单聊聊)

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  5. localAddress

    $(function(){ <% out.println("/** ip:"+request.getLocalAddr()+"("+request.get ...

  6. Shell学习小结 - 深入认识变量

    移动端访问不佳,请访问我的个人博客 变量的命名 对于初学者来说,可以简单的理解为,变量就是保存在计算机内存中的一系列的键值对. 列如: str="hello" 这里的str就是变量 ...

  7. 转:MySQL 的show processlist

    processlist 命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1.        进入 mysql/bin 目录下输入 mysqladmin p ...

  8. 在centos 6.9下Protocol Buffers数据传输及存储协议的使用(python)

    我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...

  9. close与shutdown系统调用

    使用多线程时,pthread_create的参数flag有CLONE_FILES, 最终调用do_fork(),并且会根据CLONE_FILES标志来调用copy_files()来共享父进程中的文件描 ...

  10. 数据库的ACID特性详解

    ACID是指在 数据库管理系统(DBMS)中事物所具有的四个特性:原子性.一致性.隔离性.持久性 事物:在数据库系统中,一个事务是指由一系列连续的数据库操作组成的一个完整的逻辑过程.这组操作执行前后, ...