30天自製作業系統 第6天 分割編譯與終端處理

2021-10-02 06:53:21 字數 1227 閱讀 1417

makefile

首先說一下makefile

相當於一連串的變數值的代換。

%.gas : %.c makefile

$(cc1) -o $*.gas $*.c

將所有的.c檔案全部編譯為.gas檔案。

c語言標頭檔案(*.h)

標頭檔案中全部都是資料結構、函式宣告,把用到同乙個函式的程式的函式宣告全都拿出來,放到乙個標頭檔案中,可以減少**量,易於修改。

gdtr 段資訊暫存器

gdtr修改需要特殊命令lgdt。gdtr很特殊,是個48位暫存器,低16位表示段上限,等於gdt的有效位元組數-1;高32位代表gdt(global(segment) descriptor table 全域性段號記錄表)的開始位址。

​ lgdt [addr]

該命令把從addr開始的6位元組內容放到gdtr中。

struct segment_descriptor 

;

1. 段的位址用base(基址)表示,分三部分,low(2 byte),mid(1 byte),high(1 byte),按順序向其中填入值即可。合起來正好32位。設成3段是為了讓原先8086、80286上的16位程式與32位的386相容。

2. 對32位處理器來說,最大段上限是4gb,需要用乙個32位二進位制數表示,則佔4位元組,如果把這個4位元組的數直接放進結構體中,則佔空間太多了,所以設計時**規定段上限用20位表示**。並且,設定標誌位gbit,當gbit=1時,limit解釋為頁,1頁=4kb。這樣,20位相當於1m,1m*4kb=4gb,就可以表示整個記憶體空間了。

3. 12位段屬性又稱為「段的訪問權屬性」,程式中用變數access_right或ar表示。ar的高4位在limit_high的高4位中,ar的低8位正好儲存在結構體中的access_right中,不同的8位二進位制數表示不同的系統模式。如

10011010

(0x9a

):系統專用,可執行的段。可讀不可寫。

11111010

(0xfa

):應用程式用,可執行的段。可讀不可寫。

其中模式特別多,極其詳細,在此不展開了。cpu到底是處於系統模式還是應用模式,取決於執行中的應用程式是位於訪問權為0x9a的段,還是訪問權為0xfa的段。

pic初始化

中斷處理程式的製作

組合語言講解

述所有暫存器全部出棧。

《30天自製作業系統》第6天

1.pic 可程式設計中斷控制器 pic 連線 8個中斷訊號,監視輸入管腳的 8個中斷訊號。主 pic irq0 irq7 irq2 連線到從 pic irq8 irq15 中斷發生後,cpu 命令pic傳送2 個位元組的資料,格式是 0xcd 0 cpu收到2 個位元組後把資料當做指令來執行。0x...

《30天自製作業系統》第4天

1.c語言與畫面顯示的練習 彙編與c 語言結合時能自由使用的寄存區只有 eax,ecx,edx3 個,其他寄存區用於記憶非常重要的值,只能讀不能寫。intel系列 cpu 8086 80186 286 386 486 pentium pentiumpro pentium2 pentium3 pent...

30天自製作業系統 第3天

cf 進製標誌,1位暫存器 jc 若進製標誌是1,則跳轉 int 0x13 呼叫磁碟bios ah 0x00 系統復位 0x02 讀盤 0x03 寫盤 0x04 校驗 0x0c 尋道 al 處理物件的扇區數 ch 柱面號 0xff cl 扇區號 0 5位 柱面號 0x300 2 dh 磁頭號 dl ...