1. 程式人生 > >30天自制操作系統 筆記(1)

30天自制操作系統 筆記(1)

byte 再次 mode sed oos 30天自制操作系統 bits color oba

打印"hello,world!":

技術分享圖片
 1 ; hello-os
 2 ; TAB=4
 3 
 4         ORG        0x7c00            ; 將代碼裝載到內存0x7c00處
 5 
 6 ; 以下是標準FAT12軟盤專用代碼
 7 
 8         JMP        entry
 9         DB        0x90
10         DB        "HELLOOS"        ; 啟動區名稱(任意字符串,長度必須為8字節)
11         DW        512                ; 每個扇區的大小(必須為512)
12 DB 1 ; 簇的大小(必須為1) 13 DW 1 ; FAT的起始位置(一般從第一扇區開始) 14 DB 2 ; FAT的個數(必須為2) 15 DW 224 ; 根目錄的大小(一般設置成如此即可) 16 DW 2880 ; 磁盤大小(必須為2880) 17 DB 0xf0 ;
磁盤的種類(必須為0xf0) 18 DW 9 ; FAT的長度(必須是9扇區) 19 DW 18 ; 1個磁道的所包含的扇區數(必須為18) 20 DW 2 ; 磁頭數(必須為2) 21 DD 0 ; 不使用分區,必須是0 22 DD 2880 ; 重寫磁盤大小 23 DB 0,0,0x29 ;
意義不明,固定 24 DD 0xffffffff ; 可能是卷標號碼 25 DB "HELLO-OS " ; 磁盤名(11字節) 26 DB "FAT12 " ; 磁盤格式(8字節) 27 RESB 18 ; 空出18字節 28 29 ; 程序核心 30 31 entry: 32 MOV AX,0 ; 初始化寄存器 33 MOV SS,AX 34 MOV SP,0x7c00 35 MOV DS,AX 36 MOV ES,AX 37 38 MOV SI,msg 39 putloop: 40 MOV AL,[SI] 41 ADD SI,1 ; 給SI加1 42 CMP AL,0 43 JE fin 44 MOV AH,0x0e ; 顯示一個文字 45 MOV BX,15 ; 選定字符顏色 46 INT 0x10 ; 調用顯卡BIOS 47 JMP putloop 48 fin: 49 HLT ; 使CPU停止 50 JMP fin ; 無限循環 51 52 msg: 53 DB 0x0a, 0x0a ; 兩次換行 54 DB "hello, world" 55 DB 0x0a ; 再次換行 56 DB 0 57 58 RESB 0x7dfe-$ ; 填充剩余字節 59 60 DB 0x55, 0xaa
hello,world

(註:啟動區內容的裝載地址為,0x00007c00至0x00007dff)

真正的IPL:

技術分享圖片
  1 ; haribote-ipl
  2 ; TAB=4
  3 
  4 CYLS    EQU        10                
  5 
  6         ORG        0x7c00            
  7 
  8 
  9 
 10         JMP        entry
 11         DB        0x90
 12         DB        "HARIBOTE"        
 13         DW        512                
 14         DB        1                
 15         DW        1                
 16         DB        2                
 17         DW        224                
 18         DW        2880            
 19         DB        0xf0            
 20         DW        9                
 21         DW        18                
 22         DW        2                
 23         DD        0                
 24         DD        2880            
 25         DB        0,0,0x29        
 26         DD        0xffffffff        
 27         DB        "HARIBOTEOS "    
 28         DB        "FAT12   "        
 29         RESB    18                
 30 
 31 
 32 
 33 entry:
 34         MOV        AX,0            
 35         MOV        SS,AX
 36         MOV        SP,0x7c00
 37         MOV        DS,AX
 38 
 39 
 40         MOV        AX,0x0820
 41         MOV        ES,AX
 42         MOV        CH,0            
 43         MOV        DH,0            
 44         MOV        CL,2            
 45 readloop:
 46         MOV        SI,0            
 47 retry:
 48         MOV        AH,0x02            
 49         MOV        AL,1            
 50         MOV        BX,0
 51         MOV        DL,0x00            
 52         INT        0x13            
 53         JNC        next            
 54         ADD        SI,1            
 55         CMP        SI,5            
 56         JAE        error            
 57         MOV        AH,0x00
 58         MOV        DL,0x00            
 59         INT        0x13            
 60         JMP        retry
 61 next:
 62         MOV        AX,ES            
 63         ADD        AX,0x0020
 64         MOV        ES,AX            
 65         ADD        CL,1            
 66         CMP        CL,18            
 67         JBE        readloop        
 68         MOV        CL,1
 69         ADD        DH,1
 70         CMP        DH,2
 71         JB        readloop        
 72         MOV        DH,0
 73         ADD        CH,1
 74         CMP        CH,CYLS
 75         JB        readloop        
 76 
 77 
 78 
 79         MOV        [0x0ff0],CH        
 80         JMP        0xc200
 81 
 82 error:
 83         MOV        SI,msg
 84 putloop:
 85         MOV        AL,[SI]
 86         ADD        SI,1            
 87         CMP        AL,0
 88         JE        fin
 89         MOV        AH,0x0e            
 90         MOV        BX,15            
 91         INT        0x10            
 92         JMP        putloop
 93 fin:
 94         HLT                        
 95         JMP        fin                
 96 msg:
 97         DB        0x0a, 0x0a        
 98         DB        "load error"
 99         DB        0x0a            
