目前有三個活躍/半活躍的分支在 FreeBSD 的
如同其他兩個, 做 release 包括下面這三個步驟:首先,做出有 接著,你手上要有整個 CVS repository。可以參考 然後執行 最後,硬碟要有相當大的空間來做 release。假設你想把它放在
/some/big/filesystem 這裡,上面這個例子也把 CVS
repository 放在 /home/ncvs 了,接著:
整個 release 會做在 /some/big/filesystem/release。結束
時 /some/big/filesystem/release/R/ftp 這個目錄可以直接用
來做為 FTP 安裝方式的來源。如果想做出 -current 以外分支的 SNAP,
在上面 make release 這一行加
建立安裝磁片、還有做出 source/binary archive,都是由
/usr/src/release/Makefile 裡面的各種 target 自動產生,這
個檔案裡的資訊應該足以開始。但是這個過程牽涉到 make world,所以會
用到相當多的時間和硬碟空間。
沒錯,就是這樣子。如名字所示,``make world'' 會重新編譯系統內建
的每個 binary 檔,這樣在結束時就可確定有個一致且乾淨的環境(所以要
花上好一段時間)。
在執行 ``${DESTDIR} 下的同樣目錄樹中。但在某些修
改 shared library 和重建 binary 的無特定情況下,這樣做可能會使
``
Adaptec 1542 SCSI 卡允許使用者用軟體調整匯流排的存取速度。早
期的 1542 驅動程式試圖將它設成可用的最快速度,但後來發現在一些
機器上不能用,所以現在要在 kernel 設定中加 ``
可以,藉著 在以 BSD 為主的較新系統中,split 有個 ``這裡是 /usr/src/Makefile 中的一個例子:
請看一下 同時也感謝你的費心!
由 簡單的說,當主機發出是否有 PnP 卡的詢問訊號時,所有的 PnP
會在幾個固定的 I/O port 作回應。所以當偵測 PnP 的程式開始時,它
會先問有沒有 PnP 卡在,接著所有 PnP 卡會在它所讀的 port 以自己
的型號 # 作回答,這樣偵測程式就會得到一個 wired-OR ``yes''
的數字,其中至少會有一個 bit 是打開的。然後偵測程式會要求型號
(由 Microsoft/Intel指定)小於 X 的卡``離線'',再去看是否還有卡回
答同樣的詢問,如果得到 ``一張卡的 ID 由兩個 32-bit(所以上面是 2ˆ64) + 8bit 偵錯
碼組成,第一個 32 bits 是用來區分各家廠商的。這些廠商沒有出來澄
清過,但看來應假設同一家出的不同種類的卡的廠商 ID 有可能不同。
用 32 bits 只來表示不同廠商的想法實在有點過頭了。
第二個 32 bits 則是型號 &num、乙太網路位址、或一些使這張卡獨
特的資料。除非第一個 32 bits 不同,否則廠商不可能作出第二個 32
bit 相同的兩張卡。所以在一台機器中可以有同樣的好幾張卡,然而他們
整個 64 bits 還是會都不一樣。
這兩個 32 bit 永遠都不可能為零,這使得最開始 binary search 中
的 wired-OR 會得到一個非零數字。
一旦系統區分出所有卡的 ID,接著會經由同樣的 port 一個個重新啟
動每張卡,接著找出已知介面卡所需的資源、有那些可以選的 interrupt
等等。所有卡都會被掃描一次,來收集這些資料。
這些資訊接著和硬碟上的 ECU 檔案、或 MLB BIOS 裡的資料結合在一
起,通常是綜合 ECU 和 MLB 裡的 BIOS PnP 資料,這些週邊並不支援真
正的 PnP,然而偵測程式在檢查 BIOS 和 ECU 資料後,它可以避免 PnP
週邊和那些偵測不到的相衝突。
接著再度拜訪這些 PnP 週邊,這次會把可用的 I/O、DMA、IRQ 和記
憶體映射的位址都指定給它們。這些週邊就會出現在所指定的地方,直到
下一次重新開機為止,不過也沒有人說不能把它們隨時移來移去。
上面有相當多的簡化,但你應該已經了解大致的過程。
Microsoft 把表示印表機狀態的幾個主要 port 拿來作 PnP,他們的
邏輯是沒有一張卡會在這些地方解碼作相反的 I/O cycles。但是我找到
一款早期仍在評估 PnP 提案時的 IBM 原廠 printer board,它的確去解
對這些狀態 port 的寫入資料,但是 MS ``說了就算''。所以它們的確有
對印表機狀態 port 寫入,還有讀取該位址 +
有幾群人士已經表示對發展多平台 FreeBSD 的興趣,其中
FreeBSD/AXP (ALPHA) 即是其中相當成功的例子,可以在 這要看你是否打算將這個驅動程式公開使用,如果是的話,請把它的原始
碼送一份給我們,還有 files.i386 修改的部份、kernel 設定
檔樣本、以及用來產生設備檔的 在回答有關目錄放置方式不同的問題上,我在 1983 年寫好目前的作法
後就沒有再改變過,這種方式是針對原先的 FFS 檔案系統,後來也沒
有對它作任何更動。它在避免 cylinder group 被填滿這方面做得相當
成功,但是就像有些人已經注意到,它和 `find' 就配合得不大好。大
部份的檔案系統是由那些用 depth first search(aka ftw) 產生的
archive 製造出來,解出來的目錄 inode 會橫跨好幾個 cylinder
group,如果以後要做 depth first search 的話,這是最糟糕的情況之
一。如果我們知道總共會產生多少目錄的話,解法是在做任何存取/寫
入動作之前,在每個 cylinder group 上先造出(所有目錄數/cylinder
greoup 的數目)這麼多的目錄。很明顯的,我們必須要有根據地去猜這
個數字,就算一個像 10 的很小固定數目也會使效率以級數成長。區分
restore (即解開上述的 archive) 和一般檔案操作的方法可以是(現在
用的演算法可能要更敏感):如果一些目錄(最多 10 個)都在 10 秒內產
生的話,那麼就把這些目錄聚集在同一個 cylinder group。不管怎樣,
我的經驗指出這是一個已經充份實驗過的部份。 Kirk McKusick, September 1998
[這節是從
[<ben@rosengart.com> 發表了下面的 panic 訊息]
當你看到像這樣的訊息時,只把它拷一份送上來是不夠的。我在上
面特地標明的 instruction pointer 值相當重要,不幸的是它會因設
定而不同。換句話說,這個值會跟你用的 kernel image 檔而變動。如
果是用某個 snapshot 版本的 GENERIC kernel,也許其他人可以追蹤
到出問題的函式,但如果你是用自訂的 kernel,那麼只有要做的事包括這些:
我常常看到人們顯示一大片 panic 訊息,但很少看到有人花一點時間
把 instruction pointer 和 kernel symbol table 中的函式比較一下。
要追蹤出造成 panic 原因的最好方法是先做出 crash dump,然後用
不管是那一種,我通常是用這個方法:
[注意:現在 FreeBSD 3.x kernel 內定是 ELF 格式,所以應該
用
注意你要確定能抓到 crash dump,先編輯 /etc/rc.conf,將
/etc/rc.conf
裡有設 /var/crash。
注意:FreeBSD 的 crash dump 通常和機器裡的實際記憶體一樣大,
就像如果有 64MB 記憶體,crash dump 大小就是 64MB。所以要確定
/var/crash 下有足夠的空間,或是可以手動執行 一旦發現有了 crash dump,就可以用
要注意可能會出現好幾個螢幕的可用資訊,你可以用 好啦,如果你有第二台電腦而且有夠瘋狂,可以將 [Bill 附注:我忘了提到一點:如果你有啟動 DDB 而 kernel 也
已經進入除錯器,可以在 DDB 命令列下打 `panic',強迫產生 panic(還
有 crash dump)。也有可能在 panic 階段時再進入除錯器,如果這樣的話
,輸入 `continue',接著它就會完成 crash dump。 -ed]
在 ELF 一系列的工具中,內定是不會讓 dynamic linker 看到執行檔
裡定義了那些 symbol。所以 dlsym() 沒有辦法用藉由呼叫
dlopen(NULL, flags) 取得的 handle,用它去搜尋有那些
symbol 一定會失敗。
如果你想要用 dlsym() 找出某個 process 的主執行檔中
有那些 symbol,則要在 link 時對
系統的內定是,FreeBSD 3.x kernel 能定址到 256 MB,4.x 則是
1 GB。如果是網路負荷相當重的伺服器(就像大型 FTP 或 HTTP 伺服器),
256 MB 可能會不大夠。
要怎麼增加定址空間呢? 要從兩方面著手。首先告訴 kernel 本身要
保留較大空間; 其次,既然是在定址空間的最上面載入 kernel,所以還
要調低載入的位址,否則就會超過定址範圍。
增加 src/sys/i386/include/pmap.h 裡的
#ifndef NKPDE
#ifdef SMP
#define NKPDE 254 /* addressable number of page tables/pde's */
#else
#define NKPDE 255 /* addressable number of page tables/pde's */
#endif /* SMP */
#endif
要算出 要解決第二個問題,必須自行算出 kernel 被載入的位址:求出
0x100100000 減掉定址空間大小的值(以 byte 為單位),如 1 GB 大小就
是 0xc0100000。把 src/sys/i386/conf/Makefile.i386 裡的
src/sys/i386/conf/kernel.script 中,將 section 列表最前面的
location counter 設成相同的值,如下:
然後重新 config 和做出新的 kernel。在執行像 /usr/include/vm/
下,再手動編譯 注意:kernel 所能定址的空間大小必須是 4 megabytes 的倍數。
[