從頭寫乙個作業系統 14 (在螢幕上列印點什麼)

2021-09-20 15:21:50 字數 1191 閱讀 4945

看到**了嗎?如果還沒開啟**,本課程將不再歡迎你。

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開始寫乙個作業系統

搶占式核心 即當任務正在執行,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的任務。在我們上一章的基礎上我們已經做了這個工作。說白了就是在任務建立的時候進行了任務排程,已保證更高優先順序的任務能夠被及時執行。還有就是在更高優先順序從非就緒態到就緒態的時候...