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