实验七补充sbull虚拟的磁盘驱动的编写Word文档格式.docx
- 文档编号:21181830
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:19
- 大小:22.89KB
实验七补充sbull虚拟的磁盘驱动的编写Word文档格式.docx
《实验七补充sbull虚拟的磁盘驱动的编写Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验七补充sbull虚拟的磁盘驱动的编写Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
*data;
The
data
array
short
users;
How
many
users
media_change;
Flag
a
media
change?
spinlock_t
lock;
For
mutual
exclusion
request_queue
*queue;
device
request
queue
gendisk
*gd;
structure
timer_list
timer;
simulated
changes
这个设备结构体是我们工作的核心,也许你不知道需要哪些成员,不要紧,还是那句话,编写驱动的时候,需要设备表现出那些性质和功能,相应的添加上就OK了。
(3)设备的初始化
sbull_init(
){
一、sbull_major
register_blkdev(sbull_major,
"
sbull"
二、Static
*Devices
kmalloc(ndevices*sizeof
(struct
sbull_dev),
GFP_KERNEL);
//在这里可以对Kmalloc的结果判断下,然后进一步处理...
三、setup_device()跳到我们设备注册函数中去
}//初始化函数结束
(4)开始注册我们的这个设备
setup_device(
){
//安装(注册)一个设备前,一定要保证它被初始化了
这些成员都得出初始化好:
一、
二、add_disk(dev->
gd);
//这个重要的注册函数}//函数结束
(5)扇区大小、data数组、user、锁lock的初始化:
一、dev->
nsectors*hardsect_size;
dev->
vmalloc(dev->
size);
spin_lock_init(&
lock);
二、//dev->
blk_alloc_queue(GFP_KERNEL);
//RM_NOQUEUE
//dev->
blk_init_queue(sbull_full_request,
&
//RM_FULL
blk_init_queue(sbull_request,
//RM_SIMPLE
(6)告知内核硬件扇区尺寸、和timer模拟的初始化
blk_queue_logical_block_size(dev->
queue,
hardsect_size);
init_timer(&
timer);
timer.data
(unsigned
long)
dev;
timer.function
sbull_invalidate;
gendisk初始化
一、初始化gendisk:
gd
alloc_disk(SBULL_MINORS);
二、
初始化gendisk的成员
gd->
major
sbull_major;
first_minor
which*SBULL_MINORS;
fops
sbull_ops;
queue;
private_data
(7)设置gendisk容量为xxx_size个扇区大小
set_capacity(dev->
nsectors*(hardsect_size
/
KERNEL_SECTOR_SIZE));
(8)剩下的就是为devices_operation结构体里声明的那些接口进行实现:
=
.ioctl=
一、sbull_open(struct
block_device
*bdev,fmode_t
mode
)
二、sbull_release(struct
*bd_disk,
fmode_t
mode)
三、sbull_media_changed(struct
*gd)
四、sbull_revalidate(struct
五、sbull_invalidate(unsigned
long
ldev)
六、sbull_ioctl
*bdev,
mode,
unsigned
cmd,
arg)
七、sbull_getgeo(struct
hd_geometry
*geo)
以下是代码:
[cpp]viewplaincopyprint?
1./*
2.
*
Sample
disk
driver
2.6.35.
3.
*/
4.
5.//#include
<
linux/autoconf.h>
6.#include
linux/module.h>
7.#include
linux/moduleparam.h>
8.#include
linux/init.h>
9.
10.#include
linux/sched.h>
11.#include
linux/kernel.h>
printk()
*/
12.#include
linux/slab.h>
kmalloc()
13.#include
linux/fs.h>
everything...
14.#include
linux/errno.h>
error
codes
15.#include
linux/timer.h>
16.#include
linux/types.h>
size_t
17.#include
linux/fcntl.h>
O_ACCMODE
18.#include
linux/hdreg.h>
HDIO_GETGEO
19.#include
linux/kdev_t.h>
20.#include
linux/vmalloc.h>
21.#include
linux/genhd.h>
22.#include
linux/blkdev.h>
23.#include
linux/buffer_head.h>
invalidate_bdev
24.#include
linux/bio.h>
25.
26.MODULE_LICENSE("
27.
28.static
sbull_major
0;
29.module_param(sbull_major,
int,
0);
30.static
hardsect_size
512;
31.module_param(hardsect_size,
32.static
nsectors
25600;
big
the
drive
is
33.module_param(nsectors,
34.static
ndevices
1;
35.module_param(ndevices,
36.
37./*
38.
different
modes"
we
can
use.
39.
40.enum
{
41.
RM_SIMPLE
0,
extra-simple
function
42.
RM_FULL
1,
full-blown
version
43.
RM_NOQUEUE
2,
Use
make_request
44.};
45.//static
request_mode
RM_FULL;
46.//static
RM_SIMPLE;
47.static
RM_NOQUEUE;
48.module_param(request_mode,
49.
50./*
51.
Minor
number
and
partition
management.
52.
53.#define
SBULL_MINORS
16
54.#define
MINOR_SHIFT
4
55.#define
DEVNUM(kdevnum)
(MINOR(kdev_t_to_nr(kdevnum))
>
MINOR_SHIFT
56.
57./*
58.
We
tweak
our
hardware
sector
size,
but
kernel
talks
to
us
59.
terms
of
small
sectors,
always.
60.
61.#define
KERNEL_SECTOR_SIZE
512
62.
63./*
64.
After
this
much
idle
time,
will
simulate
change.
65.
66.#define
INVALIDATE_DELAY
60*HZ
67.
68./*
69.
internal
representation
device.
70.
71.struct
72.
73.
74.
75.
76.
77.
78.
79.
80.};
81.
82.static
NULL;
83.
84./*
85.
Handle
an
I/O
request.
86.
87.static
void
sbull_transfer(struct
*dev,
sector,
88.
nsect,
char
*buffer,
write)
89.{
90.
offset
sector*KERNEL_SECTOR_SIZE;
91.
nbytes
nsect*KERNEL_SECTOR_SIZE;
92.
//printk("
0>
%s
offset=%d
nbytes=%d
write=%d\n"
__FUNCTION__,offset,nbytes,write);
93.
//buffer[10]='
\0'
;
94.
//printk(buffer);
95.
\n"
96.
if
((offset
+
nbytes)
size)
97.
printk
(KERN_NOTICE
Beyond-end
write
(%ld
%ld)\n"
offset,
nbytes);
98.
return;
99.
}
100.
(write)
101.
memcpy(dev->
buffer,
102.
else
103.
memcpy(buffer,
104.}
105.
106./*The
simple
form
function.*/
107.
108.static
sbull_request(struct
*q)
109.{
110.
*req;
111.
112.
req
blk_fetch_request(q);
113.
while
(req
!
NULL)
114.
*dev
req->
rq_disk->
private_data;
115.
(!
blk_fs_request(req))
116.
Skip
non-fs
request\n"
117.
__blk_end_request_all(req,
-EIO);
118.
continue;
119.
120.
//
Req
dev
%d
dir
%ld
sec
%ld,
nr
f
%lx\n"
121.
-
Devices,
rq_data_dir(req),
122.
current_nr_sectors,
123.
flags);
124.
printk("
sectors=%d\n"
req->
current_nr_sectors);
125.
sbull_transfer(dev,
blk_rq_pos(req),
blk_rq_cur_sectors(req),
126.
rq_data_dir(req));
127.
(
__blk_end_request_cur(req,
0)
)
128.
129.
130.
131.}
132.
133.
134./*
135.
Transfer
single
BIO.
136.
137.static
sbull_xfer_bio(struct
bio
*bio)
138.{
139.
i;
140.
bio_vec
*bvec;
141.
sector_t
bio->
bi_sector;
142.
143.
Do
each
segment
independently.
144.
bio_for_each_segment(bvec,
bio,
i)
145.
*buffer
__bio_kmap_atomic(bio,
i,
KM_USER0);
146.
bio_cur_bytes(bio)>
9
147.
bio_data_dir(bio)
==
WRITE);
148.
+=
9;
149.
__bio_kunmap_atomic(bio,
150.
151.
return
Always
succeed"
152.}
153.
154./*
155.
full
156.
157.static
sbull_xfer_request(struct
*req)
158.{
159.
*bio;
160.
nsect
161.
162.
__rq_for_each_bio(bio,
req)
163.
sbull_xfer_bio(dev,
bio);
164.
bi_size/KERNEL_SECTOR_SIZE;
165.
166.
nse
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 补充 sbull 虚拟 磁盘 驱动 编写