首先先整理下**自谷月軒的部落格)
現在我們擁有這麼9個檔案:
恩,接下裡我們補坑。
介紹下gdt和idt
c語言描述:
structsegment_descriptor ;
我們知道現在段位址是32位的。在這個結構裡用base表示,但是它分成了3段
low(2位元組) mid(1位元組) high(1位元組) 剛好32位。
為什麼要分成3段呢?為了相容80286時代的cpu。
段上限 limit,這個看上去佔了24個位元組,但是limit_high中的上4位,用來儲存段屬性了,所以只能用20 位。
那還有剩下12位的段屬性。
高四位稱為「擴充套件訪問權」。這4位是由「gd00」構成的,其中g是指剛才g bit,d指段模式,1表示32位。
低8位表示一些許可權。不細寫了。
struct segment_descriptor *gdt = (struct segment_descriptor *) 0x00270000;
struct gate_descriptor *idt = (struct gate_descriptor *) 0x0026f800
;
這2個位址是作者隨意的,反正這裡面沒有其他程式在占用。。。
for (i = 0; i < 8192; i++)
挨個初始化
void set_segmdesc(struct segment_descriptor *sd, unsigned int limit, intbase, int
ar)//
下面的是啥,我就不知道了。留著以後再看看吧
sd->limit_low = limit & 0xffff
; sd->base_low = base & 0xffff
; sd->base_mid = (base >> 16) & 0xff
; sd->access_right = ar & 0xff
; sd->limit_high = ((limit >> 16) & 0x0f) | ((ar >> 8) & 0xf0
); sd->base_high = (base >> 24) & 0xff
;
return;}
load_gdtr(0xffff, 0x00270000);
至於這句嘛,很簡單因為c語言不能直接操作cpu所以,只能改用彙編寫入gdtr這個暫存器了。
還有就是idt,他和gdt差不多,各位之前學習彙編的時候一定已經接觸過了,畢竟應該沒有哪本彙編教材不介紹大名鼎鼎的int中斷吧。
pic:
處理中斷的輔助晶元。 與cpu直接相連的pic成為主pic,與主pic相連的pic稱為從pic
,主pic負責處理第0到第7號中斷訊號,從pic負責處理第8到第15號中斷訊號。
從pic通過第二號irq與主pic相連。
void init_pic(void)
/*pic初始化
*/
介紹下pic的暫存器:
imr :interrupt mask register 「中斷遮蔽暫存器」
8位對應8路irq訊號,置1表示忽略該路訊號。
icw :initial control word 「初始化控制資料」
icw 有4個,每個1個位元組。
icw 1 和icw 4 宣告了主機板配線方式( = = 完全不懂哎);
icw 3 是主從設定, 表示觸發器的哪一位連著從觸發器; (一般是irq2 啦);
icw 2 決定irq以哪乙個中斷號通知cpu, int 0x0~0x19 不能被使用.
到現在為止準備工作算是完成了。
今天接下來的東西只介紹了那麼一點,寫成筆記也沒什麼必要,等完成的差不多了在一塊整理吧!
30天自製作業系統讀書筆記 五
為了讓程式靈活點,作者覺得把什麼320x200這些資料直接寫入程式,不如讓程式自己獲取。所以就引入了結構體,指標。用指標直接在記憶體中獲取這些資料 如程式裡的這句 binfo scrnx short 0xff4 對於結構體和指標我就不細寫了,有c語言基礎的人都知道。因為已經進入了32位模式,所以不能...
30天自製作業系統讀書筆記 一
剛開始作者叫我們用二進位制編輯器,手敲01 寫了個img 磁碟映像檔案 並提供了一些檔案 run.bat,install.bat這些乙個批處理檔案,其實就是寫好了cmd指令儲存到文件裡面,方便以後執行。其中run.bat裡面的指令是這樣的 copy helloos.img z tools qemu ...
30天自製作業系統
第一天的內容很少,是一些簡單的基礎知識,在這裡我就沒有必要寫出來了,只說出大概的輪廓了,然後我會對其中的幾點進行詳細的解釋。文章的第一天的輪廓大概是這樣的,作者首先用二進位制編輯器做了乙個顯示二進位制的程式,然後用彙編完全db的形式,後又進行改善,最後以比較標準的組合語言編寫,但程式主體部分還沒有翻...