30天自制操作系统笔记
注意:第八天之后才開始動手寫程序,要將之前的運算過程添加到后面
開發操作系統,步驟:
1 在Windows或其他系統上編寫源代碼
2 用C語言編譯器編譯源代碼,生成機器語言文庫
3 對機器語言文件進行加工,生成軟盤映像文件
4 對映像文件寫入磁盤,做成含操作系統的啟動盤
啟動區 軟盤的第一個扇區(扇區為512個字節)叫做啟動區。計算機從最初一個扇區開始讀軟盤,最后去檢查這個扇區最后兩個字節的內容,如果不是55AA,就會認為這張盤上沒有所需的啟動程序。
IPL 啟動程序加載器
16位寄存器
ax accumulator 累加寄存器
cx counter 計數寄存器
dx data 數據寄存器
bx base 基址寄存器
sp stack pointer 棧指針寄存器
bp base pointer 基址指針寄存器
si source index 源變址寄存器
di destination index 目的變址寄存器
8位寄存器
al accumulator low 累計寄存器低位
cl
dl
bl
ah
ch
dh
bh
段寄存器(16位)
ES --沒有名稱 extra segment
CS --代碼段寄存器 code segment
SS --棧段寄存器 stack segment
DS --數據段寄存器 data segment
FS --沒有名稱 segment part 2
GS --沒有名稱 segment part 3
ORG 指令,告訴匯編程序,開始執行時將某段機器語言裝在到內存的哪個地址,由于不是匯編的直接指令,故稱為偽指令
例:
RESB 0x1fe-$ 填寫0x00,直到0x001fe
ORG 2000H 告訴編譯器這里偏移直接調轉到2000H
/*磁盤讀,寫,扇區檢驗(verify),尋道(seek)
AH=0X02;讀磁盤
AH=0X03;寫磁盤
AH=0X04;校驗
AH=0X0C;尋道
AL=處理對象的扇區數;(只能同時處理連續的扇區)
CH=柱面號&0xff;
CL=扇區號(0-5位)|(柱面號&0x300)>>2;
DH=磁頭號;
DL=驅動器號;
ES:BX=緩沖地址;(校驗及尋道時不使用)
FLAGS.CF0:沒有錯誤,AH0
FLAGS.CF==1:有錯誤,錯誤號碼存入AH內(與重置(reset)功能一樣)
(取反、左移、按位與、按位異或、按位或)優先級由高到低的順序排列為
取反 > 左移 > 按位與 > 按位異或 > 按位或。
1、~:意思是按位取反,類似于非(!)的關系,取它的反面。
2、<<: 意思是左移,移動二進制的位。
3、& : 意思是按位與,類似于與(&&)的關系,一假為假。
4、^:意思是按位異或,通俗地說就是相同為0,不同為1.
5、|:意思是按位或,類似于或(||)的關系,一真為真。
1位寄存器 標志
CH 柱面號
CL 扇區號
DH 磁頭號
DL 驅動器號
1張軟盤有80個柱面,2個磁頭,18個扇區,一個扇區512個字節
軟盤容量 80218*512=1440 KB
含有IPL的啟動區,位于C0-H0-S1(柱面0,磁頭0,扇區1)
系統復位:
AH=0X00,DL=0X00,INT=0X13;
*/
一般向一個空軟盤保存文件時
1 文件名會寫在0x002600以后的地方
2 文件的內容會卸載0x004200以后的地方
設置顯卡模式
AH=0X00;
AL=模式
0x03:16字符模式,8025
0x12:VGA圖形模式,644804位彩色模式,獨特的4面存儲模式
0x13:VGA圖形模式,3202008位彩色模式,調色板模式
0x6a:擴展VGA圖形模式,800600*4位彩色模式,獨特的4面存儲模式
返回值:無
char *p; 用于BYTE類地址
short *p; 用于WORD類地址
int *; 用于DWORD類地址
處理顏色問題
320*200的8位顏色模式,色號使用8位(二進制)數,即0-255
常用顏色網絡編碼
#000000:黑
#00ffff 淺亮藍
#000084 暗藍
#ff0000 亮紅
#ffffff 白
#840084 暗紫
#00ff00 亮綠
#c6c6c6 亮灰
#00848484 淺暗藍
#ffff00 亮黃
#840000 暗紅
#848484 暗灰
#0000ff 亮藍
#008400 暗綠
#ff00ff 亮紫
#848400 暗黃
//CPU與內存,鍵盤,網卡,聲卡,軟盤等外部設備都有連接
匯編語言對應指令
向設備發送電信號 OUT
從設備取得電氣信號 IN指令
INT 中斷指令
INTO 溢出中斷
IRET中斷返回
HLT 停機
STI 中斷標志置1指令
CLI 中斷標志置0指令
PUSHFD push flags double-word 將標志位的值按雙字長入棧
video DA converter
1調色板的訪問步驟。
1首先在一連串的訪問中屏蔽中斷(如CLI)
1將想要設定的調色板號碼寫入0x03c8,緊接著,按照R,G,B的順序寫入0x03c9。如果想繼續設定下一個調色板,則省略調色板號碼,再按照RGB順序寫入0x03c9。
1如果想讀出當前調色板狀態,要將調色板的號碼寫入0x03c7,再從0x03c9讀取3次,讀出的順序就是R,G,B.如果要繼續讀出下一個調色板,同樣省略調色板號碼的設定,按RGB的順序讀出
1如果最初執行了CLI,那么最后要執行STI
GDT 全局段號記錄表;將數據整齊地排列在內存的某個地方,然后將內存的起始地址和有效設定個數放在CPU內被稱作GDTR的特殊寄存器中,設定就完成了。
IDT 中斷記錄表,記錄了0-255的中斷號碼與調用函數的對應關系
ar表示段的屬性,共16位
xxxx0000xxxxxxxx(其中x為0/1)
00000000(0x00)未記錄的記錄表
0x92 系統專用,可讀寫的段,不可執行
0x9a 系統專用,可執行的段,不可讀寫
0xf2 應用程序用,可讀寫的段,不可執行
0xfa 應用程序用,可執行的段,可讀不可寫
PIC programmable interrupt controller 可編程中斷控制器
將8個中斷信號集合成一個中斷信號的裝置
主pic,處理0-7號中斷信號 pic0
從pic,處理8-15號中斷信號 pic1
pic的寄存器都為8位寄存器
IMR interrupt mask register 中斷屏蔽寄存器 對應8路IRQ信號,某位為1代表對應IRQ信號被屏蔽,就忽略該路信號;
ICW initial control word 初始化控制數據,有4個,共有4個字節的數據;
對不同OS進行獨特設定的是ICW2,決定IRQ以哪一種中斷方式通知CPU
IRQ12 鼠標
IRQ1 鍵盤
段的大小;
段的起始地址;
段的管理屬性(禁止寫入,禁止執行,系統專用)
IDT 0-255的中斷號碼與調用函數的對應關系
保護模式:操作系統受到CPU的保護;應用程序既不能隨便改變段的設定,又不能使用操作系統專用的段;
memcpy(轉送源地址,轉送目的地址,轉送數據的大小)
轉送數據大小是以雙字為單位的,故用字節數/4
memcpy(bootpack,BOTPAK,512*1024/4)
從bootpack的地址開始的512KB內容復制到0x00280000號地址去
紙娃娃系統內存分布圖
0x00000000-0x000fffff 雖然在啟動中會多次使用,但之后就變空 1MB=220=165
0x00100000-0x00267fff 用于保存軟盤的內容(1440KB)
0x00268000-0x0026f7ff 空(30KB)
0x0026f800-0x0026ffff IDT(2KB)
0x00270000-0x0027ffff GDT(64KB)
0x00280000-0x002fffff bootpack.hrb(512KB)
0x00300000-0x003fffff 棧及其他(1MB)
0x00400000- 空
結構體賦值
示例:
man->free[i].addr=man->free[i+1].addr;
man->free[i].size=man->free[i+1].size;
歸納為
man->free[i]=man->free[i+1];
將函數分類時,
從bootpack.c分到其他.c文件中
1 修改bootpack.h
2 將原.c文件中函數刪除
3 將相應結構體或 define的宏定義的寫入.h文件
4 將對應的obj文件添加到Makefile中
建立.c文件:
1 寫入#include"bootpack.h"
2 將對應的函數寫入.h文件中
在naskfunc.nas文件中寫入函數后,
注意確定naskfunc.nas函數是否寫入GLOBAL,EXTERN中
確定是否在.h文件中寫入相關信息
IRQ0的中斷周期變更:
AL=0X34:OUT(0X43,AL);
AL=中斷周期的低8位;OUT(0X40,AL);
AL=中斷周期的高8位;OUT(0X40,AL);
總結
以上是生活随笔為你收集整理的30天自制操作系统笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: timer.schedule定时器用法
- 下一篇: CouchDB与Couchbase:区别