有谁知道linux下如何读写硬盘的物理扇区?先谢了
有谁知道linux下如何读写硬盘的物理扇区?先谢了 dd 你是指内核如何吗?内核的读写驱动是用bios调用还是,写port?
还没研究过的说,哪位说一下载 对不起,昨天不小心出错了,以为用下面的方法不能读,现在改进后可以了,下面是改进后的源代码:
/*hd.c*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/unistd.h>
#include <linux/fs.h>
#include <asm/fcntl.h>
#include <asm/uaccess.h>
#include <asm/processor.h>
#define BLOCKS 512
int write_disk_data()
{
struct file *filp=NULL;
char buf;
int result;
mm_segment_t old_fs;
memset(buf,0,BLOCKS);
filp= filp_open("/dev/hda1", O_RDWR, 0600);
if(!IS_ERR(filp))
{
old_fs=get_fs();
set_fs(get_ds());
if(filp->f_op && filp->f_op->read)
{
filp->f_pos=0;
result=filp->f_op->read(filp,buf,BLOCKS,&filp->f_pos);
if(result<0)
{
printk("read file error.\n");
set_fs(old_fs);
filp_close(filp, NULL);
return 0;
}
}
/*decide the TOPSEC_RANDOM_SIZE's value*/
printk("buf=%x%x.\n",buf,buf);
buf=0x10;
buf=0x58;
if(filp->f_op && filp->f_op->write)
{
filp->f_pos=0;
result=filp->f_op->write(filp,buf,BLOCKS,&filp->f_pos);
if(result<0)
{
printk("write file error.\n");
set_fs(old_fs);
filp_close(filp, NULL);
return 0;
}
printk("write buf=%x%x.\n",buf,buf);
}
filp_close(filp, NULL);
set_fs(old_fs);
return 0;
}
return 0;
}
int init_module(void)
{
write_disk_data();
return 0;
}
void cleanup_module(void)
{
}
下面是make文件:
DFLAGS= -D __KERNEL__ -D MODULE
CFLAGS= -O2 -g -Wall -Wstrict-prototypes -pipe -I/usr/include/linux/ -I/usr/src/linux/drivers/block
hd.o : hd.c
gcc -c hd.c $(DFLAGS) $(CFLAGS) -o hd.o
clean:
rm -f *.o
通过上面的例子,我想大家也知道在应用层怎么读写了吧。 good~!! :mrgreen: this is a kernel module using fs operation. use buffer head can be faster. :-D what's buffer head?
for example :mrgreen: http://www.sinovee.com/copyleft/ppc8xx-linux-2.0.htm
check LDD book to see how to use it. :-D
页:
[1]