Chapter 8. 核心設定

Kang-min Liu
8.1. 我想自訂核心程式,這會很困難嗎?
8.2. 我的核心因為 _hw_float遺失而編譯失敗。 該怎麼修正呢?
8.3. 為什麼造出來的 kernel 這麼大 (10MB 以上) ?
8.4. 為何出現了 multi-port serial code 的中斷衝突?
8.5. 為什麼我一個 kernel 都編不起來?甚至 GENERIC 也不行?

8.1. 我想自訂核心程式,這會很困難嗎?

不會!請查閱 使用手冊中的核心設定一節

Note: 我會建議你在你讓核心能正常工作後,做一個 kernel.YYMMDD 日期形式的備份,同時也備份 /module這個目錄至 /modules.YYMMDD。這樣下次如果你很不幸的玩 壞了設定,至少可以不需要使用最原始的 kernel.GENERIC。如你正從一個 GENERIC kernel 裡面不支援的控制器裡啟動時,這就顯得特別重要。

8.2. 我的核心因為 _hw_float遺失而編譯失敗。 該怎麼修正呢?

讓我猜看看,你把 npx0 (詳見 npx(4)) 從你的核心設定檔移除了,因為你沒有數學運算器, 對嗎?錯了!:-) 這個 npx0必須要有的。就算你沒有數學運算器,你還是 必須 引入 npx0 裝置。

8.3. 為什麼造出來的 kernel 這麼大 (10MB 以上) ?

這很有可能是因為,你把 kernel 編成 偵錯模式 了。偵錯模式之下的 kernel 裡面會存著偵錯用的許多符號,因此會大幅 增加 kernel 的大小。如果說你的 FreeBSD 是 3.0 以後的版本,這對於 效能來說影響並不大,幾乎是沒有。而在系統會因某些原因 panic 時, 有個偵錯模式的 kernel 在也挺有用的。

不過呢,如果你的磁碟空間很小,或者你就是不想用偵錯模式的 kernel 的話,請確認以下事情:

  • kernel 設定檔裡面沒有這一行:

        makeoptions DEBUGS=-g 
  • 執行 config(8) 時沒有加上 -g 這個選項。

以上兩件事情都會讓你編出一個偵錯模式的 kernel。但只要避免之, 就可以編出一個正常的 kernel,而你也會注意到,kernel 明顯的變小了; 大部份的 kernel 都差不多在 1.5MB 到 2MB 之間。

8.4. 為何出現了 multi-port serial code 的中斷衝突?

當我編譯一個 multi-port serial code 的核心時,它告訴我只有 第一個被偵測到,其他的則因中斷衝突而跳過了,我該怎麼修正它?

這個問題是因為 FreeBSD 使用內建程式碼避免因為硬體或軟體衝突 導致核心程式過於肥大或無用。要修正這種情形的方法是除了一個 port 外把其他所有的 IRQ 設定都做保留。這裡有一個範例:

    #
    # Multiport high-speed serial line - 16550 UARTS
    #
    device sio2 at isa? port 0x2a0 tty irq 5 flags 0x501 vector siointr
    device sio3 at isa? port 0x2a8 tty flags 0x501 vector siointr
    device sio4 at isa? port 0x2b0 tty flags 0x501 vector siointr
    device sio5 at isa? port 0x2b8 tty flags 0x501 vector siointr

8.5. 為什麼我一個 kernel 都編不起來?甚至 GENERIC 也不行?

這有很多種可能的原因:

  • 你沒有用新的 make buildkernelmake installkernel 這兩個方法來編,而正好 你的系統原始碼的版本和正在執行的系統核心版本不一樣 (像是, 在跑 4.0-RELEASE 的系統上嘗試著編 4.3-RELEASE)。如果說你要升 級系統的話,請務必去看看 /usr/src/UPDATING 這個檔案,特別注意最後面的 "COMMON ITEMS" 這個小節。

  • 你已經用上 make buildkernel 以及 make installkernel 了,但是在 make buildworld 時失敗了。可惜的是, make buildkernel 要成功,需要依賴 make buildworld 後造出來的一些檔案。

  • 就算是你在編 FreeBSD-STABLE, 還是有可能你抓到了正在修改中,或著因為某些緣故而根本還沒改好 的原始碼;雖然說 FreeBSD-STABLE 大部份的時候都是可以編的,但只有 RELEASE 才是保證可以編的。碰 到這個問題時,再次更新原始碼並且再試試看。也有可能是放原始碼的 伺服器出現某些問題,所以更新原始碼時也試試從不同伺服器來更新看 看。