時間都去哪兒了
老帕的“花兒為什么這樣紅”,三分鐘引起六次歡呼,卻敗給了張碧晨。試想一下,如果是人氣更高的陳冰,即使唱得和張碧晨一模一樣,可能仍然不敵老帕,為什么張碧晨就能取勝呢?有這么個笑話:一人彈琴無人聽,但一老婦人聽得卻潸然淚下。原來她的亡夫是彈棉花的!這雖是個笑話,卻一語道破玄機。歌聲動人,除了唱功,還有感情因素在里面。假如老帕的”花兒為什么這樣紅“是 1 分, 那么,張碧晨的父女情為 1 分, ”時間都去哪兒了“為 1 分。2 : 1, 張碧晨勝出也就理所當然了。
shell 的實現
在自己的 os 中運行自己的程序 echo,實現起來,比想象的要簡單一些。這得益于文件系統的支持。準備工作,參見 x01.os.7。源代碼,可到 x01.Lab.Download 中下載 x01.os.13.tar.gz。解壓后由終端進入,make 后 bochs 可看到如下界面:
看來,echo 程序運行的還不錯。首先,來看看 echo 程序,代碼如下:
1 #include "kstd.h" 2 3 int main(int argc, char* argv[]) { 4 int i; 5 for (i = 1; i < argc; i++) { 6 PRintf("%s%s", i == 1 ? "" : " ", argv[i]); 7 } 8 printf("/n"); 9 return 0;10 }
非常簡單,但這個 main 函數已經不是我們平時看到的那個了。它要在我們自己的 os 中運行,還需要 start.s 的幫忙,代碼如下:
1 extern main 2 extern exit 3 4 bits 32 5 6 [section .text] 7 global _start 8 9 _start:10 push eax11 push ecx12 call main13 push eax14 call exit15 hlt
這個 _start 是關鍵,與 kernnel.s 中的一致。那么,怎么在我們自己的 os 中運行呢?在 mm.c => MM_Exec() 函數中,有這么一句:
g_ProcTable[src].Regs.eip = elf_hdr->e_entry;
echo 的 entry point,正是由這句完成交接。簡單而言,就是 fork 一個 Init 的子進程,然后在 shell 中替換為我們自己的程序如 echo。
學習操作系統,如果腦海里有個內存布局,將會事半功倍。為了計算 10 進制到 16 進制的轉換,順手寫了個 hex 程序。但要把它運行在自己的 os 中,卻又有許多工作要做,作罷。
一個完善的 os,非一人之力,非一時之功。除了大家共同努力,難道還有別的辦法嗎?
新聞熱點
疑難解答