日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader

發布時間:2023/12/13 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

直接看代碼,即使已經理解了代碼,但是還是會有種沒有學到手的感覺.真正的掌握來自實踐,來自己動手做出來.“簡單AB任務切換程序”系列文章的目的是,在bochs下,實踐出簡單AB兩個任務的切換.

1. bochs安裝或者編譯參考

Ubuntu10.04搭建linux-0.11編譯環境(1.bochs安裝和使用)

Ubuntu10.04搭建linux-0.11編譯環境(2.bochs編譯)

2. 實現一個最簡單的bootloader

(1)bootloader,顧名思義boot + loader,我們現在只實現boot,loader其實就是簡單bios中斷調用,后面接觸.

(2)此處使用匯編語言,匯編和連接器分別為as86和ld86,ubuntu下sudo apt-get install bin86即可

(3)代碼boot.s

.globl begtext,begdata,begbss,endtext,enddata,endbss????????????????????????????????????????????????????????????????????????????????????
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSEG = 0x07c0

entry start
start:
??? jmpi go,BOOTSEG

go:
??? mov ax,cs
??? mov ds,ax
??? mov es,ax

??? mov ax,#0x0600
??? mov cx,#0x0000
??? mov dx,#0xFFFF
??? int 0x10

??? mov cx,#20
??? mov dx,#0x0000
??? mov bx,#0x000c
??? mov bp,#msg1
??? mov ax,#0x1301
??? int 0x10

loop0: jmp loop0

msg1: .ascii "Loading system ..."
????? .byte 13,10

.org 510
??? .word 0xAA55

(4)分析

.globl begtext,begdata,begbss,endtext,enddata,endbss????????????????????????????????????????????????????????????????????????????????????
.text
begtext:
.data
begdata:
.bss
begbss:
.text

以上幾句告訴匯編器和連接器要聲明的全局符號,同時說明程序的所有段都從一個基地址開始.

BOOTSEG = 0x07c0

entry start
start:
??? jmpi go,BOOTSEG

go:

entry start告訴匯編器程序的入口是start符號

因為我們這段是引導代碼,引導代碼在引導盤的指定位置處,bios會默認讀出來放到內存0x7c00:0x0處,所以所有的段基地址其實都是0x7c00.

jmpi do,BOOTSEG是跳轉到0x7c00:go處執行,go其實是個相對當前jmpi do,BOOTSEG這條指令的一個偏移,假設是5,這句話其實是跳到了0x7c00:0x5處執行,同時一個作用是隱含地設置了cs為0x7c00,這句話可以不用直接替換后邊的mov ax,cs:

mov ax,#BOOTSEG或者mov ax,0x7c00

??? mov ax,cs
??? mov ds,ax
??? mov es,ax

以上幾句設置了ds和es段與cs保持相同,因為程序中聲明了代碼數據附加段都是一個基地址的

??? mov ax,#0x0600
??? mov cx,#0x0000
??? mov dx,#0xFFFF
??? int 0x10

以上幾句調用bios的0x10中斷,清屏.關于bios中斷不用了解許多,知道用法能查手冊即可,手冊網絡上有很多.

??? mov cx,#20
??? mov dx,#0x0000
??? mov bx,#0x000c
??? mov bp,#msg1
??? mov ax,#0x1301
??? int 0x10

以上幾句調用了bios的0x10中斷,顯示一個字符串msg1

loop0: jmp loop0

看以看出來是無限循環

msg1: .ascii "Loading system ..."
????? .byte 13,10

定義字符串

.org 510
??? .word 0xAA55

在510位置后定義0xAA55,啟動扇區標志.

3.編譯調試bootloader

前邊說過使用的as86匯編器和ld86連接器,使用bochs模擬器.

bochs支持虛擬的軟盤和硬盤,因為軟盤簡單一些,所以我們把程序編譯后少些到軟盤上即可啟動了.

(1)編譯boot.s

as86 -0 -a -o boot.o boot.s

boot.s是源碼,boot.o是編譯輸出

(2)鏈接boot.o

ld86 -0 -s -o boot boot.o

boot.o是(1)的輸出,boot是鏈接輸出

(3)制作虛擬軟盤

dd bs=32 if=boot of=boot.img skip=1

因為boot前32字節是文件頭,所以要跳過不寫,把后邊的所有內容寫進boot.img

至此boot.img就是做好的可啟動的虛擬軟盤了


4. 運行與bochs調試

(1)bochs配置

bochs配置文件bochsrc.txt如下:

? config_interface: textconfig

? romimage: file=/usr/local/share/bochs/BIOS-bochs-latest?

? megs: 16

? vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest

? floppya: 1_44="boot.img", status=inserted

? boot: a

? vga_update_interval: 300000

? keyboard_paste_delay: 100000

? keyboard_serial_delay: 200

? cpu: count=1, ips=1000000

? mouse: enabled=0

? private_colormap: enabled=0

? fullscreen: enabled=0

? screenmode: name="sample"

? i440fxsupport: enabled=0

(2)運行

當前目錄下執行bochs

(3)bochs調試命令

c - 繼續

pb 0x7c00 - 在0x7c00處設置斷點

n - 執行下一步

u 0x10000 - 反匯編0x10000區域


本文完.

轉載于:https://www.cnblogs.com/linucos/archive/2012/04/01/2428262.html

總結

以上是生活随笔為你收集整理的linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。