三星内核编译摘要

一、摘要1
三星的内核区别于其余手机内核,它集成了ramdisk部分,而不像其它手机那样ramdisk部分是独立存在的。那么在编译内核的时候,必定要记的加载initramfs部分,不然,这个编译出来的内核,是不可用的,现象为第一屏频繁重启。
另外,官方开源是没有initramfs部分的,须要本身下载,或者直接分解官方内核zImage文件,获得ramdisk部分,也就是initramfs部分。html

 

android内核编译教程,以三星I9100为例,android2.3的内核linux


准备工做:linux系统一个,分区,wubi,虚拟机都可。我是用的wubi安装的ubuntu。若是是之前没编译过内核,推荐先看一下友善的24406410的用户手册里关于内核编译的部分,官网就有下载,androidliunx内核和标准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 configconfig不对的话可能致使没法编译经过。在   内核目录/arch/arm/configs里有默认的defconfig; 9100的是c1_rev02_defconfig,仔细找找也能够找到jpnusa版本的defconfig,也能够用make help看到这些。
Make c1_rev02_defconfig 便可加载默认配置文件
会生成.config文件
而后能够在默认config基础上本身配置,make xconfig比较好用,基于图形界面的配置,须要安装个qt3,apt-get install libqt3-compat-headers kernel-package build-essential命令。

也能够尝试去修改本身感兴趣的东西,不过最好对内核源码有一点了解;经过查看configKbuildmakefile或使用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.cdrivers/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  

其中路径不用说了,要换,cpux个核心就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/zImagetar cvf GT-I9100_Kernel.tar zImage就能够用odin刷内核了。

android

若是能启动,但某些模块有问题须要调试,能够在android里安装一个终端,执行dmesg能够看内核输出的信息(就是代码里的printk的输出信息)。git

待整理~~~~~~~~~~github

相关文章
相关标签/搜索