linux-0.11 源码分析1

2019-04-11  本文已影响0人  滩主

项目地址

https://github.com/yuanxinyu/Linux-0.11

反汇编命令

alias lb='od -t x1 -A n'
alias obj16='objdump -d -m i8086'
alias obj32='objdump -d -m i386'
alias bin16='objdump -D -b binary -m i8086'
alias bin32='objdump -D -b binary -m i386'
objcopy --dump-section .text=kernel.text kernel.bin

gdb

make debug
gdb -ex 'set architecture i8086' -ex 'target remote localhost:1234' -ex 'b *0x7c00'
  1. hardware set cs 0xf000 ip 0xfff0 that is the address of BIOS


    boot.png
地址分布

gdb kernel

gdb tools/system
set architecture i8086
br *0x7c00
c
x/i $eip

# 单步调试
stepi
nexti

x/32b $cs*16+$pc
i r
# 查看内存地址处的值
x/16x 0x90000

gdb -ex 'set architecture i8086' -ex 'target remote localhost:1234' -ex 'b *0x7c00' -ex 'c'

x/512x 0x7c00
x/2x 0x7c00+0x1fe

# 跳过bootsect和setup的5个扇区,看kernel
lb Image -j 2560 | head

comment

若需要从硬盘设备启动系统,那么通常需要使用其他多操作系统引导程序来引导系统加载。比如:Shoelace、LILO或Grub等多操作系统引导程序。此时bootsect.s所完成的任务会由这些程序来完成。bootsect程序就不会被执行了。因为如果从硬盘启动系统,那么通常内核映像文件Image会存放在活动分区的根文件系统中。因此你就需要知道内核映像文件Image处于文件系统中的位置以及是什么文件系统。即你的引导扇区程序需要能够识别并访问文件系统,并从中读取内核映像文件

16bit 汇编

.code16
as --32 -o bootsect.o bootsect.s
ld -m elf_i386 -Ttext 0 -o bootsect bootsect.o
objcopy -R .pdr -R .comment -R.note -S -O binary bootsect
as --32 -o setup.o setup.s
ld -m elf_i386 -Ttext 0 -o setup setup.o
objcopy -R .pdr -R .comment -R.note -S -O binary setup


objcopy --dump-section .text=boot.text bootsect
head -c512 bootsect | md5sum

objcopy转换elf文件为bin文件
objcopy -O binary -R .note -R .comment -S boot.elf boot.bin
#接着将 boot.elf 转换为 boot.bin
#使用 -O binary (或--out-target=binary) 输出为原始的二进制文件
#使用 -R .note  (或--remove-section)    输出文件中不要.note这个section,缩小了文件尺寸
#使用 -S        (或 --strip-all)        输出文件中不要重定位信息和符号信息,缩小了文件尺寸
objcopy把一种目标文件中的内容复制到另一种类型的目标文件中

qemu -fda 1.img -hda los.img

unknow question

史前文明(BIOS)

BIOS AND OS Rule

硬件 BIOS OS三者的关系

以硬盘设备为线索,搞懂操作系统从识别到建立复杂的设备管理机制

los目标

上一篇下一篇

猜你喜欢

热点阅读