30天自製作業系統day27

2021-07-04 05:58:51 字數 1395 閱讀 5776

之前通過設定段時將許可權+0x60的方法防止應用程式訪問作業系統記憶體空間。但是現在應用程式還是可以修改別的應用程式的記憶體。為了防止應用程式被攻擊,需要使用ldt。

ldt是只對乙個應用程式有效的,容量也是64kb。因為現在我們每個程式只需要2個段(資料段,**段),所以只用了裡面的16位元組。ldt每個程式乙個,放在task結構中。

要使用ldt,需要在gdt表中註冊乙個ldt段。每個程式註冊乙個。

#define ar_ldt      0x0082
在註冊ldt段時傳進去的訪問許可權,和其它段有區別。

在task_init()函式中,為task陣列中的所有task註冊ldt,還要將ldt段的段號寫入tss.ldtr中。set_segmdesc()中的limit是15,因為我們的ldt表只有2個段。

taskctl->tasks0[i].tss

.ldtr = (task_gdt0 + max_tasks + i) * 8

; set_segmdesc(gdt + task_gdt0 + i, 103, (int) &taskctl->tasks0[i].tss, ar_tss32);

set_segmdesc(gdt + task_gdt0 + max_tasks + i, 15, (int) taskctl->tasks0[i].ldt, ar_ldt);

set_segmdesc(task->ldt + 0, finfo->size - 1, (int) p, ar_code32_er + 0x60);

set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, ar_data32_rw + 0x60);

乘以8和gdt一樣,但是最後要加上4,表示這是註冊到ldt的。因為gdt一般情況下後三位都是0,所以可以區別開。

之前每個應用程式,編譯時都要引用a_nask.nas,但是裡面有很多函式是用不到的。全部引用進來會使可執行檔案體積很大。

可以通過把每個函式單獨編譯成乙個.obj檔案,然後在應用程式的makefile中只引用它呼叫到的那些函式。不過更好的方法是使用庫。

庫的作用是把剛才所有的.obj檔案合併成乙個apilib.lib檔案。在編譯應用程式時,可以這樣寫makefile:

a.bim : a.obj apilib.lib makefile 

$(obj2bim) @$(rulefile) out:a.bim map:a.map a.obj apilib.lib

這相當於linux裡面的靜態庫吧,在編譯時就把程式中需要呼叫的函式編譯進來。

然後,再寫乙個apilib.h檔案,所有的函式宣告放在這裡,在應用程式中就可以include這個標頭檔案。

30天自製作業系統

第一天的內容很少,是一些簡單的基礎知識,在這裡我就沒有必要寫出來了,只說出大概的輪廓了,然後我會對其中的幾點進行詳細的解釋。文章的第一天的輪廓大概是這樣的,作者首先用二進位制編輯器做了乙個顯示二進位制的程式,然後用彙編完全db的形式,後又進行改善,最後以比較標準的組合語言編寫,但程式主體部分還沒有翻...

30天自製作業系統day01

第一天的標題,從計算機結構到匯程式設計序入門。這一天作者共講了一下內容 1.作者上來就用二進位制編輯器製作了乙個軟盤映象boot.img。像作者一樣,現在已經不需要再去購買軟盤,再說就算想買也不一定買得到。本人使用qemu載入軟盤映象,命令 qemu system i386 fda boot.img...

30天自製作業系統day02

組合語言學習與makefile入門 作者共講了幾個簡答的指令 org jmp mov add cmp je int hlt。標號的使用,的使用 8個16位暫存器,他們各自意義不同,雖然差不多可以通用,但效果不一樣,如add cx,0x1234和add ax,0x1234指令長度就不一樣。前者為81 ...