0%

从实时模式到保护模式的探索

0x00 前言

我知道bios最后一步会载入硬盘的第一个扇区到固定的内存里,然后,jmp到这个内存地址执行,那么问题来了,在512k内存中,要载入内核镜像,怎么确定内核映像在硬盘的中的位置,接下来分析非官方版的linux内核0.00和linux内核0.11来分析一下,注释很详细

参考 (h3ttps://github.com/voidccc/linux0.00)

0x01 linux 0.00遇到的问题

  • pwndbg插件错误我没找到合适的8086gdb插件,打算自己写一个,算了算了,还是bochs香

  • bios 0x13中断,参考https://en.wikipedia.org/wiki/INT_13H

  • bios 管理磁盘的两种模式:

    • CHS( cylinder-head-sector )简单那来说就是 柱面-磁头-扇区寻址,已经过时了
    • LEA ( logical block addressing)就是比lchs更加抽象化了,不用面向设备结构,而是抽象为逻辑块
  • 因为我环境是linux x86-x64,而head.s是32位架构的,所以直接as编译的话,就会失败,幸运的是as有一个参数是–32 就可以编译成功了

  • 如果用bochs的话得安装sdl,还得安装pkg-config

  • 因为我是archlinux 所以没有vgabios所以得指定路径,配上自己的配置文件

    • bochsrc

      1
      2
      3
      4
      5
      6
      7
      display_library: sdl
      romimage: file=/usr/share/bochs/BIOS-bochs-latest
      vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
      megs: 16
      floppya: 1_44="Image.img", status=inserted
      #ata0-master: type=disk, path="hdc.img", mode=flat, cylinders=520, heads=16, spt=63
      boot: a
    • qemu

      1
      qemu-system-i386 -sdl -smbios file=/usr/share/bochs/BIOS-bochs-latest -fda ./Image.img -L file=/usr/share/bochs/VGABIOS-lgpl-latest -boot a

    0x02 思考

    0x00 grub是怎么定位kernel镜像的位置??

    参考https://www.cnblogs.com/sky-heaven/p/5641021.html

    大概就是第一扇区不够,所以,grub需要按一定的位置放在扇区上,然后grub用第一扇区的code去调用bios中断,把剩余的grub扇区再读到内存,之后,在读文件系统!!!!!定位image镜像

    待补文件系统相关