linux3.4.2之块设备驱动完整程序
2024-10-20 08:47:31
/*参考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");
最新文章
- 介绍对称加密的另一个算法——PBE
- RAC Concept
- Jmeter函数 唯一取值 笔记
- fifter常见的运用场景
- html及css常用的单词
- Mac下Erlang环境安装
- VS2010安装中遇到的错误
- 10409 - Die Game
- Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子
- new关键字在虚方法的动态调用中的阻断作用
- 2014:超越炒作,进入部署SDN的时代
- hdu4300之KMP&;&;EKMP
- OI不得不知的那些数学定理
- Fedora 17 安装 完全 指南
- VC实现URL编解码器
- DRP——Servlet(一)
- Android View系统解析(上)
- Winform制作圆弧panel
- [国嵌笔记][029][ARM处理器启动流程分析v2]
- IP判断
热门文章
- SQL Server ->;>; 尝试优化ETL中优化Merge性能
- Stack vs Heap
- .Net中初探Redis
- 【Leetcode】【Easy】Path Sum
- Mac os下profile设置
- 【深入理解JAVA虚拟机】第三部分.虚拟机执行子系统.3.函数调用与执行
- shared_ptr 的使用及注意事项
- 自开发Web应用和SAP Customer Data Cloud Identity服务的集成
- maven构建报错org.apache.maven.lifecycle.LifecycleExecutionException
- c++由string组成的struct初始化崩溃