////////////////////////////////////////////////////////////////////////////////////////////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
虛擬機運行結果
代碼解析:這段代碼主要切換「進程」的代碼是SwitchProcess和FinishProcess段代碼,SwitchProcess只對咱們關心的SI寄存器進行了現場保護(內存0x8402),IP寄存器存入內存0x8404,並調用ProcessB進程,等待系統調度完成後,再經過FinishProcess恢復ProcessA進程現場。
這段代碼固然不具有通常使用的意義
總結:
題目要求總結部分須要闡明本身對「操做系統是如何工做的」理解。
每種操做系統根據用途不一樣,工做方式也不相同,甚至工做都不相同,硬要總結的話,只能說爲應用程序和硬件直接創建橋樑
By:魏文鵬
參考
《本身動手寫操做系統》ISBN 7-121-01577-3
《30天自制操做系統》 ISBN 978-7-115-28796-0