添加磁盘的第一步, 是需要分配一个genhd的数据结构, linux 提供了 alloc_disk 函数来分配genhd include/linux/genhd.h #define alloc_disk_node(minors, node_id) \ ({ \ static struct lock_class_key __key; \ const char *__name; \ struct gendisk *__disk; \ \ __name = "(gendisk_comple...
我们先看一下如何创建一个块设备,创建的方法很简单,主要是调用Linux内核的2个函数,分别是alloc_disk和add_disk。alloc_disk用于分配一个gendisk结构体的实例,而后者则是将该结构体实例注册到系统中。经过上述2步的操作,我们就可以在/dev目录下看到一个块设备。另外一个比较重要的地方是初始化gendisk结构体的请求队...
1. 块设备简单分类:SCSI块设备和LVM逻辑卷块设备; 2. 创建块设备需要两个linux内核函数:alloc_disk;add_disk; alloc_disk:用于分配一个gendisk结构体的实例; add_disk:将该结构体实例注册到系统中; SCSI磁盘的具体实现在文件sd.c(driver/scsi/sd.c)中; 3. 网络块设备NBD(Network Block Device) NBD本身是...
在内核中任何磁盘块设备都是通过调用add_disk函数完成的。在《Linux设备驱动程序》这本书对块设备进行了详细的介绍,并且可以通过非常简单的代码实现一个自己的块设备。 图2 最简单的块设备驱动 这里面有2个函数,也就是alloc_disk和add_disk。前一个函数是分配一个通用块的结构体,后者则是将该块设备添加到内核,...
1.1 gendisk磁盘结构体: 代码语言:javascript 复制 struct gendisk{int major;//设备主设备号,等于register_blkdev()函数里的majorint first_minor;//起始次设备号,等于0,则表示此设备号从0开始的int minors;//分区(次设备)数量,当使用alloc_disk()时,就会自动设置该成员char disk_name[32];//块设备名称, ...
1.1 gendisk磁盘结构体: structgendisk {intmajor;//设备主设备号,等于register_blkdev()函数里的majorintfirst_minor;//起始次设备号,等于0,则表示此设备号从0开始的intminors;//分区(次设备)数量,当使用alloc_disk()时,就会自动设置该成员chardisk_name[32];//块设备名称, 等于register_blkdev()函数里的nam...
我们先看一下如何创建一个块设备,创建的方法很简单,主要是调用Linux内核的2个函数,分别是alloc_disk和add_disk。alloc_disk用于分配一个gendisk结构体的实例,而后者则是将该结构体实例注册到系统中。经过上述2步的操作,我们就可以在/dev目录下看到一个块设备。另外一个比较重要的地方是初始化gendisk结构体的请求队...
/*每一个磁盘(分区)都是使用一个gendisk结构保存*/ tiny4412_blkdev_disk = alloc_disk(64); /*磁盘名称赋值*/ strcpy(tiny4412_blkdev_disk->disk_name, "tiny4412_blkdev"); /*注册一个块设备,自动分配主设备号*/ Tiny4412_block_major = register_blkdev(0,"Tiny4412_block");...
(1)使用alloc_disk()函数分配通用磁盘gendisk的结构体。 (2)通过内核函数register_blkdev()函数注册设备,该过程是一个可选过程。 (也可以不用注册设备,驱动一样可以工作,该函数和字符设备的register_chrdev()函数相对应,对于大多数的块设备,第一个工作就是相内核注册自己,但是在Linux2.6以后,regist...
(1)使用alloc_disk()函数分配通用磁盘gendisk的结构体。 (2)通过内核函数register_blkdev()函数注册设备,该过程是一个可选过程。 (也可以不用注册设备,驱动一样可以工作,该函数和字符设备的register_chrdev()函数相对应,对于大多数的块设备,第一个工作就是相内核注册自己,但是在Linux2.6以后,regist...