linux之 电脑上电到引导扇区之间流程

2019-04-14 08:33发布

程序在上电之后,内存中什么都没有,Intel将所有CPU的硬件都设计为加电即进入16位实模式状态运行,同时将CPU的硬件逻辑设计为加电瞬间强行将CS的值置为0xf000,IP的值置为0xfff0,这样CS:IP就指向0xFFFF0这个地址,这个地址就是BIOS的入口地址
程序自动从这里开始执行,内存在刚上电时,里面是没有东西的,程序怎么能运行呢?这个地址究竟指向什么呢? 指向Rom BIOS程序是被固化在计算机主板上的一块很小的ROM芯片里,是计算机出产的时候被设置好的,它主要的功能就是自检,随着程序运行,屏幕上会显示显卡的信息,内存的信息,还有一项很重要的操作:BIOS在内存中建立中断向量表和中断服务程序,利用中断服务程序,可以把系统内核的程序从软盘加载到内存 在中断表和中断服务程序建立好之后,硬件体系和BIOS联合操作,使CPU接收到一个0x19中断,这个中断服务程序的主要功能就是把软盘第一个扇区中的512B加载到内存0x07c00处。 这个第一扇区的真正内容在后面介绍,这里写一个测试程序,打印一串字符,当程序运行到加载第一扇区时,会把这个测试程序加载到内存中,继而会在显示器中显示
Hello, OS world!
org 07c00h;将程序加载到0x7c00处 mov ax, cs;使ds和es指向与cs相同的段 mov ds, ax; mov es, ax; call DispStr;调用DispStr jmp $;死循环 DispStr: mov ax, BootMessage;将会把字符串的首地址传给bp mov bp, ax; es:bp 串地址 mov cx, 16; 串长度 mov ax, 01301h; ah = 13 al = 01 mov bx, 000ch; 页号为0 bh=0 黑底红字bl=0ch mov dl, 0; int 10h; 10h号中断 ret; 返回 BootMessage: db "Hello, OS world!"; times 510 - ($-$$) db 0; 填充剩下的空间为0 $-$$本行距离开始处的相对距离 dw 0xaa55; 加上 结束标志 刚好512字节 运行脚本 #!/bin/bash nasm boot.asm -o boot.img dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc bochs -f bochsrc