下面的程序可以在Linux2.6内核直接读写硬盘的0磁道0扇区,也是根据网上一个朋友的做法做了修改的;有两个不是很明白的地方就是:1、bd_claim函数的使用,这个是个递归函数,像是匹配内存指针和设备,但是调用会返回错误;2、bdev = open_by_devnum(0x00800000, FMODE_READ | FMODE_WRITE); 中0x00800000数字的确认,不知从何而来:#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/buffer_head.h>
#include <linux/blkdev.h>
#include <linux/msdos_fs.h>
#include <linux/fcntl.h>
#include <linux/delay.h>static int set_size = 512;
static int nr = -1;
static char *devn = "/dev/sda";static char pages_addr[PAGE_SIZE];module_param(set_size,int,S_IRUGO);
//MODULE_Parm_DESC(set_size,"how many bytes you want to read,not more than 4096");
module_param(nr,long,S_IRUGO);
//MODULE_Parm_DESC(nr,"which sectors you want to read");
module_param(devn,charp,S_IRUGO);
//MODULE_Parm_DESC(devn,"which device");
MODULE_LICENSE("GPL");static struct block_device *bdev;
static char *usage = "You can change the value:set_size nr devn";int bdev_write_one_page(struct block_device *bdev, unsigned long blocknr, void *page_addr)
{
int ret = -1;
struct buffer_head *bh;
if (!bdev || !page_addr)
{
printk("%s error ", __func__);
return -1;
}
bh = __getblk(bdev, blocknr, PAGE_SIZE);
if (!bh)
{
printk("get blk failed ");
return -1;
}
memcpy(bh->b_data, page_addr, PAGE_SIZE);
mark_buffer_dirty(bh);
ll_rw_block(WRITE, 1, &bh);
brelse(bh);
ret = 0;
return ret;
}int bdev_read_one_page(struct block_device *bdev, unsigned long blocknr, void *page_addr)
{
int ret = -1;
struct buffer_head *bh;
if (!bdev || !page_addr)
{
printk("%s error ", __func__);
return -1;
} bh = __getblk(bdev, blocknr, PAGE_SIZE);
if (!bh)
{
printk("get blk failed ");
return -1;
} if (!buffer_uptodate(bh))
{
ll_rw_block(READ, 1, &bh);
wait_on_buffer(bh);
if (!buffer_uptodate(bh))
{
ret = -1;
goto out;
}
}
memcpy(page_addr, bh->b_data, PAGE_SIZE);
ret = 0;out:
brelse(bh); return ret;
}void block_test(void)
{
struct block_device *bdev;
// void *pages_addr = (void *)kmalloc(2048,GFP_KERNEL);
void *holder = (void *)pages_addr;
int cnt, ret;
int blocknr;
//bdev = bdget(MKDEV(16, 0));
int i = 0;
printk("block_test:IN ---------2010-03-22
");
//memset(pages_addr,0x00,sizeof(pages_addr));
printk("pages_addr:%x
",pages_addr);
printk("holder:%x
",holder);
#if 1
// bdev = open_by_devnum(0x00800000, FMODE_READ | FMODE_WRITE);
bdev = open_by_devnum(0x00800000, FMODE_READ | FMODE_WRITE);
// bdev=0x800;
if (IS_ERR(bdev))
{
printk("bdget error, bdev=%08lx
", (unsigned long)bdev);
return;
}
printk("bdev:%x
",bdev);
bdev->bd_holder = holder;
#if 0
if (bd_claim(bdev, holder))
{
printk("claim failed
");
goto out_bdev;
}
printk("after bd_claim
");
#endif
// blocknr = *(unsigned long *)(pages_addr + 0x100000);
//for (cnt = 0; cnt < 10 * 1024; cnt++, blocknr++)
{
ret = bdev_read_one_page(bdev, 0x00, (void *)pages_addr);
if (ret)
printk("blk read failed "); }
printk("after bdev_read_one_page
");
// printk("get data:%0x,%0x
,",pages_addr[510],pages_addr[511]);
for( i = 0; i < 512; i++ )
{
printk( "0x%02x ",(unsigned char)pages_addr[ i ] );
if(( i % 8 ) == 7)
{
printk( "
" );
}
}
printk( "
" );
out_bdev:
// bd_release(bdev);
// blkdev_put(bdev,FMODE_READ | FMODE_WRITE);
// blkdev_put(bdev);
#endif
return;
}
static int __init disk_rw_init(void)
{
block_test(); return 0;
}
static void __exit disk_rw_exit(void)
{
printk("exit
");
}module_init(disk_rw_init);
module_exit(disk_rw_exit);
Makefile:ifneq ($(KERNELRELEASE),)
obj-m:=hw_disk_rw26.o
else
KDIR =/usr/src/linux-2.6.33
# KDIR = /usr/src/kernels/2.6.9-5.EL-i686
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
install:
insmod hw_disk_rw26.ko
uninstall:
rmmod hw_disk_rw26.ko
clean:
$(MAKE) -C $(KDIR) M=$(PWD) cleanendif向征服Linux进军Windows下PXA270开发板的Linux系统的移植过程相关资讯 Linux知识
- 时光总是太匆匆!Linux已经诞生23 (08/29/2014 14:12:03)
- Linux虚拟文件系统之文件打开(sys (02/14/2012 11:41:54)
- 2012 年 Linux 峰会时间表 (02/14/2012 06:47:27)
| - 报告称当前 Linux 人才抢手 高薪也 (02/15/2012 06:35:56)
- 解析企业为何选择Linux及其特别之 (02/14/2012 08:17:59)
- Linux禁用字符闪烁的方法 (11/02/2011 10:28:25)
|
本文评论 查看全部评论 (1)
评论声明- 尊重网上道德,遵守中华人民共和国的各项有关法律法规
- 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
- 本站管理人员有权保留或删除其管辖留言中的任意内容
- 本站有权在网站内转载或引用您的评论<
|