reference: "리눅스 커널 내부구조" / 백승제, 최종무
설계: 메모리의 일부를 가상적인 디스크 디바이스 공간으로 사용.
간단한 가상 블록 디바이스 드라이버를 구현하여 이 공간에 쓰기와 데이터 읽기 연산 제공.
블록 장치 파일에 readk, write 요청 발생 시 등록한 mydrv_make_request 함수 호출 => bio 구조체를 통해 현재 요청 유형 파악 => read, write에 걸맞게 할당된 공간에 복사 작업 수행.
#include <linux/...h> // 다양한 linux/ 헤더파일
#include <asm/uaccess.h>
#define DEVICE_NAME "mydrv" // 디바이스 드라이버 이름
#define MYDRV_MAX_LENGTH (8*1024*1024) // 커널 내 가상 디스크 공간 크기
#define MYDRV_BLK_SIZE 512 // 블록의 크기 지정
#define MYDRV_TOTAL_BLK (MYDRV_MAX_LENGTH >> 9) // 전체 블록 갯수(디스크 공간 크기 / 512)
static int MYDRV_MAJOR = 0;
static char * mydrv_data;
struct request_queue * mydrv_queue;
struct gendisk * mydrv_disk;
static void mydrv_make_request(struct requset_queue *q, struct bio *bio);
int mydrv_open(struct block_device *dev, fmode_t mode);
void mydrv_release(struct gendisk *gd, fmode_t mode);
int mydrv_ioctl(struct block_device *bdev, fmode_f mode, unsigned int cmd, unsigned long arg);
// block_device_operations 구조체 등록
static struct block_device_operations mydrv_fops ={
.owner = THIS_MODULE,
.open = mydrv_open,
.release = mydrv_release,
.ioctl = mydrv_ioctl,
};
int mydrv_init(void); // 모듈 초기화
void mydrv_exit(void); // 모듈 exit
module_init(mydrv_init);
module_exit(mydrv_exit);
MODULE_LICENSE("GPL");
블록 장치 디바이스 드라이버 적재
$ make
$ insmod blk_test.ko
해당 (가상)디스크를 관리하는 파일 시스템 구축
$ mkfs.ext4 /dev/mydrv
마운드
$ mkdir mnt
$ mount -t ext4 -o loop /dev/mydrv ./mnt
=> 이후 일반적인 하드디스크를 사용할 때처러 ls, vim, gcc, cat 등을 이용하여 mydrv 장치에 데이터를 읽고 쓸 수 있음.