我试图在这个链接之后编写一个基本的块驱动程序:
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 或一些参考。