【Linux】LDD3中sbull源码编译问题梳理

本文详细梳理了在将Linux设备驱动开发第三版(LDD3)中的sbull源码应用于2.6.32内核时遇到的编译错误及解决方法。主要涉及头文件、struct block_device_operations结构变化、request_queue_t typedef取消、bio_cur_sectors宏删除、rq_for_each_bio等函数名改变,以及end_request等相关函数的替换。通过一系列修改,成功适配了2.6.32内核。
摘要由CSDN通过智能技术生成

LDD3,Linux设备驱动第三版用的内核是2.6.10,在编译的时候我用的是2.6.32

2.6.32相比2.6.10在块设备驱动上,简直是动了大手术,编译基本满满错误,这里梳理一下我遇到全部的错误

很多都是网上找的资料,只有小部分是我写的:

1、包含文件

错误:没有#include<linux/config.h>

改法:删掉


2、整一个块设备驱动的struct block_device_operations变了

错误:

/home/ljy/scripts/LDD/sbull/sbull_driver.c: 在文件层:
/home/ljy/scripts/LDD/sbull/sbull_driver.c:174: 警告:从不兼容的指针类型初始化
/home/ljy/scripts/LDD/sbull/sbull_driver.c:175: 警告:从不兼容的指针类型初始化
/home/ljy/scripts/LDD/sbull/sbull_driver.c:177: 警告:从不兼容的指针类型初始化

改法:函数定义这么改

struct block_device_operations {

 int (*open) (struct block_device *, fmode_t);

 int (*release) (struct gendisk *, fmode_t);

 int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);

 int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);

 int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);

 int (*direct_access) (struct block_device *, sector_t,

 void **, unsigned long *);

 int (*media_changed) (struct gendisk *);

 unsigned long long (*set_capacity) (struct gendisk *,

 unsigned long long);

 int (*revalidate_disk) (struct gendisk *);

 int (*getgeo)(struct block_device *, struct hd_geometry *);

 /* this callback is with swap_lock and sometimes page table lock held */

 void (*swap_slot_free_notify) (struct block_device *, unsigned long);

 struct module *owner;

};

3、/home/ljy/scripts/LDD/sbull/sbull_driver.c:271: 错误:‘struct SBULL_DEV’没有名为‘queue’的成员

错误:这个纠结了我超TM久,原来request_queue_t*这个参数,对照2.6.10和2.6.32的源码发现,在2.6.32中取消了typedef struct request_queue

改法:用struct request_queue


4、各种隐式声明函数报错

1)bio_cur_sectors不存在,在2.6.10源码中发现这个宏的定义是
#define bio_cur_sectors(bio) (bio_iovec(bio)->bv_len>>9)
在2.6.32中已经删除该宏,函数bio_cur_bytes返回bio_iovec(bio)->bv_len,所以将其改为bio_cur_bytes(bio)>>9;

2)rq_for_each_bio未定义,发现改成了__rq_for_each_bio


3)elv_next_request不存在,改成了blk_fetch_request,有两处,改之~

4)end_request,改成了blk_end_request_all,改之~

5)现在不能直接获取request结构的sector和current_nr_sector;而是通过函数blk_rq_pos和blk_rq_cur_sectors获得,所以将对用两处改为:
sbull_transfer(dev,blk_rq_pos(req), blk_rq_cur_se

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值