一步一步實現乙個簡單的OS HelloWorld

2021-07-10 05:04:50 字數 1934 閱讀 2878

先弄個helloworld吧,雖然這個網上一大堆,不過不知道的人還是不少,就簡單的弄乙個吧。。。。。。。

系統啟動時,第一步是bios自檢(這個不管),然後從cmos中設定的預設引導介質中載入第乙個扇區(512位元組)到記憶體的0x07c00處(0x0000:0x7c00),

之後,跳轉執行。

所以,引導啟動系統的第一部分就是對這512位元組進行程式設計。。。

這次呢,就寫乙個簡單的helloworld(啟動後,在螢幕顯示helloworld)。

其它功能不考慮,

下面我就開始整了,思想有寫亂,你們講究的看吧。

顯示服務(video service——int 10h)

13h號功能

入口:ah = 13h

bh = 頁碼(咱用0號的)

bl = 字元屬性

cx = 字串長度

dh,dl = (x, y) 座標

es:bp = 字串位址

ok開始吧

# bootasm.s    這裡,副檔名必須大寫,具體為什麼,問gcc去

.globl start

start: # 入口位址

# 初始化各個段暫存器

movw %cs, %ax

movw %ax, %ds

movw %ax, %es

movw %ax, %ss

# 設定棧頂movw $0x7c00, %sp

# 清一下螢幕吧。。。。

movw $0x02, %ax

int $0x10

# 顯示hello world !!!

movw $putstr, %bp

movb $0x13, %ah

movb $0x01, %al

movb $0x00, %bh

movb $0x0f, %bl

movw $14, %cx # 14個字元

xorw %dx, %dx # 顯示座標為(0, 0)

int $0x10

# 死迴圈,停機

1: hlt

jmp 1b

putstr:

.ascii "hello world!!!"

.byte 0

# 後面要多空開一行,不然編譯不通過

編譯命令為:

gcc -fno-builtin -o2 -md -nostdinc -i. -c bootasm.s

ld -n -e start -ttext 0x7c00 -o boot.o bootasm.o

最後把鏈結出來的boot.o轉換為bin檔案

objcopy -s -o binary -j .text boot.o boot

然後需要將boot擴充套件到512位元組,

最後兩個位元組設定為

0x55, 0xaa

這是引導標誌。

到這裡,**就編譯完畢了。

用dd命令把boot寫入硬碟映象中

dd if=/dev/zero of=os0.00.img count=10000        # 建立乙個硬碟映象檔案os0.00.img

dd if=boot of=os0.00.img     # 把boot寫入映象開頭,就是第乙個扇區處

這個是截圖:

然後就跑一下,看看效果吧。。。。

今天就到這裡吧,。。。。。後面慢慢的往裡面加功能

先整個簡單的。。。

一步一步實現乙個簡單的OS 載入核心

這一塊更新的 比較多,所以就不方便全部貼出來了。具體的 大家直接到群裡面找就可以了 os0.3 另外,我配置了bochs虛擬機器,這樣大家載下來就可以使用bochs虛擬機器直接除錯了。下面我就直接貼一下主要的 吧,setupasm.s 這裡,跳轉到c函式直接call就可以了 start32 初始化保...

一步一步實現乙個簡單的OS 異常處理

簡單的對idt進行初始化,實現系統異常顯示 mmu裡面有大部分巨集定義是抄 自己動手寫作業系統裡面的pm.inc檔案中的 main.c 核心入口 int kmain traps.c 初始化,異常處理 void init traps 裝載idt lidt sys traps,sizeof struct...

一步一步實現FormsAuthentic驗證登入

本文不講原理,只講用法,原理性的東西網上特別多,不過還是會對一些要用到的東西進行解釋,不深入講原理。本文中用的是vs2012 net mvc 4.0。原理看這篇文章 看完這個文章絕對受益匪淺。說下登入的整個流程 使用者輸入賬號密碼 點選提交 資料提交到後台控制器 去資料庫取得使用者資料 如果登入成功...