Я пытался написать базовый c блочный драйвер по этой ссылке:
https://linux-kernel-labs.github.io/master/labs/block_device_drivers.html
Я написал следующий код:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>
MODULE_LICENSE("GPL");
#define BLK_DEV_NAME "my_block"
#define MY_BLOCK_MINORS 1
int major;
struct gendisk *gd;
struct request_queue *queue; /* The device request queue */
spinlock_t lock; /* For mutual exclusion */
struct block_device_operations my_block_ops = {
.owner = THIS_MODULE
};
static void my_block_request(struct request_queue *q)
{
pr_info("%s\n", __func__);
}
static int test_hello_init(void)
{
major = register_blkdev(0, BLK_DEV_NAME);
pr_info("major = %d\n", major);
spin_lock_init(&lock);
queue = blk_init_queue(my_block_request, &lock);
if (!queue) {
pr_err("blk_init_queue failed\n");
return -ENOMEM;
}
blk_queue_logical_block_size(queue, 512);
gd = alloc_disk(MY_BLOCK_MINORS);
if (!gd) {
pr_err("alloc_disk failure\n");
return -ENOMEM;
}
gd->major = major;
gd->first_minor = 0;
gd->fops = &my_block_ops;
gd->queue = queue;
snprintf (gd->disk_name, 32, "myblock");
add_disk(gd);
pr_info("adding disk successful\n");
return 0;
}
static void test_hello_exit(void)
{
unregister_blkdev(major, BLK_DEV_NAME);
if (gd) {
del_gendisk(gd);
}
}
module_init(test_hello_init);
module_exit(test_hello_exit);
Я получаю следующую ошибку при компиляции кода:
error: implicit declaration of function ‘blk_init_queue’; did you mean ‘blk_put_queue’? [-Werror=implicit-function-declaration]
queue = blk_init_queue(my_block_request, &lock);
^~~~~~~~~~~~~~
blk_put_queue
Похоже, этот API был удален из последней версии ядра. Может ли кто-нибудь предоставить альтернативный API или ссылку на блочный драйвер basi c.