linux中menu命令,menucofig 详解
2.4? Linux內核配置基礎
對于一個開發者來說,將自己開發的內核代碼加入到Linux內核中,需要有3個步驟。
(1)確定把自己開發代碼放入到內核的位置。
(2)把自己開發的功能增加到Linux內核的配置選項中,使用戶能夠選擇此功能。
(3)構建子目錄Makefile,根據用戶的選擇,將相應的代碼編譯到最終生成的Linux內核中去。
2.4.1? Linux內核所支持的配置方式
本節介紹Linux內核所支持的6種配置方式,并重點討論常用的make menuconfig的用法。
Linux內核主要支持以下6種配置方式。
n??????? make config:基于命令行的問答方式,通過執行make config開始,使用scripts/ Configure腳本解釋工具去執行腳本。它針對每一個內核配置選項會有一個提問,回答y則選中,回答n則去掉,一旦選錯一個就必須從頭再來,故不建議使用此種方式。
n??????? make oldconfig:也是通過命令行的方式,但它要求手動設定在. config中沒有設定的選項,而make config則不管在.config中是否設定過都要求用戶重新設定。這是一個非互動性的腳本,用系統當前內核的設置作為配置標準,重新編譯新內核。適用于只進行簡單升級的情況。
n??????? make menuconfig:采用菜單方式進行配置,如圖2-6所示。用戶可以在Linux主機或網絡中的某個工作站進行操作。該方法使用scripts/Menuconfig腳本解釋工具去執行腳本。執行make menuconfig命令以后,會出現一個以curses為基礎的、終端式的配置菜單,通過該菜單可以很方便地進行內核的配置。如果.config文件存在,則會根據該文件來設定默認值。一般情況下我們會選擇該方法進行配置。
圖2-6? make menuconfig
n??????? make xconfig:也是采用菜單方式進行配置的,如圖2-7所示。但必須在Linux主機上執行。make xconfig顯示以Qt為基礎的X Windows配置菜單,在GUI下配置內核,感覺很直觀和清晰。同樣,如果.config文件存在,則會根據該文件來設定默認值。
圖2-7? make xconfig
n??????? make gconfig:類似make xconfig,不同的是,它是以GTK為基礎的GUI環境。
n??????? make defconfig:能夠根據機器的類型對內核進行默認的配置,免去了動手配置的麻煩。但經過測試,它很難配置出一個功能比較完善的內核,尤其是對于非Intel CPU的識別、優盤的支持、NTFS分區的支持以及ADSL的使用等問題做的還不是很令人滿意。
顯然,這6種方式的實質是相同的,不管選擇哪種方法,在對Linux內核配置選項進行選擇設定后,都會在內核頂層目錄下生成一個隱藏的.config文件,它包含了所有配置選項的用戶選擇信息。當下一次make menuconfig時,會生成一個新的.config文件,原來的文件被更名為.config.old。
2.4.2? make menuconfig配置方法
通常使用make menuconfig方式進行配置,這種方式簡單明了,受條件制約小。執行如下命令:
#make menuconfg
系統會出現如圖2-6所示的菜單方式,將內核的可配置選項呈現給用戶。
每一個萊單項按模塊功能分類,下面包含若干具體子項。例如Processor type and features (中央處理器類型及特性)選項就包含以下子項,如圖2-8所示。
用戶只需要根據自身特定系統的應用需求,對相應的功能模塊進行取舍,當用戶需要添加某項功能時,將光標移動到該位置,按空格鍵選中該項功能,此時選項左端的括號內出現“*”表示選擇有效,再按空格鍵時,可以取消該項的選擇。當用戶在根據自己的系統需求配置好內核,退出配置菜單時,需要保存修改后的內核配置。
圖2-8? Processor type and features(中央處理器類型及特性)選項
若用戶選擇不保存,則進行的所有配置操作無效,內核配置仍然為原來的狀態,若選擇保存,系統會在當前目錄下生成一個.config文件,其后要進行的內核編譯就是根據這個.config文件來進行條件編譯以生成相應的可執行文件的。
2.4.3? Linux 2.4內核配置文件config.in介紹
Linux 2.4內核配置文件為config.in,Linux 2.6內核配置文件為Kconfig,二者大同小異,本節將介紹config.in的配置方法。
該文件被頂層Makefile包含,Rules.make及子目錄中的Makefile并未包含這個文件,它是通過在頂層Makefile中設置并出口(export)變量MAKEFILES來向下傳遞的,比如MAKEFILES = $(TDPDIR)/.config。.config文件包括以下兩個文件。
n??????? arc/aim/config.in文件:在配置完成后會生成.config文件,其內容為相應的宏定義。該文件提供了總體的內核配置菜單選項,包括運行make menuconfig等命令出現的菜單。具體的子配置菜單選項需在其他各級子目錄下的config.in(在2.4內核中腳本為各級目錄下的config.in,而在2.6內核中變為Kconfig)中描述。當用戶開發了新功能程序并需將其相關的配置選項加入到Linux的配置菜單中,以供用戶需要此功能時進行選擇,這時要在各級目錄下的config.in文件中用配置語言來編寫相應的配置腳本。config具體語法請參考Documentation/kbuild/CONFIG_ language.txt。
n??????? include/Linux/autoconf.h:同.config一樣,該文件也是在make menuconfig后產生的,它是根據內核配置情況由一些預處理語句組成。
幾乎所有的源文件都會通過#include < Linux/config. h>來嵌入autoconf. h文件。當配置選項發生變化時,會更新autoconf. h,如果按照通常方法,使用make dep在每個子目錄下生成依賴文件.depend,將造成所有源代碼的重新編譯。為了優化Make過程,減少不必要的重新編譯,Linux開發了專用的mkdep及split-include工具。在script目錄下有工具mkdep用來取代make dep來生成 .depend文件,它在處理源文件時,將忽略Linux/config.h頭文件,直接查找源文件中具有“CDNFIG_”特征的宏定義。例如,如果有這樣的行:
#ifdef CONFIG_PCI
它就會在depend文件中輸出$(wildcard/opt/Linux/include/contig/pci.h),split-include工具以auto-conf.h為輸入文件,利用autoconf.h中的“CONFIG_”標記,生成與mkdep相對應的文件。例如,如果autoconf.h中有#undef CONFIG_PCI這樣的行,它就會生成include/ config/pci.h文件,其內容只有一行:
#undef CONFIG_PCI
表示不支持PCI設備。include/config/下的文件名只在.depend文件中出現,內核源文件是不會嵌入它們的。這樣的話,每重新配置一次內核,就會運行工具split-include,依次來檢查舊的子文件的內容,以確定是否需要更新它們。這樣,不管autoconf.h修改日期如何,只要其配置不變,make就不會重新編譯內核。
2.4.4? Linux2.6內核Kconfig文件的用法
Kconfig文件是Linux 2.6.x系統的主要構成部分,它作為內核配置文件,主要包含可供用戶選擇的配置選項,配置程序將根據這些內容來顯示相關配置選項,并將配置后生成的選項信息存放在.config文件中。
下面我們將從一個內核中的Kconfig文件來講述Kconfig的格式含義,當然,由于篇幅限制,我們刪掉了大部分重復的內容,只保留了一些典型的結構:
#
# Network configuration
#
menu "Networking support"
config PACKET
tristate "Packet socket"
---help---
The Packet protocol is used by applications which communicate directly with
network devices without an intermediate network protocol implemented in
the kernel,e. g. tcpdump.
If you want them to work,choose Y.
To compile this driver as a module,choose M here:the module will be called
af_packet.
If unsure,say Y.
config PACKET_MMAP
bool "Packet socket:mmapped IO"
depends on PACKET
---help---
If you say Y here,the Packet protocol driver will use an IO mechanism that
results in faster communication.
If unsure,say N.
config UNIX
tristate "Unix domain sockets"
---help---
If you say Y here,you will include support for Unix domain sockets; sockets
are the standard Unix mechanism for establishing and accessing network
connections. Many commonly used programs such as the X Window system and
syslog use these sockets even if your machine is not connected to any
network. Unless you are working on an embedded system or something
similar,you therefore definitely want to say Y here.
To compile this driver as a module,chaise M here; the module will be called
unix. Note that several important services won't work correctly if you
say M here and then neglect to load the module.
Say Y unless you know what you are doing.
source "net/sched/Kconfig"
source "drivers / net / Kconfig"
source "net/ bluetooth / Kconfig"
endmenu
說明如下:
n??????? 在上面的文件中,符號#后面的內容為注釋,不起任何作用。
n??????? menu作為一個Kconfig文件的主要選項,后面跟隨的字符串,用引號括起來,用做一個配置選項的選項名。一般一個Kconfig文件中也可以有多個menu。menu可以嵌套使用,endmenu表示一個menu的結束。
n??????? 一個menu可以有多個config,每個config作為一個子項,又包含了幾個部分。
n??????? 內核源碼的每個文件夾下都包含Kconfig文件,父目錄下的Kconfig文件使用source "net/bluetooth/Kconfig"來包含子目錄下的Kconfig文件,而最終的頂部的Kconiig文件則由scripts/kconfig/中的文件構成,所有的這些,組成了一個Kconfig樹。
n??????? config子項中包含了幾個小的部分,其中config子項后面跟隨的字符串用于配置完成后,如果該選項被選中,則該字符串前面加上CONFIG_后綴,作為一個宏,寫入配置結果.config中。
n??????? tristate用于config的選項類別,有-boot、tristate、string、hex、integer這幾種可能,一般常用tristate,tristate的意思是三態,即可以是我們上面介紹的未選中——不編譯、選中——編譯為模塊、選中——編譯為新操作系統的一部分3種狀態,驅動一般使用這個類別。
n??????? 在config的選項類別tristate后,跟隨一個用引號括起來的字符串,實際是以下代碼的縮寫:
tristate
prompt "something support"
而prompt "something support"字符串的作用是,作為一個config名字,在配置程序中顯示出來,如果該config對應的名字被選中,則該config被選中。
n??????? depends on的意義是本config依賴于另外一個config,如果想選擇本選項,需要先選中本選項依賴的那個選項。
n??????? help選項的意思就是一些說明該config的資料,這樣在配置新內核的時候,配置人員可以從這里知道config的內核模塊是什么作用,是否需要選入新的操作系統中。
2.4.5? Kconfig文件配置實例
Linux內核中提供了很多設備的驅動代碼,但在每個項目中總會需要添加我們自己的驅動,比如我們需要添加LED的驅動。我們可以先獨立去編寫和調試這個驅動,等成熟后應該放到內核目錄樹中,使用make modules命令統一編譯。而且要在配置選項中體現出來,用戶可以使用make menuconfig命令去配置編譯。假設驅動代碼已編寫、調試完畢,下面我們就以添加LED驅動為例來講解Kconfig文件的配置方法。
(1)選擇一個放置驅動代碼的位置:
cd drivers
mkdir led
把寫好的代碼(假定為LED.c)放到這個drivers/led目錄中。
(2)drivers/led添加Kconfig文件,內容如下:
menu "Led support"
config LED
tristate "LED support"
---help---
LED use gpio as ir input .
If you want LED support,you should say Y here and also to the
specific driver for your bus adapter(s) below.
This led support can be built as a module.
endmenu
(3)在drivers/led添加Makefile文件,編寫Makefile:
obj-$(CONFIG_LED) += LED.o
(4)修改上一級Makefile和Kconfig。
在Makefile中添加:
obj-$(CONFIG_LED) += led/
在Kconfig中添加:
source "drivers/led/Kconfig"
(5)最后,在arch/arm的Kconfig中添加:
source "drivers/led/Kconfig"
具體位置視平臺架構而定。
這樣,Kconfig文件就修改完成了。此時可以使用make menuconfig,發現已有LED support--->選項,進入后選擇M,再使用make modules,就可以發現在led目錄下已生成了LED.ko。
總結
以上是生活随笔為你收集整理的linux中menu命令,menucofig 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle供应商导入,AP供应商导入简
- 下一篇: linux系统加硬盘容量,Linux系统