精华内容
下载资源
问答
  • linux 读写磁盘扇区

    千次阅读 2014-12-26 15:18:44
    linux2.6硬盘扇区直接读写程序  (2010-03-23 08:35:16) ...下面的程序可以在linux2.6内核直接读写硬盘的指定扇区,也是根据网上一个朋友的做法做了修改的; 两个不是很明白的地方就是:1、bd_claim函数的使用

    linux2.6硬盘扇区直接读写程序

      (2010-03-23 08:35:16)
    标签: 

    linux

     

    硬盘

     

    读写

    分类: 技术

    下面的程序可以在linux2.6内核直接读写硬盘的指定扇区,也是根据网上一个朋友的做法做了修改的;

    有两个不是很明白的地方就是: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 = 0;

    static char pages_addr[PAGE_SIZE];
    static char pages_write_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_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\n");
     //memset(pages_addr,0x00,sizeof(pages_addr));
     printk("pages_addr:%x\n",pages_addr);
     printk("holder:%x\n",holder);
    #if 1 


     bdev = open_by_devnum(0x00800000, FMODE_READ | FMODE_WRITE);
        //    bdev=0x800;
     if (IS_ERR(bdev))
     {
      printk("bdget error, bdev=%08lx \n", (unsigned long)bdev);
      return;
     }
     printk("bdev:%x\n",bdev);
     bdev->bd_holder = holder;
    #if 0
     if (bd_claim(bdev, holder))
     {
      printk("claim failed \n");
      goto out_bdev;
     
     printk("after bd_claim\n");
    #endif 
    #if 0
    // blocknr = *(unsigned long *)(pages_addr + 0x100000);
     //for (cnt = 0; cnt < 10 * 1024; cnt++, blocknr++)
     {
      printk("nr=%d\n",nr);
      memset(pages_addr,0xff,PAGE_SIZE);
      ret = bdev_read_one_page(bdev,nr, (void *)pages_addr);
      if (ret)
       printk("blk read failed ");

     }
     printk("after bdev_read_one_page\n");
    // printk("get data:%0x,%0x\n,",pages_addr[510],pages_addr[511]);
     for( i = 0; i < 512; i++ )   
           
      printk( "%02x ",(unsigned char)pages_addr[ i ] );       
      if(( i % 16  ) == 15)       
                
       printk( "  \n" );       
        
       
     printk( "  \n" );

     printk("nr=%d\n",nr);
     memset(pages_write_addr,0xe7,PAGE_SIZE);
     ret = bdev_write_one_page(bdev,nr, (void *)pages_write_addr);
     if (ret)
      printk("blk write failed ");
    #endif
     {
      printk("nr=%d\n",nr);
      ret = bdev_read_one_page(bdev,nr, (void *)pages_addr);
      if (ret)
       printk("blk read failed ");

     }
     printk("after bdev_read_one_page\n");
    // printk("get data:%0x,%0x\n,",pages_addr[510],pages_addr[511]);
     for( i = 0; i < 512; i++ )   
           
      printk( "%02x ",(unsigned char)pages_addr[ i ] );       
      if(( i % 16  ) == 15)       
                
       printk( "  \n" );       
        
       
     printk( "  \n" );

    out_bdev:
    // bd_release(bdev);
     
    // blkdev_put(bdev,FMODE_READ | FMODE_WRITE);
     blkdev_put(bdev);
    #endif
     return;
    }
    static int __init disk_rw_init(void)
    {
    // nr = 0;
    // set_size = PAGE_SIZE;

     block_test();

     return 0;
    }
    static void __exit disk_rw_exit(void)
    {
     printk("disk_rw_exit\n");
     
    }

    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) clean

    endif

     

    展开全文
  • 磁盘扇区默认是512Byte,想要验证的话,在命令行下执行:fdisk -l 转载于:https://www.cnblogs.com/sunss/archive/2011/03/01/1967711.html

    磁盘扇区默认是512Byte,想要验证的话,在命令行下执行:fdisk -l

    2011030110222852.jpg

    转载于:https://www.cnblogs.com/sunss/archive/2011/03/01/1967711.html

    展开全文
  • linux 引导扇区

    2013-11-14 10:23:09
    Linux系统中,恢复MBR。(如果你还能登陆到Linux系统中的话) 在终端的命令提示符后输入: ...主引导扇区一个扇区(512字节呀),因为我们只是想通过扇面的命令修复系统MBR的引导或删除Grub/LILO引导;

    在Linux系统中,恢复MBR。(如果你还能登陆到Linux系统中的话) 在终端的命令提示符后输入:

    dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1

    注意,其中bs(buffer size)是指重写的字节数。为什么不是512呢?主引导扇区是一个扇区(512字节呀),因为我们只是想通过扇面的命令修复系统MBR的引导或删除Grub/LILO引导;而不是恢复整个主引导扇区。所以我们只把主引导扇区的备份文件boot.NNNN的前446个字节重写入主引导扇区。

    boot.NNNN --- 是我们在安装Linux之前整个主引导分区的备份。如果我们把512个字节全部写入主引导扇区就可能会把安装了Linux后改变了的硬盘DPT表也破坏掉。那就坏事了。

    MBR的512字节中前446字节为引导程序,紧跟着后面64字节为分区表,最后面2个字节为结束标记。




    dd if=boot.bin of=test.img bs=512 count=1 conv=notrunc

    如果test.img 的大小为1G ,如果不加这个conv=notrunc 的话,执行这个命令之后,test.img的大小变为512

    dd if=/dev/zero of=test.img bs=1024 count=512

    用0填充test.img,也相当于创建了指定大小的空文件
    展开全文
  • linux之 引导扇区

    千次阅读 2018-03-12 09:56:18
    上回说到操作系统上电到引导扇区之间的程序,但是在结尾只是随便用一个测试程序来代替引导程序(就是第一个扇区的程序),今天我们来讲讲真正的引导程序。 但是在讲引导程序之前我们需要先学习FAT12文件系统,学了...

    上回说到操作系统上电到引导扇区之间的程序,但是在结尾只是随便用一个测试程序来代替引导程序(就是第一个扇区的程序),今天我们来讲讲真正的引导程序。

    但是在讲引导程序之前我们需要先学习FAT12文件系统,学了之后才会了解数据是如何存储在硬盘上面的(注意:是硬盘,此时数据还没有加载到内存上面)。

    所有的文件系统会把磁盘分为若干个层次方便组织和管理,包括
    1.扇区:磁盘上最小的数据单元
    2.簇:一个或多个扇区
    3.分区:通常指整个文件系统

    引导扇区位于整个磁盘的0柱面(磁道)0磁头第一个扇区,在这个扇区有个很重要的数据结构叫做BPB(BIOS ParameterBlock)
    这里写图片描述
    以上是第一个扇区内部的格式

    紧接着第一个扇区的是FAT1和FAT2,分别占用9个扇区,FAT2之后是根目录区的第一个扇区,根目录区后面是数据区,整个文件系统如下
    这里写图片描述

    软盘(用当前时代的物代替就是硬盘、U盘)的作用是用来放置数据,简单来说就是读数据和写数据。读和写只是一个标志位的问题(权限问题,暂且不表)。它们的共同点都是寻找数据,而数据都是以文件的形式存在,那么整个文件系统的主要职责便是查找文件读写文件

    首先来分析根目录,它位于FAT2之后,开始的扇区是19号,它由若干个目录条目组成,条目最多有BPB_RootEntCnt个(这个数据在引导扇区中),所以长度不固定。根目录区中每一个条目占用32字节,格式如下

    名称偏移长度描述
    DIR-Name00xB长度名8字节,扩展名三字节
    DIR-Attr0xB1文件属性
    保留位0xC10保留位
    DIR_WrtTime0x162最后一次写入时间
    DIR_WrtDate0x182最后一次写入日期
    DIR_FstClus0x1A2此条目对应开始簇号
    DIR_FileSize0x1C4文件大小

    通过访问根目录,可以得到根目录下的文件名,还有文件属性和文件地址以及最后读写日期。

    属性表示文件可读可写的权限。
    查找文件从文件开始的簇号开始
    这样就完成了文件系统的主要任务,查找文件,读写文件。

    由于根目录区的大小是不确定的,所以我们需要算一算第一个数据区的是在第几个扇区
    假设根目录区共占用RootDirSectors=[(BPB_RootEntCnt * 32) + (BPB_BytsPerSec-1)]/BPB_BytsPerSec
    之所以要加上BPB_BytsPerSec-1就是为了保证此公式在根目录区无法填满整个扇区时仍然能够成立。
    数据区开始扇区号=根目录区开始扇区号+14

    接着来说数FAT1和FAT2的作用,上文已经讲到通过一些公式可以直接查找到数据,那FAT的作用岂不是多余了吗?

    其实并不然,上文讲述的方法只能访问到小于512字节的文件,若是该文件大于一个扇区,这个时候就需要FAT出马了。

    FAT有两个,FAT2可以看作是FAT1的备份,他们通常是一样的。

    在FAT中,每12位称为一个FAT项,代表一个簇。第零个和第一个FAT项始终不用,从第2个FAT项开始表示数据区的每一个簇,也就是说,第2个FAT项表示数据区的第一个簇。这和前面提到的数据区的第一个簇号是2相呼应。

    通常FAT项的值代表的是文件下一个簇号,但如果值大于或等于0xFF8,则表示当前簇已经是本文件最后一个簇,如果值是0xFF7,表示它是一个坏簇。

    访问一个文件有如下流程,首先通过根目录文件查找文件名,确定是哪一个条目,接着在条目中访问DIR_FstClus,这个里面有对应的开始簇号,若是文件大于512字节,需要分好几个扇区来存储数据,当第一个扇区号访问完后,通过FAT可以访问下一个簇号,对应的则是下一个扇区。这样即实现了文件访问的原理。

    FAT12文件系统原理讲完了,现在来具体实现,首先按照对数据进行填充,若是我们用U盘重装过操作系统,应该会了解,这里面就是从U盘启动的第一份代码,它的主要功能自然是知道这个磁盘的相关信息,为以后继续从磁盘读取数据作准备,毕竟,操作系统还在磁盘里没有加载进来呢。

    这份代码里面呢,我继续偷个懒,只是让引导程序能够工作就行,打印个字符串就行,引导代码放在下章写(忘记了就不写了),

    ;======================================
    ;boot.asm
    ;编译方法:nasm boot.asm -o boot.bin
    ;======================================
    ;%define    _BOOT_DEBUG_  ;做Boot Sector时要注释掉 
    
    %ifdef  _BOOT_DEBUG_
        org 0100h
    %else
        org 07c00h      ;Boot状态 bios将把boot sector加载到0:07c00处开始执行
    %endif
    
        jmp short   LABEL_START
        nop
    
        ; 下面是 FAT12 磁盘的头
        BS_OEMName  DB 'ForrestY'   ; OEM String, 必须 8 个字节
        BPB_BytsPerSec  DW 512      ; 每扇区字节数
        BPB_SecPerClus  DB 1        ; 每簇多少扇区
        BPB_RsvdSecCnt  DW 1        ; Boot 记录占用多少扇区
        BPB_NumFATs DB 2        ; 共有多少 FAT 表
        BPB_RootEntCnt  DW 224      ; 根目录文件数最大值
        BPB_TotSec16    DW 2880     ; 逻辑扇区总数
        BPB_Media   DB 0xF0     ; 媒体描述符
        BPB_FATSz16 DW 9        ; 每FAT扇区数
        BPB_SecPerTrk   DW 18       ; 每磁道扇区数
        BPB_NumHeads    DW 2        ; 磁头数(面数)
        BPB_HiddSec DD 0        ; 隐藏扇区数
        BPB_TotSec32    DD 0        ; wTotalSectorCount为0时这个值记录扇区数
        BS_DrvNum   DB 0        ; 中断 13 的驱动器号
        BS_Reserved1    DB 0        ; 未使用
        BS_BootSig  DB 29h      ; 扩展引导标记 (29h)
        BS_VolID    DD 0        ; 卷序列号
        BS_VolLab   DB 'OrangeS0.02'; 卷标, 必须 11 个字节
        BS_FileSysType  DB 'FAT12   '   ; 文件系统类型, 必须 8个字节  
    
    
    LABEL_START:
        mov ax, cs
        mov ds, ax
        mov es, ax
        Call    DispStr         ; 调用显示字符串例程
        jmp $          ; 无限循环
    
    DispStr:
        mov ax, BootMessage
        mov bp, ax          ; ES:BP = 串地址
        mov cx, 16          ; CX = 串长度
        mov ax, 01301h      ; AH = 13,  AL = 01h
        mov bx, 000ch       ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
        mov dl, 0
        int 10h         ; int 10h
        ret
    
    BootMessage:        db  "Hello, OS world!"
    times   510-($-$$)   db  0   ; 填充剩下的空间,使生成的二进制代码恰好为512字节
    dw  0xaa55              ; 结束标志

    将这个代码写入磁盘引导扇区后,软盘已经能够被DOS以及linux识别了,可以方便的往上添加或删除程序了。

    展开全文
  • Linux下获取存储介质扇区大小

    千次阅读 2016-10-25 21:10:03
    通过proc文件系统获得,在proc文件系统中有一个名为partitions的文件。这个文件中包含本地磁盘的硬盘及分区信 息。根据Linux下设备命名规则,如果设备名的最后一个字符是数字就应该是分区,否则就是硬盘。 根据这...
  • linux2.6硬盘扇区直接读写程序

    千次阅读 2015-04-29 10:37:51
    下面的程序可以在linux2.6内核直接读写硬盘的指定扇区,也是根据网上一个朋友的做法做了修改的;两个不是很明白的地方就是:1、bd_claim函数的使用,这个是个递归函数,像是匹配内存指针和设备,但是调用会返回...
  • Linux下按扇区读写块设备

    千次阅读 2017-10-19 20:35:17
    Linux下按扇区读写块设备 本文介绍Linux下按扇区读写块设备(示例TF卡),实际应用是在Android系统上,主要方法如下: 1、找到sdcard的挂载点,在android2.1系统下应该为/dev/block/mmcblk0p1,或是...
  • linux 下得到磁盘物理扇区大小

    千次阅读 2013-02-04 22:09:42
    现在2T以上的磁盘其物理扇区基本上是4K大小的,在linux下要得到磁盘的物理扇区大小如下几种方式: 1.使用hdparm 工具,hdparm -I 直接查看磁盘原始提供的物理和逻辑扇区大小。 2.对于ata 设备通过ioctl 向磁盘...
  • Linux】引导扇区(boot sector)的结构

    千次阅读 2016-06-07 12:22:19
    Boot sector是硬盘(严格来说是所有可引导的存储介质)上的第一个扇区,大小为512字节,这个扇区对于计算机启动来说至关重要。  这个小小的512字节包含了很内容,主要分为三个部分,分别是:   MBR(master boot ...
  • linux内核之扇区,页,块的理解

    千次阅读 2018-03-30 14:23:24
    块:文件系统最小寻址单元,又称为文件块和io块扇区:块设备中最小寻址单元是扇区,扇区这一术语在内核中重要是因为所有设备的io必须以扇区为单位操作其中,一个页可以有多个块,一个有多扇区缓冲区:磁盘块在内存中的...
  • 在制作的我过程中出现一个问题:再写入Syslinux引导扇区时总是弹出”找到多于1个分区“的窗口,也写不了引导扇区。经过一番努力终于找到了解决办法。 准备工作:首先在电脑里卖弄安装UltraI...
  • linux引导扇区bootsect注释

    千次阅读 2012-04-29 21:56:32
    ROOT_DEV = 0x306 //指定root文件系统是第2个硬盘的第一个分区 entry start start: //移动bootsect自身到0x9000 mov ax, #BOOTSEG mov ds, ax mov ax, #INITSEG mov es, ax mov cx, #256 sub si, si sud di...
  • linux读取硬盘指定扇区

    千次阅读 2013-12-12 12:06:36
    主要参考:http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=288776&fpart=all http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=69203&page=&view=&sb=&o=&vc=1 ...
  • 3.一般的硬盘以512个字节为一个扇区 4.磁盘中一个Block的大小时扇区的倍数,PC默认设置的大小是4096的大小 5.关于文件系统(以ext2文件系统为例) 6.文件名并没有存在inode里面 7.目录项,一个目录项默认的大小时...
  • 现在,您可以将其dd到磁盘上(如果已经分区表),则不要覆盖第一个扇区上的字节446-510(因此请使用dd两次)。 您的系统现在应该使用新内核启动。 故障排除 您可以使用qemu通过运行以下命令来引导映像: qemu-...
  • 方法 获取块设备大小 ret = ioctl(fd[i], BLKGETSIZE64, &size); if (ret < 0) { printf("ioctl BLKGETSIZE64 error, errno=%d\n", errno); return -1;...lseek(fd[i], diskStart, SEEK_SET)...
  • 1. MBR简介 (1)MBR 主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导代码。...MBR扇区作为管理整个磁盘空间的一个特殊空间,它不属于磁盘上的任何分区,因而分区空间内的格式化命...
  • Linux CentOS 7引导过程 引导过程图: (1)开机自检 服务器开机后,根据主板BIOS中的设置对电脑基本设备进行初步检测,并初始化部分硬件,检查成功后根据预设的启动顺序移交系统控制权。 (2)MBR引导 ...
  • 进入linux rescue 模式: 找一张linux系统安装盘,设置光盘启动以后出现了第一个画面以后,按 F5 然后输入 linux rescue 然后,会提示你回答几个简单问题,包括语言选择等。也会提示你选择rescue映像的位置,比如:...
  • 一般来说文件可分为个块,这些块在现实世界中的物理磁盘上往往占用的扇区是不连续的,如果我想要一个文件占用一片连续的扇区,应该如何做?
  • 关于硬盘种类、物理几何结构及硬盘容量、分区、扇区[linux]大小计算    、关于硬盘种类、物理几何结构及硬盘容量、分区大小计算; 1、硬盘种类、物理几何结构 硬盘的种类主要是SCSI 、IDE 、以及现在流行...
  • 查看 磁盘第一个扇区的信息

    千次阅读 2018-06-19 18:59:36
    大家是不是经常会谈论到MBR(main boot record)。MBR是由bootloader、dpt、结尾标志组成的。简单的来说MBR=bootloader+dpt+结尾标志(55 aa)。...linux有很方便的方法。请大家接着往下看: 1、[root@centos...
  • Linux中如何读写硬盘上指定物理扇区

    千次阅读 2016-09-04 15:21:23
    读指定物理扇区: dd  if= of= skip= bs=512 count=1 写指定物理扇区: dd  if= of= seek= bs=512 count=1   实例: 我们以文件/root/linux-2.6.32.36-0.5/REPORTING-BUGS为例,该...
  • 系统读写文件过程中,如下面内核打印信息,报告读写某个扇区错误。那么我们如何能够通过sector找到读写哪个文件错误? kernel: end_request: I/O error, dev sdb, sector 41913499 2 物理扇区与文件对应关系...
  • 一个块对应磁盘上一个个相邻的扇区,而VFS系统将其看成是一个单一的数据单元。 扇区: 为了达到可接受的性能,硬盘和类似的设备快速传送几个相邻字节的数据。块设备的每次数据传输操作都是作用于一组称为...
  • 开始就被ax86写的引导扇区弄晕了。于是Google了很资料。最终实验了晚上终于搞定。下面来看看我们怎么用Windows下的MASM来写Boot Sector。因为我MASM汇编用的比较熟,所以就用MASM来写,当然,汇编只有语法...
  • 原因:创建主分区时使用了默认的sector 使用自己定义的即可

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,653
精华内容 17,461
关键字:

linux一个扇区有多大

linux 订阅