OS實驗一 操作系統的引導


草,我還以爲延時要付費呢

指令備忘

  • 編譯內核cd ./linux-0.11/然後make all
  • 刪除編譯make clean
  • 運行編譯好的內核cd ~/oslab/然後./run
  • 彙編級調試:./dbg-asm
  • C語言級調試:先cd ~/oslab然後./dbg-c;之後cd ~/oslab然後./rungdb
  • 訪問linux0.11:cd ~/oslab/然後sudo ./mount-hdc(啓動掛載腳本)之後hdc下就是和0.11內核一樣的文件系統了
  • 密碼是shiyanlou
  • 讀寫完畢,卸載文件系統cd ~/oslab/然後sudo umount hdc
  • 注意 1:不要在 0.11 內核運行的時候 mount 鏡像文件,否則可能會損壞文件系統。同理,也不要在已經 mount 的時候運行 0.11 內核。
  • 注意 2:在關閉 Bochs 之前,需要先在 0.11 的命令行運行 “sync”,確保所有緩存數據都存盤後,再關閉 Bochs。

操作系統的引導實驗

下面將給出一些更具體的 “提示”。這些提示並不是實驗的一步一步的指導,而是羅列了一些實驗中可能遇到的困難,並給予相關提示。它們肯定不會涵蓋所有問題,也不保證其中的每個字都對完成實驗有幫助。所以,它們更適合在你遇到問題時查閱,而不是當作指南一樣地亦步亦趨。本課程所有實驗的提示都是秉承這個思想編寫的。

所以還是先自己做一遍吧~難度不大

改寫bootsect.s

1.解壓縮文件

# 進入到 oslab 所在的文件夾
$ cd /home/shiyanlou/oslab/

# 解壓,並指定解壓到 /home/shiyanlou/
# 這樣的話,在 /home/shiyanlou/oslab/ 中就能找到解壓後的所有文件
$ tar -zxvf hit-oslab-linux-20110823.tar.gz \
  -C /home/shiyanlou/

# 查看是否解壓成功
$ ls -al
# 除了壓縮包 hit-oslab-linux-20110823.tar.gz 之外,其他的就是壓縮包中的內容

2.gedit打開Linux 0.11 文件夾中的 boot/bootsect.s、boot/setup.s 和 tools/build.c
3.更改關鍵代碼
bootsect.s

Print some inane message mov ah,#0x03!read cursor pos xor bh,bh int 0×10
mov Cx,#23
mov bx,#0x0007 !page 0,attribute 7(normal)
mov bp,#msg1
mov ax,#0×07c0
mov es,ax mov ax,#0x1301 !write string,move cursor int 0x10
inf loop: jmp inf loop
msg1:
	.byte 13,10
	.ascii  "treblez's OS desu"
	.byte 13,10,13,10

.org 510

boot_flag:
	.word 0xAA55

4.進行編譯

cd ./linux-0.11/然後make all

5.編譯之後得到了好多文件,之後我們編譯連接

$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o

這裏講解一下,.s.o和.S

.s 彙編語言源程序; 操作: 彙編
.S彙編語言源程序; 操作: 預處理 + 彙編
.o文件 只編譯不鏈接形成.o文件。裏面包含了對各個函數的入口標記,描述,當程序要執行時還需要鏈接(link).鏈接就是把多個.o文件鏈成一個可執行文件。

-0(注意:這是數字 0,不是字母 O)表示生成 8086 的 16 位目標程序,-a 表示生成與 GNU as 和 ld 部分兼容的代碼,-s 告訴鏈接器 ld86 去除最後生成的可執行文件中的符號信息。
6.去除bootsect中的可執行文件頭部(只留下引導扇區的512字節)

dd bs=1 if=bootsect of=Image skip=32
# 當前的工作路徑爲 /home/shiyanlou/oslab/linux-0.11/boot/
# 將剛剛生成的 Image 複製到 linux-0.11 目錄下
$ cp ./Image ../Image
# 執行 oslab 目錄中的 run 腳本
$ ../../run

然後就出現了一個從dosbox就開始寫,從virualbox也寫過,然後現在又寫了一遍的字符串顯示窗口。
在這裏插入圖片描述

改寫setup.s

bootsect.s

SETUPLEN=2
SETUPSEG=0x07e0
entry _start
_start:
    mov ah,#0x03
    xor bh,bh
    int 0x10
    mov cx,#36
    mov bx,#0x0007
    mov bp,#msg1
    mov ax,#0x07c0
    mov es,ax
    mov ax,#0x1301
    int 0x10
load_setup:
    mov dx,#0x0000
    mov cx,#0x0002
    mov bx,#0x0200
    mov ax,#0x0200+SETUPLEN
    int 0x13
    jnc ok_load_setup
    mov dx,#0x0000
    mov ax,#0x0000
    int 0x13
    jmp load_setup
ok_load_setup:
    jmpi    0,SETUPSEG
msg1:
    .byte   13,10
    .ascii  "Hello OS world, my name is LZJ"
    .byte   13,10,13,10
.org 510
boot_flag:
    .word   0xAA55

setup.s

! Print Now we are in SETUP
    mov     ax,#SETUPSEG
    mov     es,ax
    mov     ah,#0x03                ! read cursor pos
    xor     bh,bh
    int     0x10

    mov     cx,#23
    mov     bx,#0x0007              ! page 0, attribute 7 (normal)
    mov     bp,#msg_code
    mov     ax,#0x1301              ! write string, move cursor
    int     0x10
msg_code:
    .byte 13,10
    .ascii "Now we are in SETUP"
    .byte 13,10,13,10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章