內核,是一個操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網路系統,決定著系統的性能和穩定性。Linux作為一個自由軟體,
在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,並增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統度身定
制一個更高效,更穩定的內核,就需要重新編譯內核。本文將以RedHat Linux 6.0(kernel
2.2.5)為操作系統平台,介紹在Linux上進行內核編譯的方法。
一、 下載新內核的源代碼
目前,在Internet上提供Linux源代碼的站點有很多,讀者可以選擇一個速度較快的站點下載。筆者是從站點www.kernelnotes.org上下載了Linux的最新開發版內核2.3.14的源代碼,全部代碼被壓縮到一個名叫Linux-2.3.14.tar.gz的文件中。
二、 釋放內核源代碼
由於源代碼放在一個壓縮文件中,因此在配置內核之前,要先將源代碼釋放到指定的目錄下。首先以root帳號登錄,然後進入/usr/src子目錄。如果用戶在安裝Linux時,安裝了內核的源代碼,則會發現一個linux-2.2.5的子目錄。該目錄下存放著內核2.2.5的源代碼。此外,還會發現一個指向該目錄的鏈接linux。刪除該連接,然後將新內核的源文件拷貝到/usr/src目錄中。
(一)、用tar命令釋放內核源代碼
# cd /usr/src
# tar zxvf Linux-2.3.14.tar.gz
文件釋放成功後,在/usr/src目錄下會生成一個linux子目錄。其中包含了內核2.3.14的全部源代碼。
(二)、將/usr/include/asm、/usr/inlude/linux、/usr/include/scsi鏈接到/usr/src/linux/include目錄下的對應目錄中。
# cd /usr/include
# rm -Rf asm linux
# ln -s /usr/src/linux/include/asm-i386 asm
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi
(三)、刪除源代碼目錄中殘留的.o文件和其它從屬文件。
# cd /usr/src/linux
# make mrproper
三、 配置內核
(一)、啟動內核配置程序。
# cd /usr/src/linux
# make config
除了上面的命令,用戶還可以使用make menuconfig命令啟動一個菜單模式的配置界面。如果用戶安裝了X window系統,還可以執行make xconfig命令啟動X window下的內核配置程序。
(二)、配置內核
Linux的
內核配置程序提供了一系列配置選項。對於每一個配置選項,用戶可以回答"y"、"m"或"n"。其中"y"表示將相應特性的支持或設備驅動程序編譯進內
核;"m"表示將相應特性的支持或設備驅動程序編譯成可載入模塊,在需要時,可由系統或用戶自行加入到內核中去;"n"表示內核不提供相應特性或驅動程序
的支持。由於內核的配置選項非常多,本文只介紹一些比較重要的選項。
1、Code maturity level options(代碼成熟度選項)
Prompt for development and/or incomplete code/drivers
(CONFIG_EXPERIMENTAL) [N/y/?]
如果用戶想要使用還處於測試階段的代碼或驅動,可以選擇「y」。如果想編譯出一個穩定的內核,則要選擇「n」。
1、 Processor type and features(處理器類型和特色)
(1)、Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC, PPro/6x86MX) [PPro/6x86MX] 選擇處理器類型,預設為Ppro/6x86MX。
(2)、Maximum Physical Memory (1GB, 2GB) [1GB] 內核支持的最大內存數,預設為1G。
(3)、Math emulation (CONFIG_MATH_EMULATION) [N/y/?] 協處理器模擬,預設為不模擬。
(4)、MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]
選擇該選項,系統將生成/proc/mtrr文件對MTRR進行管理,供X server使用。
(5)、Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] 選擇「y」,內核將支持對稱多處理器。
2、 Loadable mole support(可載入模塊支持)
(1)、Enable loadable mole support (CONFIG_MODULES) [Y/n/?] 選擇「y」,內核將支持載入模塊。
(2)、Kernel mole loader (CONFIG_KMOD) [N/y/?] 選擇「y」,內核將自動載入那些可載入模塊,否則需要用戶手工載入。
3、 General setup(一般設置)
(1)、Networking support (CONFIG_NET) [Y/n/?] 該選項設置是否在內核中提供網路支持。
(2)、PCI support (CONFIG_PCI) [Y/n/?] 該選項設置是否在內核中提供PCI支持。
(3)、PCI access mode (BIOS, Direct, Any) [Any] 該選項設置Linux探測PCI設備的方式。選擇「BIOS」,Linux將使用BIOS;選擇「Direct」,Linux將不通過BIOS;選擇「Any」,Linux將直接探測PCI設備,如果失敗,再使用BIOS。
(4)Parallel port support (CONFIG_PARPORT) [N/y/m/?] 選擇「y」,內核將支持平行口。
4、 Plug and Play configuration(即插即用設備支持)
(1)、Plug and Play support (CONFIG_PNP) [Y/m/n/?] 選擇「y」,內核將自動配置即插即用設備。
(2)、ISA Plug and Play support (CONFIG_ISAPNP) [Y/m/n/?] 選擇「y」,內核將自動配置基於ISA匯流排的即插即用設備。
5、 Block devices(塊設備)
(1)、Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/m/n/?] 選擇「y」,內核將提供對軟盤的支持。
(2)、Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE) [Y/m/n/?] 選擇「y」,內核將提供對增強IDE硬碟、CDROM和磁帶機的支持。
6、 Networking options(網路選項)
(1)、Packet socket (CONFIG_PACKET) [Y/m/n/?] 選擇「y」,一些應用程序將使用Packet協議直接同網路設備通訊,而不通過內核中的其它中介協議。
(2)、Network firewalls (CONFIG_FIREWALL) [N/y/?] 選擇「y」,內核將支持防火牆。
(3)、TCP/IP networking (CONFIG_INET) [Y/n/?] 選擇「y」,內核將支持TCP/IP協議。
(4)The IPX protocol (CONFIG_IPX) [N/y/m/?] 選擇「y」,內核將支持IPX協議。
(5)、Appletalk DDP (CONFIG_ATALK) [N/y/m/?] 選擇「y」,內核將支持Appletalk DDP協議。
8、SCSI support(SCSI支持)
如果用戶要使用SCSI設備,可配置相應選項。
9、Network device support(網路設備支持)
Network device support (CONFIG_NETDEVICES) [Y/n/?] 選擇「y」,內核將提供對網路驅動程序的支持。
10、Ethernet (10 or 100Mbit)(10M或100M乙太網)
在該項設置中,系統提供了許多網卡驅動程序,用戶只要選擇自己的網卡驅動就可以了。此外,用戶還可以根據需要,在內核中加入對FDDI、PPP、SLIP和無線LAN(Wireless LAN)的支持。
11、Character devices(字元設備)
(1)、Virtual terminal (CONFIG_VT) [Y/n/?] 選擇「y」,內核將支持虛擬終端。
(2)、Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]
選擇「y」,內核可將一個虛擬終端用作系統控制台。
(3)、Standard/generic (mb) serial support (CONFIG_SERIAL) [Y/m/n/?]
選擇「y」,內核將支持串列口。
(4)、Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]
選擇「y」,內核可將一個串列口用作系統控制台。
12、Mice(滑鼠)
PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [Y/n/?] 如果用戶使用的是PS/2滑鼠,則該選項應該選擇「y」。
13、Filesystems(文件系統)
(1)、Quota support (CONFIG_QUOTA) [N/y/?] 選擇「y」,內核將支持磁碟限額。
(2)、Kernel automounter support (CONFIG_AUTOFS_FS) [Y/m/n/?] 選擇「y」,內核將提供對automounter的支持,使系統在啟動時自動 mount遠程文件系統。
(3)、DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?] 選擇「y」,內核將支持DOS FAT文件系統。
(4)、ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/m/n/?]
選擇「y」,內核將支持ISO 9660 CDROM文件系統。
(5)、NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/m/?]
選擇「y」,用戶就可以以只讀方式訪問NTFS文件系統。
(6)、/proc filesystem support (CONFIG_PROC_FS) [Y/n/?] /proc是存放Linux系統運行狀態的虛擬文件系統,該項必須選擇「y」。
(7)、Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?] EXT2是Linux的標准文件系統,該項也必須選擇「y」。
14、Network File Systems(網路文件系統)
(1)、NFS filesystem support (CONFIG_NFS_FS) [Y/m/n/?] 選擇「y」,內核將支持NFS文件系統。
(2)、SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS)
選擇「y」,內核將支持SMB文件系統。
(3)、NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS)
選擇「y」,內核將支持NCP文件系統。
15、Partition Types(分區類型)
該選項支持一些不太常用的分區類型,用戶如果需要,在相應的選項上選擇「y」即可。
16、Console drivers(控制台驅動)
VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?] 選擇「y」,用戶就可以在標準的VGA顯示方式下使用Linux了。
17、Sound(聲音)
Sound card support (CONFIG_SOUND) [N/y/m/?] 選擇「y」,內核就可提供對音效卡的支持。
18、Kernel hacking(內核監視)
Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?] 選擇「y」,用戶就可以對系統進行部分控制。一般情況下選擇「n」。
四、 編譯內核
(一)、建立編譯時所需的從屬文件
# cd /usr/src/linux
# make dep
(二)、清除內核編譯的目標文件
# make clean
(三)、編譯內核
# make zImage
內核編譯成功後,會在/usr/src/linux/arch/i386/boot目錄中生成一個新內核的映像文件zImage。如果編譯的內核很大的話,系統會提示你使用make bzImage命令來編譯。這時,編譯程序就會生成一個名叫bzImage的內核映像文件。
(四)、編譯可載入模塊
如果用戶在配置內核時設置了可載入模塊,則需要對這些模塊進行編譯,以便將來使用insmod命令進行載入。
# make moles
# make modelus_install
編譯成功後,系統會在/lib/moles目錄下生成一個2.3.14子目錄,裡面存放著新內核的所有可載入模塊。
五、 啟動新內核
(一)、將新內核和System.map文件拷貝到/boot目錄下
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.3.14
# cp /usr/src/linux/System.map /boot/System.map-2.3.14
# cd /boot
# rm -f System.map
# ln -s System.map-2.3.14 System.map
(二)、配置/etc/lilo.conf文件。在該文件中加入下面幾行:
default=linux-2.3.14
image=/boot/vmlinuz-2.3.14
label=linux-2.3.14
root=/dev/hda1
read-only
(三)、使新配置生效
# /sbin/lilo
(四)、重新啟動系統
# /sbin/reboot
新內核如果不能正常啟動,用戶可以在LILO:提示符下啟動舊內核。然後查出故障原因,重新編譯新內核即可。
了解更多開源相關,去LUPA社區看看吧。
B. linux編譯內核步驟
一、准備工作
a) 首先,你要有一台PC(這不廢話么^_^),裝好了Linux。
b) 安裝好GCC(這個指的是host gcc,用於編譯生成運行於pc機程序的)、make、ncurses等工具。
c) 下載一份純凈的Linux內核源碼包,並解壓好。
注意,如果你是為當前PC機編譯內核,最好使用相應的Linux發行版的源碼包。
不過這應該也不是必須的,因為我在我的Fedora 13上(其自帶的內核版本是2.6.33.3),就下載了一個標準的內核linux-2.6.32.65.tar.xz,並且順利的編譯安裝成功了,上電重啟都OK的。不過,我使用的.config配置文件,是Fedora 13自帶內核的配置文件,即/lib/moles/`uname -r`/build/.config
d) 如果你是移植Linux到嵌入式系統,則還要再下載安裝交叉編譯工具鏈。
例如,你的目標單板CPU可能是arm或mips等cpu,則安裝相應的交叉編譯工具鏈。安裝後,需要將工具鏈路徑添加到PATH環境變數中。例如,你安裝的是arm工具鏈,那麼你在shell中執行類似如下的命令,假如有類似的輸出,就說明安裝好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
註:arm的工具鏈,可以從這里下載:回復「ARM」即可查看。
二、設置編譯目標
在配置或編譯內核之前,首先要確定目標CPU架構,以及編譯時採用什麼工具鏈。這是最最基礎的信息,首先要確定的。
如果你是為當前使用的PC機編譯內核,則無須設置。
否則的話,就要明確設置。
這里以arm為例,來說明。
有兩種設置方法():
a) 修改Makefile
打開內核源碼根目錄下的Makefile,修改如下兩個Makefile變數並保存。
ARCH := arm
CROSS_COMPILE := arm-linux-
注意,這里cross_compile的設置,是假定所用的交叉工具鏈的gcc程序名稱為arm-linux-gcc。如果實際使用的gcc名稱是some-thing-else-gcc,則這里照葫蘆畫瓢填some-thing-else-即可。總之,要省去名稱中最後的gcc那3個字母。
b) 每次執行make命令時,都通過命令行參數傳入這些信息。
這其實是通過make工具的命令行參數指定變數的值。
例如
配置內核時時,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
編譯內核時使用
make ARCH=arm CROSS_COMPILE=arm-linux-
注意,實際上,對於編譯PC機內核的情況,雖然用戶沒有明確設置,但並不是這兩項沒有配置。因為如果用戶沒有設置這兩項,內核源碼頂層Makefile(位於源碼根目錄下)會通過如下方式生成這兩個變數的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=
經過上面的代碼,ARCH變成了PC編譯機的arch,即SUBARCH。因此,如果PC機上uname -m輸出的是ix86,則ARCH的值就成了i386。
而CROSS_COMPILE的值,如果沒配置,則為空字元串。這樣一來所使用的工具鏈程序的名稱,就不再有類似arm-linux-這樣的前綴,就相當於使用了PC機上的gcc。
最後再多說兩句,ARCH的值還需要再進一步做泛化。因為內核源碼的arch目錄下,不存在i386這個目錄,也沒有sparc64這樣的目錄。
因此頂層makefile中又構造了一個SRCARCH變數,通過如下代碼,生成他的值。這樣一來,SRCARCH變數,才最終匹配到內核源碼arch目錄中的某一個架構名。
SRCARCH := $(ARCH)
ifeq ($(ARCH),i386)
SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif
ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif
ifeq ($(ARCH),sh64)
SRCARCH := sh
endif
三、配置內核
內核的功能那麼多,我們需要哪些部分,每個部分編譯成什麼形式(編進內核還是編成模塊),每個部分的工作參數如何,這些都是可以配置的。因此,在開始編譯之前,我們需要構建出一份配置清單,放到內核源碼根目錄下,命名為.config文件,然後根據此.config文件,編譯出我們需要的內核。
但是,內核的配置項太多了,一個一個配,太麻煩了。而且,不同的CPU架構,所能配置的配置項集合,是不一樣的。例如,某種CPU的某個功能特性要不要支持的配置項,就是與CPU架構有關的配置項。所以,內核提供了一種簡單的配置方法。
以arm為例,具體做法如下。
a) 根據我們的目標CPU架構,從內核源碼arch/arm/configs目錄下,找一個與目標系統最接近的配置文件(例如s3c2410_defconfig),拷貝到內核源碼根目錄下,命名為.config。
注意,如果你是為當前PC機編譯內核,最好拷貝如下文件到內核源碼根目錄下,做為初始配置文件。這個文件,是PC機當前運行的內核編譯時使用的配置文件。
/lib/moles/`uname -r`/build/.config
這里順便多說兩句,PC機內核的配置文件,選擇的功能真是多。不編不知道,一編才知道。Linux發行方這樣做的目的,可能是想讓所發行的Linux能夠滿足用戶的各種需求吧。
b) 執行make menuconfig對此配置做一些需要的修改,退出時選擇保存,就將新的配置更新到.config文件中了。
注
C. Linux內核源碼如何編譯
首先uname -r看一下你當前的linux內核版本
1、linux的源碼是在/usr/src這個目錄下,此目錄有你電腦上各個版本的linux內核源代碼,用uname -r命令可以查看你當前使用的是哪套內核,你把你下載的內核源碼也保存到這個目錄之下。
2、配置內核 make menuconfig,根據你的需要來進行選擇,設置完保存之後會在當前目錄下生成.config配置文件,以後的編譯會根據這個來有選擇的編譯。
3、編譯,依次執行make、make bzImage、make moles、make moles
4、安裝,make install
5、.創建系統啟動映像,到 /boot 目錄下,執行 mkinitramfs -o initrd.img-2.6.36 2.6.36
6、修改啟動項,因為你在啟動的時候會出現多個內核供你選擇,此事要選擇你剛編譯的那個版本,如果你的電腦沒有等待時間,就會進入默認的,默認的那個取決於 /boot/grub/grub.cfg 文件的設置,找到if [ "${linux_gfx_mode}" != "text" ]這行,他的第一個就是你默認啟動的那個內核,如果你剛編譯的內核是在下面,就把代表這個內核的幾行代碼移到第一位如:
menuentry 'Ubuntu, with Linux 3.2.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 9961c170-2566-41ac-8155-18f231c1bea5
linux/boot/vmlinuz-3.2.0-35-generic root=UUID=9961c170-2566-41ac-8155-18f231c1bea5 ro quiet splash $vt_handoff
initrd/boot/initrd.img-3.2.0-35-generic
}
當然你也可以修改 set default="0"來決定用哪個,看看你的內核在第幾位,default就填幾,不過我用過這種方法,貌似不好用。
重啟過後你編譯的內核源碼就成功地運行了,如果出現問題,比如滑鼠不能用,usb不識別等問題就好好查查你的make menuconfig這一步,改好後就萬事ok了。
最後再用uname -r看看你的linux內核版本。是不是你剛下的那個呢!有沒有成就感?
打字不易,如滿意,望採納。
D. CentOS 5.5下如何編譯安裝新內核
第一步:下載內核
傳送門:地址.筆者下載的是3.2.84版本
第二步:解壓編譯內核
由於我下的是.tar.xz文件,用tar命令不能直接解壓。
1.我的系統里不帶xz解壓軟體,先下載xz-5.0.3.tar.bz2文件並解壓安裝
tar -jvxf xz-5.0.3.tar.bz2 cd /opt/xz-5.0.3 #進入解壓後的文件夾 ./configure make make install2.解壓內核
xz -d linux-3.2.84.tar.xz tar -xvf linux-3.2.84.tar3.如果是第一次編譯內核,並沒有上次殘留的文件可以跳過該步驟(最好仔細看下指令對應的功能)
make mrproper make clean 刪除大多數的編譯生成文件, 但是會保留內核的配置文件.config, 還有足夠的編譯支持來建立擴展模塊 make mrproper 刪除所有的編譯生成文件, 還有內核配置文件, 再加上各種備份文件 make distclean mrproper刪除的文件, 加上編輯備份文件和一些補丁文件。4.搭建編譯內核所需要的環境
yum -y install gcc yum install ncurses ncurses-devel yum install openssl-devel5.進入內核解壓文件夾配置內核參數
由於我是個小白不會選,為了方便,直接用make localmodconfig命令,這個命令是以本來的.config文件為基礎去選,可以參考論文:嵌入式linux系統的裁剪優化和測試技術.然後我就一直回車直到結束。然後再輸入make menuconfig命令進入圖形選擇菜單,將kenel hacking中的Sample..選項去掉(具體那一項我忘了,尷尬),退出保存。然後編輯.config文件中的“CONFIG_SYSFS_DEPRECATED”,默認該選項為not set,被注釋掉的,將其改為y,即修改為“CONFIG_SYSFS_DEPRECATED=y”,之後可能還要修改,後面再說。
6.編譯新內核
make bzImage && make moles && make moles_install7.安裝內核
8.編譯安裝可能出現的情況
應該是沒什麼問題, 不過也不排除會出現下面的情況:make:警告:檢測到時鍾錯誤。您的創建可能是不完整的。 解決辦法:find . -type f -exec touch {} ; 重新編譯下就好了。
9.處理下img中的東西(我說不清楚= =)
1)解壓initrd文件
# cp /boot/initrd-3.2.84.img /tmp # cd /tmp/ # ls initrd-2.6.30.4.img # mkdir newinitrd # cd newinitrd/ # zcat ../initrd-2.6.30.4.img | cpio -i釋放之後看到如下內容
# ls bin dev etc init lib proc sbin sys sysroot2)編輯init,刪掉其中重復的四行中的兩行 echo “Loading dm-region-hash.ko mole” insmod /lib/dm-region-hash.ko echo “Loading dm-region-hash.ko mole” insmod /lib/dm-region-hash.ko 3)重新打包initrd
# find . | cpio -c -o > ../initrd 11538 blocks # cd .. # gzip -9 < initrd > initrd.img # ls initrd-2.6.30.4.img initrd initrd.img這裡面的initrd.img就是重新打包後的文件。 4)把initrd.img復制到/boot下 命令:#cp initrd.img /boot 5)修改grub.config,在/etc文件夾下 把initrd-3.2.84.img改為initrd.img就可以了 6)reboot重啟 記得選擇自己的內核!別錯過啦!
以上內容就是小編為大家帶來的關於CentOS 5.5下編譯安裝新內核的方法了,希望可以幫助到大家!
E. 我已經在uboot上設了啟動參數這個環境變數,內核編譯時還需要設置命令行參數嗎
1、u-boot先初始化些必要設備串口、網卡、flash、顯示屏等驅2、flash、SD卡、tftp伺服器取內核映像文件3、內核映像文件解壓內存4、校驗內核5、設定配置參數跳內核執行
F. 如何編譯linux內核內核 mint系統實現系統調用
《linux內核設計與實現》讀書筆記(五)-系統調用主要內容:什麼是系統調用linux上的系統調用實現原理一個簡單的系統調用的實現1ernel/sys.c我在sys.c中追加了2個函數:sys_foo和sys_bar如果是在x86_64的內核中增加一個系統調用,只需修改 arch/x86/include/asm/unistd_64.h,比如sys_bar。修改內容參見下面的diff文件:diff -r new/arch/x86/ia32/ia32entry.S old/arch/x86/ia32/ia32entry.S855d854< .quad sys_foodiff -r new/arch/x86/include/asm/unistd_32.h old/arch/x86/include/asm/unistd_32.h357d356< #define __NR_foo 349361c360< #define NR_syscalls 350--- > #define NR_syscalls 349diff -r new/arch/x86/include/asm/unistd_64.h old/arch/x86/include/asm/unistd_64.h689,692d688< #define __NR_foo 312< __SYSCALL(__NR_foo, sys_foo)< #define __NR_bar 313< __SYSCALL(__NR_bar, sys_bar)diff -r new/arch/x86/kernel/syscall_table_32.S old/arch/x86/kernel/syscall_table_32.S351d350< .long sys_foodiff -r new/include/asm-generic/unistd.h old/include/asm-generic/unistd.h694,695d693< #define __NR_foo 272< __SYSCALL(__NR_foo, sys_foo)698c696< #define __NR_syscalls 273---> #define __NR_syscalls 272diff -r new/kernel/sys.c old/kernel/sys.c1920,1928d1919<< asmlinkage long sys_foo(void)< {< return 1112223334444555;< }< asmlinkage long sys_bar(void)< {< return 1234567890;< } 3.3 編譯內核#cd linux-3.2.28#make menuconfig (選擇要編譯參數,如果不熟悉內核編譯,用默認選項即可)#make all (這一步真的時間很長......)#make moles_install#make install (這一步會把新的內核加到啟動項中)#reboot (重啟系統進入新的內核)3.4 編寫調用的系統調用的代碼#include <unistd.h>#include <sys/syscall.h>#include <string.h>#include <stdio.h>#include <errno.h>#define __NR_foo 312#define __NR_bar 313 int main(){ printf (result foo is %ld/n, syscall(__NR_foo)); printf(%s/n, strerror(errno)); printf (result bar is %ld/n, syscall(__NR_bar)); printf(%s/n, strerror(errno)); return 0;}編譯運行上面的代碼:#gcc test.c -o test#./test運行結果如下:result foo is 1112223334444555Successresult bar is 1234567890Success
G. liinux 編譯參數 –D__KERNEL__ -DMODULE 是什麼意思
Linux內核模塊的編譯
KERNEL 是內核的意思
MODULE是模塊的意思
想編譯內核模塊,需要使用這兩個參數
H. 如何在Windows下編譯Linux內核
內核配置完成,輸入make命令即可開始編譯內核。如果沒有修改Makefile文件並指定ARCH和CROSS_COMPILE參數,則須在命令行中指定:
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
目前大多數主機都是多核處理器,為了加快編譯進度,可以開啟多線程編譯,在make的時候加上「-jN」即可,N的值為處理器核心數目的2倍。例如對於I7 4核處理器,可將N設置為8:
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j8
採用多線程編譯的優點是能加快編譯進度,。具體可以參照ZLG《嵌入式Linux開發教程(下冊)》第1章。
I. 如何編譯android kernel
1.准備工作: (ubuntu1110 32位)
ubuntu等linuxOS,下載好eclipse,安裝好JDK, 安裝好android的SDK, 在eclipse中成功打開android 手機模擬器即OK。
2.初始化編譯環境 :
關注該網頁上的「installing required packages」,其中有的軟體包因為版本問題而安裝不上,不用管它,之後遇到錯誤再單獨解決。
3.下載內核源碼:
android 2.3 內核 下載需要等待一段時間。
4.下載交叉編譯器:
該步驟有可能耗費大量時間,依據網速不同,幾個小時到幾天不等,或許可以嘗試git clone 後面的地址只下載prebuilt/linux-x86/toolchain
5.設置參數以及編譯:
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd goldfish // 進入下載的源代碼目錄
$ git checkout <commit_from_first_step> //這個步驟我沒有做,不知道幹嘛用的
$ make goldfish_defconfig
$ make
6.報錯信息:
若有報錯說找不到 (arm-eabi-gcc command not found)等等,嘗試使用http://blog.csdn.net/davidbeckham2901/article/details/7397447 中說到的解決方案即可(即採用另外一個交叉編譯器)。
7.測試:
最後,測試一下剛才編譯的內核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系統找不到,可以去android SDK中某文件夾找到,加入系統PATH即可。 -avd後面的參數 myavd即為模擬器的名字,這個我是在eclipse中的模擬器管理中新建的一個模擬器,用那個模擬器的名字即可。 -kernel後面的參數就找到剛才編譯出的內核的路徑。
若啟動模擬器失敗,可嘗試關閉後再啟動。第一次啟動模擬器時可能需要等待比較長的時間,3分鍾到15分鍾不等。
J. 如何編譯內核及製作RPM包
前言
要編譯自內核能各種同答案列舉:
1 研究習內核源碼
2 支持新硬體或者打某項內核功能
3 升級內核更新版本
4 按自要求定製優化內核功能
種種...
折騰需要理由我說面直接進入主題
編譯式
編譯內核種式kernel.org載選擇載需要版本內核源碼
:linux-2.6.32-rc1.tar.bz2載內核源碼/home/user/目錄進入載目錄解壓壓縮包
#cd /home/user/
#tar -xjvf linux-2.6.32-rc1.tar.bz2
二 准備編譯環境
始前首先確認面軟體包已經安裝(編譯標普華4.0直接全部安裝CD3保證條件)
* rpmdevtools
* yum-utils
fedora系統使用命令安裝:
#yum install yum-utils rpmdevtools
1. rpmbuild命令工作所需目錄樹面命令完該操作手建立目錄樹
命令建立:
#rpmdev-setuptree
命令/usr/src/rpmbuild/目錄目錄結構(位置沒則能前用戶目錄).
# tree /usr/src/rpmbuild/
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
面部rpmbuild環境建立rpm
3. 安裝內核源碼包需要依賴組件(跳步操作)
su -c 'yum-builddep kernel-.src.rpm'
4.安裝內核源碼系統默認目錄/usr/src/neoshine:
rpm -Uvh kernel-.src.rpm
三 配置內核(config配置文件)
面介紹何解源碼包並修改配置重新打包源碼
1. 解源碼包並打所補丁BUILD目錄
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec
kernel源碼找:
/usr/src/neoshine/rpmbuild/BUILD/kernel-/linux-. directory
配置內核源碼
1. 進入內核源碼:
cd ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch/
2. 復制/boot/config*配置文件源碼目錄,config文件已經配或者其備份kernel配置文件:
cp /boot/config2.6- 2.6.$ver.$arch .config
3. 先檢查kernel配置新增選項:
make oldconfig
4. 定製內核功能關閉initrd支持選項執行圖形化內核配置工具:
make menuconfig
註:generic setup選項找initial RAM system and RAM disk(initramfs and initrd) support 項取消編譯同確保跟文件系統應驅系統所存儲器應驅都已經編譯內核(否則啟系統).
5. .config文件第行改面內容(注意:沒行面編譯報錯)
# i386
6. 拷貝.configSOURCES/:
cp .config ../SOURCES/config-$arch
四 編譯新內核
1. 面始准備編譯新內核包
打SPEC/kernel.spec
vim SPEC/kernel.spec
改變面行內容定製自內核擴展名(fc10類):
%define buildid .
步新內核rpm包程需要編譯內核源碼包
使用面命令新內核源碼包
rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec
參數說明:bb表示編譯二進制包即源碼包without debuginfo 表示沒調試信息
target=`uname -r`表示應前平台內核包
面命令功執行完BUILD/i686目錄新內核安裝包
五 安裝新內核
rpm -ivh kernel-$ver-$arch.rpm
步操作自安裝內核boot目錄安裝應內核模塊/lib/moles/目錄並且新內核應grub引導菜單
修改grub引導菜單格式
title new kernel
kernel /boot/vmlinuz-$ver-$arch root=/dev/sdax(hdax)
注意處要使用uuid指定跟文件系統(能掛載根區導致內核死機)要再加顯示相關參數(內核支持應設置看黑黑屏幕)
至禁用initrd新內核配置安裝完畢