/*参考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 ->> UBuntu 14.04 LTE下安装Hadoop 1.2.1(集群分布式模式)

    安装步骤: 1) JDK -- Hadoop是用Java写的,不安装Java虚拟机怎么运行Hadoop的程序: 2)创建专门用于运行和执行hadoop任务(比如map和reduce任务)的linux用 ...

  2. leetcode-Maximum Product Subarray-ZZ

    http://blog.csdn.net/v_july_v/article/details/8701148 假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max来表示以a结尾的 ...

  3. devexpress chart 散点图加载并分组显示(可以自定义颜色 同组中的点颜色相同)

    this.dChart.Diagram.Series.Clear();//清空图的内容 var groups = result.GroupBy(itm => itm["flag&quo ...

  4. Google Colab 免费的谷歌GPU for deep learning

    Who wants to use a free GPU for deep learning?Google Colab is a free cloud service and now it suppor ...

  5. Jenkins在deploy maven artifact时报Peer not authenticated.

    这是一起由Nexus证书导入错误造成的Jenkins运行异常. 最近,同事修改了Nexus服务器的host name,结果导致Jenkins里的任务全都执行不了了.虽然job的配置都已经更新指向新的N ...

  6. JAVA中commons-collections-3.2.1.jar包是干什么用的?

    类似C++中的Boost库,对Java容器类型和算法的补充

  7. PhoneGap 的消息推送插件JPush极光推送

    一. 什么是极光推送 极光推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动, 从而有效地提高留存率,提升用户体验.平台提供整合了 Android 推送.iOS 推送的统一推 ...

  8. 四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码安装)

    1.在Linux中创建用户mysql和主目录,并创建密码 2.解压缩tar.gz并拷贝到/usr/local/mysql目录下面 3.把/usr/local/mysql文件夹拥有者改为mysql 进入 ...

  9. PHP使用in_array函数检查数组中是否存在某个值

    PHP使用 in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE. bool in_array( mixed needle, array array [ ...

  10. Java: System.exit() 与安全策略

    说明 System.exit() 的本质是通知 JVM 关闭. 一般来说,有两种禁用 System.exit() 的办法: 安全管理器 安全策略 本质都是JRE 提供的本地实现,在执行之前进行权限判断 ...