100         DB        0
101 
102         RESB    0x7dfe-$        
103 
104         DB        0x55, 0xaa
IPL

導入C語言:

1 void io_hlt(void);
2 
3 void HariMain(void)
4 {
5 fin:
6     io_hlt();
7     goto fin;
8 }

本書作者為大家配備的函數庫(匯編):

技術分享圖片
BOTPAK    EQU        0x00280000    
DSKCAC    EQU        0x00100000    
DSKCAC0    EQU        0x00008000    

CYLS    EQU        0x0ff0        
LEDS    EQU        0x0ff1
VMODE    EQU        0x0ff2        
SCRNX    EQU        0x0ff4        
SCRNY    EQU        0x0ff6        
VRAM    EQU        0x0ff8        

        ORG        0xc200        


        MOV        AL,0x13        
        MOV        AH,0x00
        INT        0x10
        MOV        BYTE [VMODE],8
        MOV        WORD [SCRNX],320
        MOV        WORD [SCRNY],200
        MOV        DWORD [VRAM],0x000a0000


        MOV        AH,0x02
        INT        0x16         
        MOV        [LEDS],AL


        MOV        AL,0xff
        OUT        0x21,AL
        NOP                    
        OUT        0xa1,AL

        CLI                    


        CALL    waitkbdout
        MOV        AL,0xd1
        OUT        0x64,AL
        CALL    waitkbdout
        MOV        AL,0xdf        
        OUT        0x60,AL
        CALL    waitkbdout


[INSTRSET "i486p"]            

        LGDT    [GDTR0]        
        MOV        EAX,CR0
        AND        EAX,0x7fffffff
        OR        EAX,0x00000001
        MOV        CR0,EAX
        JMP        pipelineflush
pipelineflush:
        MOV        AX,1*8        
        MOV        DS,AX
        MOV        ES,AX
        MOV        FS,AX
        MOV        GS,AX
        MOV        SS,AX


        MOV        ESI,bootpack
        MOV        EDI,BOTPAK    
        MOV        ECX,512*1024/4
        CALL    memcpy



        MOV        ESI,0x7c00    
        MOV        EDI,DSKCAC    
        MOV        ECX,512/4
        CALL    memcpy


        MOV        ESI,DSKCAC0+512
        MOV        EDI,DSKCAC+512
        MOV        ECX,0
        MOV        CL,BYTE [CYLS]
        IMUL    ECX,512*18*2/4
        SUB        ECX,512/4    
        CALL    memcpy



        MOV        EBX,BOTPAK
        MOV        ECX,[EBX+16]
        ADD        ECX,3        
        SHR        ECX,2        
        JZ        skip        
        MOV        ESI,[EBX+20]
        ADD        ESI,EBX
        MOV        EDI,[EBX+12]
        CALL    memcpy
skip:
        MOV        ESP,[EBX+12]
        JMP        DWORD 2*8:0x0000001b

waitkbdout:
        IN         AL,0x64
        AND         AL,0x02
        JNZ        waitkbdout    
        RET

memcpy:
        MOV        EAX,[ESI]
        ADD        ESI,4
        MOV        [EDI],EAX
        ADD        EDI,4
        SUB        ECX,1
        JNZ        memcpy        
        RET

        ALIGNB    16
GDT0:
        RESB    8            
        DW        0xffff,0x0000,0x9200,0x00cf
        DW        0xffff,0x0000,0x9a28,0x0047

        DW        0
GDTR0:
        DW        8*3-1
        DD        GDT0

        ALIGNB    16
bootpack:
ASMHEAD

導入C語言需要的函數:

技術分享圖片
[FORMAT "WCOFF"]            
[BITS 32]                    

[FILE "naskfunc.nas"]        

        GLOBAL    _io_hlt        

[SECTION .text]    

_io_hlt:
        HLT
        RET
funcs

30天自制操作系統 筆記(1)