电脑的启动流程详见这篇博文电脑开机过程, 简述一下就是按下电源键后, cs:ip置位到0xffff0的位置, 而这个位置是固化的, 上面都刻录好了BIOS程序, BIOS执行基本的硬件自检以及建立中断向量表, 初始化BIOS中断等, 接下来会把第一块磁盘的第一块扇区(512Byte)加载到内存为0x7c00的位置, 接下来就有kernel接管了, 不同版本的kernel的实现也是不一样的.
/arch这个目录是与架构有关的代码,不同架构的机器的特性不一样实现也不一样, 所以arch目录下有不同的机器的目录, 如下图, 而开机的代码因为刚刚启动时还在实模式下, 要由汇编去实现, 与机器的架构有关.
接下来, 我们看看常见的x86架构的目录结构
本来看这个目录, 我想着应该是bios加载bootsect, bootsect加载setup, 但我看完bootsect我发现不是的, 这个bootsect被弃用了!!!我查了下, 说是2.4版本之前是这样BIOS执行玩自己的代码后会将bootsect.S加载到0x7c00的位置, bootsect执行期间, 它会将自己移动到内存绝对地址的0x90000开始处并继续执行. bootsect的主要作用吧处于磁盘第二个扇区开始的4个扇区的setup模块(由setup.S编译而成)加载到内存紧接着bootsect后面位置处(0x902000), 接下来会把磁盘上setup模块后面的system模块加载到内存0x10000开始的地方.
2.4之后我在研究之中…下面是bootsect的注释别看了, 没用
#ifndef _LINUX_BOOT_H
#define _LINUX_BOOT_H
#define DEF_INITSEG 0x9000
#define DEF_SYSSEG 0x1000
#define DEF_SETUPSEG 0x9020
#define DEF_SYSSIZE 0x7F00
#define NORMAL_VGA 0xffff
#define EXTENDED_VGA 0xfffe
#define ASK_VGA 0xfffd
#endif
#include <asm/boot.h>
SETUPSECTS = 4
BOOTSEG = 0x07C0
INITSEG = DEF_INITSEG
SETUPSEG = DEF_SETUPSEG
SYSSEG = DEF_SYSSEG
SYSSIZE = DEF_SYSSIZE
ROOT_DEV = 0
SWAP_DEV = 0
#ifndef SVGA_MODE
#define SVGA_MODE ASK_VGA
#endif
#ifndef RAMDISK
#define RAMDISK 0
#endif
#ifndef ROOT_RDONLY
#define ROOT_RDONLY 1
#endif
.code16
.text
.global _start
_start:
# Normalize the start address
jmpl $BOOTSEG, $start2
start2:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %ss
movw $0x7c00, %sp
sti
cld
movw $bugger_off_msg, %si
msg_loop:
lodsb
andb %al, %al
jz die
movb $0xe, %ah
movw $7, %bx
int $0x10
jmp msg_loop
die:
# Allow the user to press a key, then reboot
xorw %ax, %ax
int $0x16
int $0x19
# int 0x19 should never return. In case it does anyway,
# invoke the BIOS reset code...
ljmp $0xf000,$0xfff0
bugger_off_msg:
.ascii "Direct booting from floppy is no longer supported.\r\n"
.ascii "Please use a boot loader program instead.\r\n"
.ascii "\n"
.ascii "Remove disk and press any key to reboot . . .\r\n"
.byte 0
# Kernel attributes; used by setup
.org 497
setup_sects: .byte SETUPSECTS
root_flags: .word ROOT_RDONLY
syssize: .word SYSSIZE
swap_dev: .word SWAP_DEV
ram_size: .word RAMDISK
vid_mode: .word SVGA_MODE
root_dev: .word ROOT_DEV
boot_flag: .word 0xAA55
# 我哭了!!!!!!!!!我研究了半天从2.6开始系统启动bootsect的功能已经不支持, 如果从这个文件中的bootsect启动, 则直接提示按任意键重启电脑..........平平无奇小天才, 我emo了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)