国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

嵌入式操作系統(tǒng)課程作業(yè)之Write OS

2019-11-17 04:48:35
字體:
來源:轉載
供稿:網(wǎng)友

嵌入式操作系統(tǒng)課程作業(yè)之Write OS

姓名:唐良          學號: 024304xxxx 

一.     編譯器的下載

1. Djgpp

在Windows開發(fā)環(huán)境下,沒有直接提供gcc編譯器,所以需要從自己去下載WINDOWS版本的gcc編譯器.Windows下有cygwin, devcpp, djgpp等工具都帶有gcc編譯器.但是djgpp最小,而且可以產(chǎn)生最單純的binary代碼,所以很多關于操作系統(tǒng)編寫的網(wǎng)站上都推薦使用djgpp. 

2. Nasm

Nasm和masm,以及as86等都很類似,都是支持16位和32位的匯編編譯器.但是nasm使用起來比較輕活,能夠產(chǎn)生多種中間代碼格式,比如*.obj,*.o等,所以很多操作系統(tǒng)編寫的網(wǎng)站上也都推薦使用nasm作為匯編編譯器. 

二. boot啟動代碼的編寫

       Boot啟動代碼主要完成轉載kernel,進入32為模式等工作.除開linux的”標準”代碼外,網(wǎng)上關于boot啟動的模板代碼多不勝數(shù),不過我使用的還是哈工大的pyos的啟動代碼.       Boot.s的代碼如下: [BITS 16][ORG 0x7C00]       jmp  main ; ----------------------------------------------------------------------------------------------; 數(shù)據(jù)定義bootdrive db    0; ----------------------------------------------------------------------------------------------; GDT 定義gdt:       gdt_null:              dd    0              dd    0            ; 空描述符全是0
        gdt_code_addr equ $ - gdt     ; 數(shù)據(jù)段在GDT表中的位置       gdt_code:              dw   0xffff             ; 段大小為4GB              dw   0            ; 基址的低16位              db    0            ; 基址的高八位              db    10011010b                    db    11001111b              db    0        gdt_data_addr equ $ - gdt      ; 數(shù)據(jù)段在GDT表中的位置       gdt_data:              dw   0xffff              dw   0x0000               db    0              db    10010010b              db    11001111b              db    0      
       gdt_end:       gdt_addr:              dw   gdt_end - gdt - 1    ; GDT 表的大小              dd    gdt                 ; GDT 表的位置; --------------------------------------------------------------------------------------main:       mov [bootdrive] , dl       ; 他得到啟動的驅動器號       xor ax , ax             ; 設置 DS       mov ds , ax        ; 清屏       ;mov ax , 3            ; 設置清屏功能號       ;int 0x10         ; 調用 BIOS 10 號中斷清屏        .ResetFloppy          ; 重置磁盤       mov ax , 0             ; 設置重置磁盤的功能號       mov dl , [bootdrive]       ; 選擇啟動磁盤       int 0x13       jc .ResetFloppy             ; 假如出錯則重試 
       .ReadFloppy          ; 讀內核到內存中 0000:9000 (es:bx)處       xor ax , ax             ; 設置 es 寄存器       mov es , ax        mov bx , 0x9000       mov ah , 2             ; 設置讀磁盤功能號       mov dl , [bootdrive]       ; 設置欲讀驅動器號       mov ch , 0             ; 磁頭號       mov cl , 2              ; 起始扇區(qū)號       mov al , 17            ; 讀入扇區(qū)數(shù)量           int 13h                  jc .ReadFloppy              mov dl , [bootdrive]              ; 停止驅動器       mov edx , 0x3f2       mov al , 0x0c       out dx , al        cli                         ; 關中斷         lgdt [gdt_addr]                      ; 載入 GDT 的描述符                                      
        mov eax , cr0               ; 下面三句設置 cr0 的第 0 位(PE位)為1,表示進入保護模式         or eax , 1                                                                                mov cr0 , eax                   jmp gdt_code_addr:code_32  ; 跳入32位的代碼段中  [BITS 32]code_32:       mov ax , gdt_data_addr  ; 以下三句設置 DS,ES,SS,F(xiàn)S,GS的置為數(shù)據(jù)段描述表的位置       mov ds , ax       mov es , ax       mov ss , ax        mov fs , ax        mov gs , ax        mov esp , 0xffff            ; 設置堆棧的頭指針                          jmp gdt_code_addr:0x9000    ; 跳入內核;---------------------------------------------------------------------------times 510-($-$$) db 0db 0x55
