網易雲課堂《linux內核分析》第二章做業

////////////////////////////////////////////////////////////////////////////////////////////html

/////////////////////////////////實現「進程」切換///////////////////////////////////////////ios

 ///////////////////////////////////////////////////////////////////////////////////////////git

沒有使用Linux內核代碼,而是從頭實現了一個「操做系統」,因爲沒有切換到X86 CPU的保護模式,在實模式下甚至沒法使用C語言,僅用匯編對「進程」切換作一個演示。github

 

 

實驗要求:函數

    • 完成一個簡單的時間片輪轉多道程序內核代碼,代碼見視頻中或從mykernel找。oop

    • 詳細分析該精簡內核的源代碼並給出實驗截圖,撰寫一篇署名博客,並在博客文章中註明「真實姓名(與最後申請證書的姓名務必一致) + 原創做品轉載請註明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 」,博客內容的具體要求以下:編碼

      • 題目自擬,內容圍繞操做系統是如何工做的進行;spa

      • 博客中須要使用實驗截圖操作系統

      • 博客內容中須要仔細分析進程的啓動和進程的切換機制code

      • 總結部分須要闡明本身對「操做系統是如何工做的」理解。

    • 3)請提交博客文章URL到網易雲課堂MOOC平臺Linux內核分析MOOC課程,編輯成一個連接能夠直接點擊打開。

原文連接

 

  • 第一步,首先實現一個能夠引導程序,從引導扇區啓動系統
 1 org        07c00h            #bios從該地址開始啓動操做系統
 2 entry:
 3     MOV        AX,    0
 4     MOV        SS,    AX
 5     MOV        SP,    0x7c00
 6     MOV        DS,    AX
 7     MOV        ES,    AX
 8     MOV        SI,    msg
 9 
10     MOV        AH,    0x00
11     MOV        AL,    0x03
12     INT        10H
13 
14 putloop:
15     MOV        AL,    [SI]
16     ADD        SI,    1
17     
18     CMP        AL,    0
19     JE        fin
20 
21     MOV        AH,    0x0e
22     MOV        BH,    15
23     INT        0x10
24     JMP        putloop
25 fin:
26     HLT
27     JMP        fin
28 msg:
29     DB        0x0a,0x0a
30     DB        "hello, world"
31     DB        0x0a
32     DB        0
33 
34     times    510-($-$$)    DB    0    # $指當前指令地址  $$指程序第一條指令地址  該語句表示:從當前指令到510字節填充0
35     dw        0xaa55            #引導程序最後兩字節約定爲 0xaa55

使用命令將彙編編譯成二進制文件

將boot.bin製做成img磁盤鏡像文件boot.img

虛擬機中啓動運行結果

 啓動過程,bios將上述程序讀入內存0x7c00,並今後處開始執行,程序是很簡單的Hello World。printf()等庫函數固然沒法使用。

  • 第二步,對進程切換進行演示編碼
  1     BootLoaderStackPointer equ 0x8300
  2 org        07c00h
  3 entry:
  4     MOV        AX,    0
  5     MOV        SS,    AX
  6     MOV        SP,    BootLoaderStackPointer
  7     MOV     BP,    BootLoaderStackPointer
  8     MOV        DS,    AX
  9     MOV        ES,    AX
 10     MOV        SI,    msgA
 11     
 12     MOV        AH,    0x00
 13     MOV        AL,    0x03
 14     INT        10H
 15     
 16     call    ProcesA
 17     call     fin
 18 
 19 delay:
 20     PUSH    AX
 21     MOV     AX,    0x1000
 22     MOV     [0x8000],    AX
 23 
 24     loopX:
 25     MOV     AX,    0xA000
 26     MOV        [0x8002],    AX
 27     MOV        AX,    [0x8000]
 28     sub        AX,    1
 29     MOV        [0x8000],    AX
 30     CMP        AX,    0
 31     JE        endloop
 32     loopY:
 33     MOV     AX,    [0x8002]
 34     sub        AX,    1
 35     MOV        [0x8002],    AX
 36     CMP        AX,    0
 37     JE        loopX
 38     JMP        loopY
 39 endloop:
 40     POP     AX
 41     ret
 42     
 43     
 44 ;打印 SI 開始到 0 結束的字符串
 45 print:
 46     push     AX
 47     push    BX
 48     push    SI
 49 putloop:    
 50     MOV        AL,    [SI]
 51     ADD        SI,    1
 52     
 53     CMP        AL,    0
 54     JE        putloopret
 55 
 56     MOV        AH,    0x0e
 57     MOV        BH,    15
 58     INT        0x10
 59     JMP        putloop
 60 putloopret:
 61     pop        SI
 62     pop        BX
 63     pop        AX
 64     ret
 65 fin:
 66     HLT
 67     JMP        fin
 68 ProcesA:
 69     MOV        SI,    msgA
 70     call    print
 71     call     delay
 72     MOV        SI,    msgB
 73     call     SwitchProcess
 74     call    print
 75     call    delay
 76     call    fin
 77 ProcesB:
 78     MOV     SI,    msg
 79     call    print
 80     call    delay
 81     call    FinishProcess
 82 SwitchProcess:
 83     MOV        [0x8400],    AX        ;AX
 84     MOV        [0x8402],    SI        ;SI
 85     pop        AX
 86     MOV        [0x8404],    AX        ;IP
 87     MOV        AX,    ProcesB
 88     push    AX
 89     ret
 90 FinishProcess:
 91     MOV        SI,    [0x8402]        ;SI
 92     MOV        AX,    [0x8404]        ;IP
 93     push    AX
 94     MOV        AX,    [0x8400]        ;AX
 95     ret
 96 msg:
 97     DB        0x0a,0x0a
 98     DB        "Process  B----1"
 99     DB        0x0d,0x0a
100     DB        0
101 msgA:
102     DB         0x0a,0x0a
103     DB         "Process  A----1"
104     DB         0x0d,0x0a
105     DB        0
106 msgB:
107     DB        0x0a,0x0a
108     DB         "Process  A----2"
109     DB        0x0d,0x0a
110     DB        0
111     
112     times    510-($-$$)    DB    0
113     dw        0xaa55

虛擬機運行結果

 

代碼解析:這段代碼主要切換「進程」的代碼是SwitchProcessFinishProcess段代碼,SwitchProcess只對咱們關心的SI寄存器進行了現場保護(內存0x8402),IP寄存器存入內存0x8404,並調用ProcessB進程,等待系統調度完成後,再經過FinishProcess恢復ProcessA進程現場。

這段代碼固然不具有通常使用的意義

總結:

  題目要求總結部分須要闡明本身對「操做系統是如何工做的」理解。

  每種操做系統根據用途不一樣,工做方式也不相同,甚至工做都不相同,硬要總結的話,只能說爲應用程序和硬件直接創建橋樑

     By:魏文鵬

參考

《本身動手寫操做系統》ISBN 7-121-01577-3

《30天自制操做系統》 ISBN 978-7-115-28796-0

相關文章
相關標籤/搜索