欢迎来到天天文库
浏览记录
ID:33037649
大小:115.93 KB
页数:6页
时间:2019-02-19
《实验十三-块设备驱动》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验十三块设备驱动实验目的熟悉块设备驱动程序的架构;掌握编写快设备驱动程序的流程和力法;实验步骤1膜劉完善下而的块设备驱动程序my」amblock.c,驱动程序如下:#include#include#include#include#include#include#include#include
2、#include#include#include#ineludevlinux/wait.h>#include#include#include#include#ineludevlinux/gfp.h>#include#include3、/system.h>#include#inelude#defineMYDISK_SIZE(1024*1024)#defineMYDISK_NAMEHram_siceHstaticDEFlNE_SPINLOCK(mydisk_lock);staticconststructblock_device_operationsmydisk_fops={.owner=THISMODULE,};staticstructgendisk*my_disk;static4、structrequest_queue*my_queue;staticunsignedchar*ram_buffer;staticintmajor;staticvoidmyblock_do_request(structrequest_queue*q){structrequest*req;req=blk_fetch_request(q);/*取出一个请求*/while(req){unsignedlongoffset=blk_rq_pos(req)«9;/*获取req的扇区位置,并乘512字节,请求里5、的起始地址*/unsignedlonglen=blk_rq_cur_bytes(req);/*要操作数据的大小*/if(rq_data_dir(req)==READ)严判断是否是读操作*/memcpy(req・>buffer,ram_buffer+offset,len);elsememcpy(ram_buffer+offset,req->buffer,len);if(!_blk_end_request_cur(req,O))/*完成当前请求*/req=blk_fetch_request(q);/*6、取下一个请求*/staticintmy_ram_init(void){major=register_blkdev(O,MYDISK_NAME);/*动态分配主设备号*/my_disk=alloc_disk(8);/*8为次设备号个数:分区个数+1*/my_queue=blk_init_queue(myblock_do_request,&mydiskjock);/*初始化队列*/my_disk->queue=my_queue;my_disk->major=major;my_disk->first_m7、inor=0;sprintf(my_disk->disk_name,MYDISK_NAME);my_disk->fops=&mydisk_fops;set_capacity(my_disk,MYDISK_SIZE/512);ram_buffer=kzalloc(MYDISK_SIZE,GFP_KERNEL);add_disk(my_disk);/*注册gendisk*/return0;}staticvoidmy_ram_exit(void)unregister_blkdev(major,MYDIS8、K_NAME);del_gendisk(my_disk);put_disk(my_disk);blk_cleanup_queue(my_queue);kfree(ram_buffer);}module_init(my_ram_init);module_exit(my_ram_exit);MODULE.LICENS玖9PI7);2编译在开发板上插入模块insmodramblock.ko格式化mkdosfs/dev/ram_sice挂载mkdir/tmp/rammount/dev/ra
3、/system.h>#include#inelude#defineMYDISK_SIZE(1024*1024)#defineMYDISK_NAMEHram_siceHstaticDEFlNE_SPINLOCK(mydisk_lock);staticconststructblock_device_operationsmydisk_fops={.owner=THISMODULE,};staticstructgendisk*my_disk;static
4、structrequest_queue*my_queue;staticunsignedchar*ram_buffer;staticintmajor;staticvoidmyblock_do_request(structrequest_queue*q){structrequest*req;req=blk_fetch_request(q);/*取出一个请求*/while(req){unsignedlongoffset=blk_rq_pos(req)«9;/*获取req的扇区位置,并乘512字节,请求里
5、的起始地址*/unsignedlonglen=blk_rq_cur_bytes(req);/*要操作数据的大小*/if(rq_data_dir(req)==READ)严判断是否是读操作*/memcpy(req・>buffer,ram_buffer+offset,len);elsememcpy(ram_buffer+offset,req->buffer,len);if(!_blk_end_request_cur(req,O))/*完成当前请求*/req=blk_fetch_request(q);/*
6、取下一个请求*/staticintmy_ram_init(void){major=register_blkdev(O,MYDISK_NAME);/*动态分配主设备号*/my_disk=alloc_disk(8);/*8为次设备号个数:分区个数+1*/my_queue=blk_init_queue(myblock_do_request,&mydiskjock);/*初始化队列*/my_disk->queue=my_queue;my_disk->major=major;my_disk->first_m
7、inor=0;sprintf(my_disk->disk_name,MYDISK_NAME);my_disk->fops=&mydisk_fops;set_capacity(my_disk,MYDISK_SIZE/512);ram_buffer=kzalloc(MYDISK_SIZE,GFP_KERNEL);add_disk(my_disk);/*注册gendisk*/return0;}staticvoidmy_ram_exit(void)unregister_blkdev(major,MYDIS
8、K_NAME);del_gendisk(my_disk);put_disk(my_disk);blk_cleanup_queue(my_queue);kfree(ram_buffer);}module_init(my_ram_init);module_exit(my_ram_exit);MODULE.LICENS玖9PI7);2编译在开发板上插入模块insmodramblock.ko格式化mkdosfs/dev/ram_sice挂载mkdir/tmp/rammount/dev/ra
此文档下载收益归作者所有