db 0xAA 

三. 編譯boot啟動代碼

       nasm十分簡單. 可以很輕易生成bin文件.它默認生成的也是bin原始代碼.直接輸入nasmw boot.s就能夠得到boot原始代碼.       然后將通過WinHex將boot的全部代碼復制到一張1.44MB的軟盤鏡像文件的頭512的字節(jié)中去.可以通過Bochs,Virtual PC,VMWare來建立軟件鏡像文件.這些軟件的軟盤鏡像文件都是原始數(shù)據(jù)文件,沒有任何關于軟盤的配置數(shù)據(jù),所以直接通過WinHex中的Ctrl+C和Ctrl+B(千萬不能是Ctrl+V)就可以完成復制了. 

四. 編寫顯示內核進入裝載的C代碼

       假如按照pyos的第二個實驗來做,我得到的C語言生成的代碼是.data數(shù)據(jù)段放在了.text代碼段前面,就不能直接一下jmp 0x9000進入kernel的初始程序的代碼段.后來我參考了網(wǎng)上一些做法,有種辦法是編寫link.script的連接腳本,有些是增加一個類似crt0.s的C語言啟動匯編.我選擇的是后者.

1. 編寫C代碼

char* msg = "Welcome to SCU Operation System!Version 0.0001 by tangl_99" ;void k_main(){       unsigned char* videomem = ( unsigned char* )0xb8000 ;       while( *msg != '/0' ){              *videomem++ = *msg++ ;              *videomem++ = 0x1b ;         }       for(;;);}這里使用k_main作為入口函數(shù),有別于通常的main入口函數(shù). 

2. 編寫crt0.s啟動代碼

[BITS 32][global start][extern _k_main] ; this is in the c file start:
  call _k_main   cli  ; stop interrupts  hlt ; halt the CPU 

3. 編譯連接kernel初始程序

       編譯連接部分我就沒有參照pyos的做法了.根據(jù)網(wǎng)絡的通常的做法,我的編譯連接命令如下:setdjgpp d:/djgpp d:/djgpp                  # djgpp需要預先設置一下gcc –c kernel.cnasmw –f aout crt0.sld -nostartfiles --oformat binary -Ttext 0x9000 -o kernel crt0.o kernel.o最后會生成1024字節(jié)大小的 kernel原始代碼文件.還是通過WinHex將其復制到軟盤鏡像文件,要從第512個字節(jié)位置開始復制. 

五. 在Virtual PC下啟動運行生成OS 軟盤鏡像文件

       Virtual PC的使用就不再多說了,Virtual PC應該是Windows下最輕易使用的模擬器.下面是運行0.0001版本的截圖:  嵌入式操作系統(tǒng)課程作業(yè)之Write OS
點擊查看大圖
>(出處:清風軟件下載學院)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 禹州市| 诏安县| 客服| 承德县| 平定县| 都安| 盖州市| 龙山县| 灵石县| 武夷山市| 甘肃省| 铜川市| 罗城| 临朐县| 鹤岗市| 兴宁市| 晋宁县| 崇阳县| 乌审旗| 嘉义县| 武宁县| 衡东县| 昂仁县| 固镇县| 浦北县| 扎鲁特旗| 云和县| 宁陵县| 县级市| 通许县| 荆州市| 吉安县| 金昌市| 上饶市| 洛南县| 南陵县| 平谷区| 措勤县| 闽清县| 锡林郭勒盟| 二手房|