linux之 電腦上電到引導扇區之間流程

程序在上電之後,內存中什麼都沒有,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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章