2017-12-21 13 views
0

블럭 디바이스 드라이버 (예 :/dev/dua)를 작성하는 태스크가 있는데,이 블럭 디바이스는 OS처럼 보일 것입니다./dev/sda와 같은 디스크 장치. 따라서이 드라이버는 데이터 블록을 처리하여 다른 블록 장치에 기록해야합니다.리눅스에서 블럭 디바이스 드라이버로부터 디바이스를 차단하기 위해 입출력을 수행하는 방법

"/ dev/sdb"와 같은 백엔드 장치에서 I/O 작업을 수행하는 올바른 방법을 찾고 있습니다.

저는 디스크 섹터 크기의 전송을 위해 vfs_read/write 루틴을 사용했습니다. 하지만 백엔드 장치에서 I/O를 수행하는 데 더 효과적인 방법이 있습니까?

TIA. 이 백엔드 블록 장치`

void misc_request_fn(struct request_queue *q, struct bio *bio) { 
     printk ("we are passing bios.\n"); 
     // here is where we trace requests... 
     original_request_fn (q, bio); 
     return; 
} 


void register_block_device(char *path) { 

     struct request_queue *blkdev_queue = NULL; 

     if (path == NULL)  { 
       printk ("Block device empty.\n"); 
       return; 
     } 

     printk ("Will open %s.\n", path); 

     blkdev = lookup_bdev(path); 

     if (IS_ERR(blkdev))  { 
       printk ("No such block device.\n"); 
       return; 
     } 

     printk ("Found block device %p with bs %d.\n", blkdev, blkdev->bd_block_size); 
     blkdev_queue = bdev_get_queue(blkdev); 
     original_request_fn = blkdev_queue->request_fn; 
     blkdev_queue->request_fn = misc_request_fn; 
} 
에 대한 I/O를 수행하는 방법으로 사용할 수 있도록하는 "필터링"기능을 구현
+1

[ask]를 검토하십시오. – Aron

답변