main函式主要做一些初始化,比如記憶體,塊裝置、字元裝置等的初始化,然後建立子程序開啟bin/sh
mem_init(main_memory_start,memory_end);
trap_init(); // 陷阱門(硬體中斷向量)初始化。(kernel/traps.c)
blk_dev_init(); // 塊裝置初始化。(kernel/blk_dev/ll_rw_blk.c)
chr_dev_init(); // 字元裝置初始化。(kernel/chr_dev/tty_io.c)空,為以後擴充套件做準備。
tty_init(); // tty 初始化。(kernel/chr_dev/tty_io.c)
time_init(); // 設定開機啟動時間 -> startup_time。
sched_init(); // 排程程式初始化(載入了任務0 的tr, ldtr) (kernel/sched.c)
buffer_init(buffer_memory_end);// 緩衝管理初始化,建記憶體鍊錶等。(fs/buffer.c)
hd_init(); // 硬碟初始化。(kernel/blk_dev/hd.c)
floppy_init(); // 軟碟機初始化。(kernel/blk_dev/floppy.c)
在任務0中建立任務1
if (!fork())
init函式:初始化shell環境,執行bin/sh
void init(void)
內是子程序執行的內容。
// 該子程序關閉了控制代碼0(stdin),以唯讀方式開啟/etc/rc 檔案,並執行/bin/sh 程式,所帶引數和
// 環境變數分別由ar**_rc 和envp_rc 陣列給出。參見後面的描述。
if (!(pid=fork()))
// 下面是父程序執行的語句。wait()是等待子程序停止或終止,其返回值應是子程序的
// 程序號(pid)。這三句的作用是父程序等待子程序的結束。&i 是存放返回狀態資訊的
// 位置。如果wait()返回值不等於子程序號,則繼續等待。
if (pid>0)
while (pid != wait(&i))
// --
// 如果執行到這裡,說明剛建立的子程序的執行已停止或終止了。下面迴圈中首先再建立
// 乙個子程序,如果出錯,則顯示「初始化程式建立子程序失敗」的資訊並繼續執行。對
// 於所建立的子程序關閉所有以前還遺留的控制代碼(stdin, stdout, stderr),新建立乙個
// 會話並設定程序組號,然後重新開啟/dev/tty0 作為stdin,並複製成stdout 和stderr。
// 再次執行系統解釋程式/bin/sh。但這次執行所選用的引數和環境陣列另選了一套(見上面)。
// 然後父程序再次執行wait()等待。如果子程序又停止了執行,則在標準輸出上顯示出錯資訊
// 「子程序pid 停止了執行,返回碼是i」,
// 然後繼續重試下去…,形成「大」死迴圈。
while (1)
if (!pid)
while (1)
if (pid == wait(&i))
break;
printf("\n\rchild %d died with code %04x\n\r",pid,i);
sync();
}_exit(0); /* note! _exit, not exit() */
}
Linux 記憶體管理之核心態剖析
記憶體管理不僅是 linux 系統中比較難理解的模組,更是網上資料講解混亂的模組。本場 chat 旨在讓讀者了解記憶體分配的來龍去脈,從硬體原理和核心角度出發,分析如下內容 cpu 通過 mmu 訪問實體地址的原理 記憶體的 zone 劃分 dma normal 和 highmem 記憶體的 pag...
Linux核心剖析 核心的記憶體管理
核心的記憶體管理不同於使用者空間的記憶體管理,首先來講核心本身的限制點就比較多,比如核心一般不能睡眠,因此處理記憶體錯誤一般來講是件很困難的事情,再加上其他限制以及核心記憶體機制不能太複雜導致想獲取核心記憶體變成了一件難事。在說核心的記憶體管理機制之前,首先我們得明白核心記憶體管理的基本單位才行,一...
Android核心剖析之Window內部機制
windowmanager其實指示乙個介面,其具體實現是在windowmanagerimpl,而windowmanagerimpl其實什麼都沒做,指示呼叫windowmanagerglobal中的方法來實現的,windowmanagerglobal是個單例模式,通過win。windowmanager...