塊裝置驅動的系統架構
塊裝置註冊過程:
1, 註冊裝置塊驅動程式 register_blkdev
2, 初始化請求佇列 blk_init_queue
3, 指明扇區的大小 blk_queue_logical_block_size(dev->queue, sect_size);
4, 申請乙個gendisk結構,初始化
5, 註冊塊裝置
block_device_operations —— 操作函式介面
blk_init_queue —— 請求塊裝置佇列操作
gendisk —— 磁碟資訊結構
#include
#include
#include
#include
#include /* printk() */
#include /* kmalloc() */
#include /* everything... */
#include /* error codes */
#include
#include /* size_t */
#include /* o_accmode */
#include /* hdio_getgeo */
#include
#include
#include
#include
#include /* invalidate_bdev */
#include
module_license("dual bsd/gpl");
static
int major = 0;
static
int sect_size = 512;
static
int nsectors = 1024;
/** the internal representation of our device.
*/struct blk_dev;
struct blk_dev *dev;
/** handle an i/o request, in sectors.
*/static
void blk_transfer(struct blk_dev *dev, unsigned
long sector,
unsigned
long nsect, char *buffer, int write)
if (write)
memcpy(dev->data + offset, buffer, nbytes);
else
memcpy(buffer, dev->data + offset, nbytes);}/*
* the ****** form of the request function.
*/static
void blk_request(struct request_queue *q)}}
/** transfer a single bio.
*/static
int blk_xfer_bio(struct blk_dev *dev, struct bio *bio)
return
0; /* always "succeed" */}/*
* transfer a full request.
*/static
int blk_xfer_request(struct blk_dev *dev, struct request *req)
return nsect;}/*
* the device operations structure.
*/static
struct block_device_operations blk_ops = ;
static
int __init blk_init(void)
dev = kmalloc(sizeof(struct blk_dev), gfp_kernel);
if (dev == null)
goto out_unregister;
/** get some memory.
*/dev->size = nsectors * sect_size;
dev->data = vmalloc(dev->size);
if (dev->data == null)
//初始化請求佇列
dev->queue = blk_init_queue(blk_request, null);
if (dev->queue == null)
goto out_vfree;
//指明扇區的大小
blk_queue_logical_block_size(dev->queue, sect_size);
dev->queue->queuedata = dev;
//申請乙個gendisk結構,初始化
dev->gd = alloc_disk(1);
if (! dev->gd)
dev->gd->major = major;
dev->gd->first_minor = 0;
dev->gd->fops = &blk_ops;
dev->gd->queue = dev->queue;
dev->gd->private_data = dev;
sprintf (dev->gd->disk_name, "simp_blk%d", 0);
set_capacity(dev->gd, nsectors*(sect_size/sect_size));
//註冊塊裝置
add_disk(dev->gd);
out_vfree:
if (dev->data)
vfree(dev->data);
return
0; out_unregister:
unregister_blkdev(major, "sbd");
return -enomem;
}static
void blk_exit(void)
if (dev->queue)
blk_cleanup_queue(dev->queue);
if (dev->data)
vfree(dev->data);
unregister_blkdev(major, "blk");
kfree(dev);
}module_init(blk_init);
module_exit(blk_exit);
塊裝置驅動之NOR FLASH驅動
一.硬體原理 從原理圖中我們能看到nor flash有位址線,有資料線,能向記憶體一樣讀,不能向記憶體一樣寫 要發出某些命令 這也使得nor的資料很可靠,所以一般用來儲存bootloader。當然如今手機上都僅僅有nand flash了。節約成本嘛。下節我會帶大家去分析nand flash驅動,並進...
Linux塊裝置驅動
塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...
塊裝置驅動
若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...