davidfox 发表于 2004-2-2 15:50:41

有谁知道linux下如何读写硬盘的物理扇区?先谢了

有谁知道linux下如何读写硬盘的物理扇区?先谢了

gugong 发表于 2004-2-2 17:02:42

dd

muddog 发表于 2004-2-3 09:43:15

你是指内核如何吗?
内核的读写驱动是用bios调用还是,写port?
还没研究过的说,哪位说一下载

davidfox 发表于 2004-2-3 11:18:36

对不起,昨天不小心出错了,以为用下面的方法不能读,现在改进后可以了,下面是改进后的源代码:
/*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

通过上面的例子,我想大家也知道在应用层怎么读写了吧。

muddog 发表于 2004-2-3 22:02:31

good~!! :mrgreen:

Dragonfly 发表于 2004-2-4 11:20:29

this is a kernel module using fs operation. use buffer head can be faster. :-D

muddog 发表于 2004-2-4 13:04:19

what's buffer head?
for example :mrgreen:

Dragonfly 发表于 2004-2-11 23:04:28

http://www.sinovee.com/copyleft/ppc8xx-linux-2.0.htm


check LDD book to see how to use it. :-D
页: [1]
查看完整版本: 有谁知道linux下如何读写硬盘的物理扇区?先谢了