回文章列表
作者jserv.bbs@ptt.cc (松鼠) 看板: linux
標題Re: [問題] Kernel與root-filesystem的關係是怎樣的?
時間批踢踢實業 (2008/03/28 Fri 20:53:12)
※ 引述《JohnLinq (林約翰)》之銘言:
: 我對技術方面的東西懂得不多,
: 所以我對jserv前輩的回文只能夠理解一小部份,

愚昧的我,恰好只懂得回覆您提出的問題,希望大家不要見笑/不要介意 (這句話
就不需重複了)

: http://www.linuxfromscratch.org/lfs/view/stable/chapter05/glibc.html
: 編譯Glibc的時候需要kernel-headers
: 也就是說 UserSpace App -> Glibc -> System Call -> Kernel
: Glibc與Kernel匹配的關鍵就在於編譯Glibc時所用的kernel-headers

對自己好一些吧,與其盲目陷入 Google 的泥淖,不如找本觀念正確的參考書籍。
閣下需要對 Linux system call 的原理有所知悉,建議閱讀<<Understanding the
LINUX KERNEL>>第二版的第九章。

:     可是像我用Kernel 2.4的Library配Kernel 2.6的核心,
:     那麼舊Library如何知道新核心的長相並與其相容呢?

是的,編譯 glibc 需要匹配的 kernel header。
GNU glibc 開發團隊花了很多心力,讓不同版本間的 kernel API 更動,能透過內部
的對應方式,儘可能包裝以保持上層 C runtime 的相容性。

如果您對這細節有興趣,可參考 glibc 內部 syscall 的處理機制。

: Kernel主動去叫別人作事,就是透過"C style function call"嗎?
: 長得像下面這個例子這樣嗎?
: execve("/sbin/hello", argv_init, envp_init);
: http://www.win.tue.nl/~aeb/linux/lk/lk-3.html
: If one wants to play with this, find kernel 2.5.64 and apply the above klibc
: patch. It contains a usr/root/hello.c program, that however is never invoked.
: Add an invocation in init/main.c before the prepare_namespace(), e.g.,
:         unlock_kernel();
:         system_running = 1;
:         execve("/sbin/hello", argv_init, envp_init);
:         prepare_namespace();
:         if (open("/dev/console", O_RDWR, 0) < 0) ...

這個例子其實不適合解釋您原本的問題,因為太容易失焦了。

kernel 內部當然有 C function call,也會 export symbol 出來,而提供 syscall
interface 則可讓 userspace 存取特定的服務。「Kernel 主動去叫別人作事」這個陳述
相當不精確,因為「別人」標的物何在?當然 kernel 本身可隨時處理 PCB (Process
Control Block) 與 process 內部狀態,但我們談的是 syscall 本身,至少就這個往返
的討論來說是如此。

klibc 裡面有些奇特的技巧,如果您觀念不清楚,很容易迷失。

--
※ 發信站: 批踢踢實業坊(ptt.cc) 
◆ From: 59.115.133.119
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