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.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...
随机推荐
- tree结构统一修改属性名(递归)
1 //data为需要修改的tree,这里主要是为antd design 里面select规范数据 const ass = (data) => { let item = []; data.map ...
- selenium 滑动解锁(drag_and_drop_by_offset)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from ...
- mysql多实例mysqld_multi方式
mysql多实例应用,亲测直接执行脚本可使用,可快速部署多实例环境 #!/bin/bash set -e #定义mysql_multi多实例数据的配置,如需增加,在后面函数对应地方需要增加 mydir ...
- [EffectiveC++]item38:通过复合塑膜出has -a 或“根据某物实现出”
Model "has-a"or “is-implemented-in-terms-of” through composition
- 一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
有好几位朋友在公众号后台给我留言询问SAP C/4HANA和S/4HANA集成的方案. 尽管我给这些朋友推送了一个方案:打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例,然而我得到的 ...
- iText中输出 中文
iText中输出中文,有三种方式: 1.使用iTextAsian.jar中的字体 BaseFont.createFont("STSong-Light", "UniG ...
- 一切皆文件-文件是对IO的最简抽象
引用<Linux Kernel Development>原书里面的一句话 in Unix, everything is a file.This simplifies the manipul ...
- BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- im2rec打包图片
https://mxnet.incubator.apache.org/faq/finetune.html python ~/mxnet/tools/im2rec.py --list --recursi ...
- [19/04/06-星期六] 多线程_静态代理(StaticProxy)和 lamda (简化代码,jdk8新增)
一.静态代理 [代码示例] /*** * 静态代理:记录日志等,类是写好的,直接拿来用. 动态代理:随用随构建,临时抱佛脚 * 婚庆公司:代理角色,帮你搞婚庆的一切,布置房间等等 * 自己:真实角色, ...