本节我们利用前两节所总结的内容设计一个简单的块设备驱动程序,分配一块内存作为磁盘实现块设备的功能。
首先是一些宏定义和全局变量
#define RAMDISK_SIZE (1024*1024)
#define SECTOR_SIZE 512
static int major;
struct ramdisk_dev {
unsigned char *buffer; /* The data array */
spinlock_t lock; /* For mutual exclusion */
struct gendisk *gd; /* The gendisk structure */
};
struct ramdisk_dev *ramdisk;
我们定义了一个名为ramdisk_dev的结构描述该块设备,buffer指向存取数据内存,lock是控制访问队列的自旋锁,gd就是核心的gendisk结构体。宏定义RAMDISK_SIZE为整个磁盘的容量,SECTOR_SIZE为每个扇区的大小。
入口和出口函数
static struct block_device_operations ramdisk_fops = {
.getgeo = ramdisk_getgeo,
};
static int __init ramdisk_init(void)
{
major = register_blkdev(major, "ramdisk");
if (major <= 0) {
printk("ramdisk: unable to get major number\n");
return -EBUSY;
}
ramdisk = kmalloc(sizeof(s