linux驅動之塊裝置驅動

2021-08-24 20:33:25 字數 3383 閱讀 5970

塊裝置驅動的系統架構

塊裝置註冊過程:

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 慢...