linux3.4.2之块设备驱动完整程序
/*参考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之块设备驱动完整程序的更多相关文章
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
- FLASH驱动之-块设备驱动系统构架
一. 块设备是只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍,常见的块设备包括硬件,SD卡,光盘,flash等.驱动程序是块的整数倍从设备读写得到数据.块设备的最小访单位为块,不同 ...
- Linux 块设备驱动 (一)
1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...
- linux下的块设备驱动(二)
上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...
- Linux块设备驱动(一) _驱动模型
块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...
- Linux块设备驱动(二) _MTD驱动及其用户空间编程
MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...
- 【转】 bio 与块设备驱动
原文地址: bio 与块设备驱动 系统中能够随机访问固定大小数据片(chunk)的设备被称作块设备,这些数据片就称作块.块设备文件都是以安装文件系统的方式使用,此也是块设备通常的访问方式.块 ...
- 乾坤合一~Linux设备驱动之块设备驱动
1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...
- linux块设备驱动
块设备驱动程序<1>.块设备和字符设备的区别1.读取数据的单元不同,块设备读写数据的基本单元是块,字符设备的基本单元是字节.2.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...
随机推荐
- Hadoop HA集群的搭建
HA 集群搭建的难度主要在于配置文件的编写, 心细,心细,心细! ha模式下,secondary namenode节点不存在... 集群部署节点角色的规划(7节点)------------------ ...
- 二、基于事件的异步编程模式(EAP)
一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进 ...
- SAP S/4HANA里如何创建Customer主数据以及执行后续处理
来自Jerry的同事Zhang Sean. 1, Launch tcode: BP and select the Organization 2, Maintain the information fo ...
- UVa 10384 - The Wall Pushers
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- fc全连接层的作用、卷积层的作用、pooling层、激活函数的作用
fc:1.起到分类器的作用.对前层的特征进行一个加权和,(卷积层是将数据输入映射到隐层特征空间)将特征空间通过线性变换映射到样本标记空间(也就是label) 2.1*1卷积等价于fc:跟原featur ...
- rnnlm学习
rnn-lm: 1.论文 2.公式推导 2.1 http://blog.csdn.net/a635661820/article/details/44462315 3. 工具 lstm-lm 1. 论文 ...
- springmvc错误集锦-dubbo包含低版本的spring包,依赖的时候应该排除Caused by: java.lang.reflect.MalformedParameterizedTypeException
dubbo 常见错误 1. Caused by: java.lang.reflect.MalformedParameterizedTypeException 启动时报错,原因是dubbo 依赖 spr ...
- java使用jsp建立项目+视频
项目下载:https://pan.baidu.com/s/1rfwrihd82zAmpt3r-mxIMw 视频+项目下载:https://pan.baidu.com/s/17Cm0wW-S9xiUy4 ...
- 跨浏览器的事件对象EventUtil
var EventUtil = function(){ /*--addHandler--*/ addHandler:function(element,type,handler){ if(element ...
- HDU 2097 sky数 (进制转化)
传送门: Sky数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...