QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2096|回复: 7

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

[复制链接]
发表于 2004-2-2 15:50:41 | 显示全部楼层 |阅读模式
有谁知道linux下如何读写硬盘的物理扇区?先谢了
发表于 2004-2-2 17:02:42 | 显示全部楼层
dd
回复

使用道具 举报

发表于 2004-2-3 09:43:15 | 显示全部楼层
你是指内核如何吗?
内核的读写驱动是用bios调用还是,写port?
还没研究过的说,哪位说一下载
回复

使用道具 举报

 楼主| 发表于 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[BLOCKS];
        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[0x1bc-d]=%x%x.\n",buf[0x1bc],buf[0x1bd]);
                buf[0x1bc]=0x10;
                buf[0x1bd]=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[0x1bc-d]=%x%x.\n",buf[0x1bc],buf[0x1bd]);
                }
                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

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

使用道具 举报

发表于 2004-2-3 22:02:31 | 显示全部楼层
good~!!
回复

使用道具 举报

发表于 2004-2-4 11:20:29 | 显示全部楼层
this is a kernel module using fs operation. use buffer head can be faster.
回复

使用道具 举报

发表于 2004-2-4 13:04:19 | 显示全部楼层
what's buffer head?
for example
回复

使用道具 举报

发表于 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.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 10:31 , Processed in 0.039498 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表