/*参考drivers/block/xd.c
*以及drivers/block/z2ram.c
*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/genhd.h>
#include <linux/hdreg.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/wait.h>
#include <linux/blkdev.h>
#include <linux/mutex.h>
#include <linux/blkpg.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/gfp.h> #include <asm/uaccess.h>
#include <asm/dma.h> static struct gendisk *ramblock_disk;
static struct request_queue *ramblock_queue;
static DEFINE_SPINLOCK(ramblock_lock); #define RAMBLOCKSIZE (1024*1024)
static int major;
static unsigned char *ramblock; static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{ geo->heads = ;
geo->sectors = ;
geo->cylinders = RAMBLOCKSIZE///;
return ;
} static const struct block_device_operations ramblock_fops = {
.owner = THIS_MODULE,
.getgeo = ramblock_getgeo,
}; static void do_ramblock_request (struct request_queue * q)
{
static int cnt = ;
struct request *req; printk("do_ramblock_request %d : \n",++cnt);
req = blk_fetch_request(q);
while(req){
unsigned long start = blk_rq_pos(req) << ; //源
unsigned long len = blk_rq_cur_bytes(req); //长度
/*目的:req->buffer*/
if (rq_data_dir(req) == READ)
memcpy(req->buffer, ramblock+start, len);
else
memcpy(ramblock+start, req->buffer, len); if (!__blk_end_request_cur(req, ))
req = blk_fetch_request(q);
}
} static int ramblock_init(void)
{
ramblock_disk = alloc_disk(); //次设备号个数,分区数+1 ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock); major = register_blkdev(, "ramblock"); // /dev/ramblock ramblock_disk->major = major;
ramblock_disk->first_minor = ;
sprintf(ramblock_disk->disk_name, "ramblock");
ramblock_disk->fops = &ramblock_fops;
ramblock_disk->queue = ramblock_queue;
set_capacity(ramblock_disk, RAMBLOCKSIZE/); //设置容量,以扇区512字节为单位 ramblock = kzalloc(RAMBLOCKSIZE,GFP_KERNEL);
if(ramblock == NULL){
printk("alloc ramblock failed!\n");
return -;
}
add_disk(ramblock_disk);
return ;
} static void ramblock_exit(void)
{
del_gendisk(ramblock_disk);
unregister_blkdev(major,"ramblock");
blk_cleanup_queue(ramblock_queue);
put_disk(ramblock_disk);
kfree(ramblock);
} module_init(ramblock_init);
module_exit(ramblock_exit); MODULE_LICENSE("GPL");
MODULE_AUTHOR("1653699780@qq.com");

linux3.4.2之块设备驱动完整程序的更多相关文章

  1. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  2. FLASH驱动之-块设备驱动系统构架

    一.  块设备是只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍,常见的块设备包括硬件,SD卡,光盘,flash等.驱动程序是块的整数倍从设备读写得到数据.块设备的最小访单位为块,不同 ...

  3. Linux 块设备驱动 (一)

    1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...

  4. linux下的块设备驱动(二)

    上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...

  5. Linux块设备驱动(一) _驱动模型

    块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...

  6. Linux块设备驱动(二) _MTD驱动及其用户空间编程

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  7. 【转】 bio 与块设备驱动

    原文地址: bio 与块设备驱动      系统中能够随机访问固定大小数据片(chunk)的设备被称作块设备,这些数据片就称作块.块设备文件都是以安装文件系统的方式使用,此也是块设备通常的访问方式.块 ...

  8. 乾坤合一~Linux设备驱动之块设备驱动

    1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...

  9. linux块设备驱动

    块设备驱动程序<1>.块设备和字符设备的区别1.读取数据的单元不同,块设备读写数据的基本单元是块,字符设备的基本单元是字节.2.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...

随机推荐

  1. linux定时备份MySQL数据库并删除七天前的备份文件

    1.创建备份文件夹 #cd /bak#mkdir mysqldata 2.编写运行脚本 #nano -w /usr/sbin/bakmysql.sh 注:如使用nano编辑此代码需在每行尾添加’&am ...

  2. IT装B小技巧

    1.编写简单的关机脚本 新建一个文本文档,将代码复制上去,将后缀改成bat,双击运行 @echo off shutdown -s -t 2.语音播报 新建一个文本文档,将代码复制上去,将后缀改成vbs ...

  3. Web API 2 入门——使用Web API与ASP.NET Web窗体(谷歌翻译)

    在这篇文章中 概观 创建Web窗体项目 创建模型和控制器 添加路由信息 添加客户端AJAX 作者:Mike Wasson 虽然ASP.NET Web API与ASP.NET MVC打包在一起,但很容易 ...

  4. QTimer掉坑出坑过程

    最近遇到一个问题,就是关于QTimer设置了10ms,结果不生效,很头疼啊,查了快一天了,终于知道为什么了? 先说下QTimer的使用方法: m_delayHideTimer这是QTimer的对象. ...

  5. 通过CXF,开发rest协议接口

    1. 引入cxf的jar包 pom文件里面直接增加依赖 < dependency> <groupId > junit</ groupId> <artifact ...

  6. June 21st 2017 Week 25th Wednesday

    Discontent is the first step in progress. 不知足是前进中的第一步. Several days ago, I wrote down a quote which ...

  7. February 19 2017 Week 8 Sunday

    We accept the love we think we deserve. 我们接受自己认为配得上的爱. A few months ago, I tried to date with a girl ...

  8. plus.webview.create mui.openWindow区别是什么呢

      create 只是创建这个webview,但是不显示,而且同一个页面.同一个id你甚至能重复创建多个(严重消耗性能,作死...),其实mui里面已经封装了这个方法 mui.preload(),并且 ...

  9. Java 中的引用

    JVM 是根据可达性分析算法找出需要回收的对象,判断对象的存活状态都和引用有关. 在 JDK1.2 之前这点设计的非常简单:一个对象的状态只有引用和没被引用两种区别. 这样的划分对垃圾回收不是很友好, ...

  10. [19/04/05-星期五] 多线程_Thread(线程、线条)、基本术语

    一.基本概念 多线程是Java语言的重要特性,大量应用于网络编程.服务器端程序的开发,最常见的UI界面底层原理.操作系统底层原理都大量使用了多线程. 我们可以流畅的点击软件或者游戏中的各种按钮,其实, ...