一、摘要1
三星的內核區別於其餘手機內核,它集成了ramdisk部分,而不像其它手機那樣ramdisk部分是獨立存在的。那麼在編譯內核的時候,必定要記的加載initramfs部分,不然,這個編譯出來的內核,是不可用的,現象爲第一屏頻繁重啓。
另外,官方開源是沒有initramfs部分的,須要本身下載,或者直接分解官方內核zImage文件,獲得ramdisk部分,也就是initramfs部分。html
android內核編譯教程,以三星I9100爲例,android2.3的內核linux 準備工做:linux系統一個,分區,wubi,虛擬機都可。我是用的wubi安裝的ubuntu。若是是之前沒編譯過內核,推薦先看一下友善的2440或6410的用戶手冊裏關於內核編譯的部分,官網就有下載,android的liunx內核和標準linux內核基本編譯過程是同樣的。 下載源碼,官方或者其餘地方都可,好比github的,還能夠看到歷史變動記錄,例如 https://github.com/GalaxySII/samsung-kernel-galaxysii/ 最好先sudo -i。解壓也要用root權限以保留權限,tar -jxvf xxxx; 理論上解壓到任何地方都可,可是最好放到ext分區,由於能夠保留權限。主要是initramfs裏的文件會丟失權限致使內核沒法啓動(三星用initramfs,其實就是ramdisk,打包進內核裏,並做爲根目錄掛載點)。 下載編譯器,能夠本身挑選一個,不過貌似用Sourcery G++ Lite 2009q3的比較多,http://www.codesourcery.com/能夠下載,能夠解壓到任何地方。Makefile裏定義路徑便可: ARCH = arm CROSS_COMPILE = /media/5CA4D4B1A4D48F40/GS2_kernel/arm-2009q3/bin/arm-none-linux-gnueabi- CROSS_COMPILE = $(CONFIG_CROSS_COMPILE:"%"=%) 注:4.0官方推薦的編譯器爲arm-eabi-4.4.3 toolchain 而後配置環境變量。到root目錄gedit .bashrc export編譯器的路徑。須要從新登陸,能夠用env查看是否添加進去了。 xxx-gcc -v 能夠看編譯器信息。 用絕對路徑能夠不配置。 這樣交叉編譯工具就搞好了。 cd 到內核目錄進行編譯,首先要make config,config不對的話可能致使沒法編譯經過。在 內核目錄/arch/arm/configs裏有默認的defconfig; 9100的是c1_rev02_defconfig,仔細找找也能夠找到jpn,usa版本的defconfig,也能夠用make help看到這些。 Make c1_rev02_defconfig 便可加載默認配置文件 會生成.config文件 而後能夠在默認config基礎上本身配置,make xconfig比較好用,基於圖形界面的配置,須要安裝個qt3,apt-get install libqt3-compat-headers kernel-package build-essential命令。 也能夠嘗試去修改本身感興趣的東西,不過最好對內核源碼有一點了解;經過查看config,Kbuild和makefile或使用git裏面的信息找到相應源文件,而後查看或修改本身感興趣的東西。如能夠修改第2cpu的開關閾值,在arch/arm/mach-s5pv310/pm-hotplug.c裏; 調整觸摸屏參數,drivers/input/touchscreen/mxt224_u1.c; 調節電源管理,包括充電速度等在drivers/power/sec_battery.c 和drivers/power/sec_battery_kor.c和drivers/misc/max8997-muic.c裏面裏面等等。 而後就是make zImage了,須要加幾個選項,因此最好寫個腳本,參考以下: #!/bin/sh myinitramfs="/media/workplace_ext4/initram" compiler="/media/5CA4D4B1A4D48F40/GS2_kernel/arm-2009q3/bin/arm-none-linux-gnueabi-" make -j4 EXTRA_AFLAGS=-mfpu=neon ARCH=arm CROSS_COMPILE=${compiler} INSTALL_MOD_PATH=${myinitramfs} CONFIG_INITRAMFS_SOURCE=${myinitramfs} CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 其中路徑不用說了,要換,cpu有x個核心就make -jx。 而後等待編譯完成。 而後還要build modules,由於一些模塊的驅動編譯成模塊了,並且放到了initramfs裏。參考如下腳本,很簡單,應該都能看懂,若是沒改這些驅動不更新也能夠。 #!/bin/sh myinitramfs="/media/workplace_ext4/initram" compiler="/media/5CA4D4B1A4D48F40/GS2_kernel/arm-2009q3/bin/arm-none-linux-gnueabi-" #rm -rf ${myinitramfs}/lib/modules/*.ko cp drivers/bluetooth/bthid/bthid.ko ${myinitramfs}/lib/modules/bthid.ko cp drivers/net/wireless/bcm4330/Desire HD.ko ${myinitramfs}/lib/modules/Desire HD.ko cp drivers/samsung/j4fs/j4fs.ko ${myinitramfs}/lib/modules/j4fs.ko cp drivers/samsung/fm_si4709/Si4709_driver.ko ${myinitramfs}/lib/modules/Si4709_driver.ko cp drivers/scsi/scsi_wait_scan.ko ${myinitramfs}/lib/modules/scsi_wait_scan.ko cp drivers/samsung/vibetonz/vibrator.ko ${myinitramfs}/lib/modules/vibrator.ko cp drivers/media/video/gspca/gspca_main.ko ${myinitramfs}/lib/modules/gspca_main.ko cp drivers/staging/android/logger.ko ${myinitramfs}/lib/modules/logger.ko cp fs/cifs/cifs.ko ${myinitramfs}/lib/modules/cifs.ko cp fs/lockd/lockd.ko ${myinitramfs}/lib/modules/lockd.ko cp fs/nfs/nfs.ko ${myinitramfs}/lib/modules/nfs.ko cp net/sunrpc/auth_gss/auth_rpcgss.ko ${myinitramfs}/lib/modules/auth_rpcgss.ko cp net/sunrpc/auth_gss/rpcsec_gss_krb5.ko ${myinitramfs}/lib/modules/rpcsec_gss_krb5.ko cp net/sunrpc/sunrpc.ko ${myinitramfs}/lib/modules/sunrpc.ko chmod 644 ${myinitramfs}/lib/modules/*.ko #add -march=armv7-a -mtune=cortex-a9 -mfpu=neon to Makefile KBUILD_CFLAGS make -j `cat /proc/cpuinfo |grep -c ^processor` EXTRA_AFLAGS=-mfpu=neon ARCH=arm CROSS_COMPILE=${compiler} INSTALL_MOD_PATH=${myinitramfs} CONFIG_INITRAMFS_SOURCE=${myinitramfs} CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 而後打包/arch/arm/boot/zImage:tar cvf GT-I9100_Kernel.tar zImage就能夠用odin刷內核了。 android 若是能啓動,但某些模塊有問題須要調試,能夠在android裏安裝一個終端,執行dmesg能夠看內核輸出的信息(就是代碼裏的printk的輸出信息)。git 待整理~~~~~~~~~~github |