看到**了嗎?如果還沒開啟**,本課程將不再歡迎你。
drive
資料夾中有兩個c程式,用到了inline assembly的寫法,這是乙個難點,這段**這麼寫就顯得更加難理解。
原本的inline assembly的用法是這樣:
int a=
10, b;
asm("movl %1,
%%eax;
movl %
%eax,%0
;" :
"=r"
(b)/* 輸出 */
:"r"
(a)/* 輸入 */
:"%eax"
/* 用到的暫存器 */
);
我們的**是這樣
__asm__("in %%dx, %%al"
: "=a" (result)
: "d" (port));
"in %%dx, %%al"就是彙編指令
「=a」 (result) 是指將eax暫存器的值寫入c語言中的變數result
中。
「d」 (port)) 是指將port變數的值寫到edx中。
繞不繞?感覺繞就正常了,因為你不知道in %%dx, %%al
是在幹什麼,讓我們看看kernel/kernel.c中如何呼叫這段**的。
port_byte_out(0x3d4, 14); /* 14是請求高位位元組,0x3d4是乙個位址,用於與顯示卡互動 */
/* 索取的資料將出現在 (0x3d5)中 */
int position = port_byte_in(0x3d5);
position = position << 8; /* high byte */
port_byte_out(0x3d4, 15); /* 請求低位位元組 */
position += port_byte_in(0x3d5);
其實它是在請求顯示卡告訴咱們,現在游標在什麼位置,游標的位置是乙個16位的資料,分兩個位元組提取,提取流程是:
1.在0x3d4位置寫入14,游標位置高位元組資訊出現在0x3d5中
2.在0x3d4位置寫入15,游標位置低位元組資訊結果出現在0x3d5中。
由此,實現了乙個顯示資料的介面,以後再要列印什麼ascii碼就方便多了。
寫乙個國產的作業系統?
如果我要寫乙個國產的作業系統,以下幾點也許可以考慮一下 中文程式設計。我們能不能做乙個用中文 寫成的作業系統呢?是的,中文 不僅僅要能顯示中文,處理中文,還要求作業系統的源 也是盡可能的用中文來寫。為了做成這件事,看來下面的事情是逃不掉的 寫乙個支援中文的編譯器 彙編,高階語言 乙個支援中文的控制台...
(7)從1開始寫乙個作業系統
時間片輪轉排程是一種最古老,最簡單,最公平且使用最廣的演算法。每個任務被分配乙個時間段,稱作它的時間片,即該任務允許執行的時間。如果在時間片結束時程序還在執行,則cpu將被剝奪並分配給另乙個任務。如果任務在時間片結束前阻塞或結束,則cpu當即進行切換。排程程式所要做的就是維護一張任務先後執行的列表,...
(8)從1開始寫乙個作業系統
搶占式核心 即當任務正在執行,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的任務。在我們上一章的基礎上我們已經做了這個工作。說白了就是在任務建立的時候進行了任務排程,已保證更高優先順序的任務能夠被及時執行。還有就是在更高優先順序從非就緒態到就緒態的時候...