android内核编译教程,以三星I9100为例,android2.3的内核 准备工作:linux系统一个,分区,wubi,虚拟机均可。我是用的wubi安装的ubuntu。如果是以前没编译过内核,推荐先看一下友善的2440或6410的用户手册里关于内核编译的部分,就有下载,android的liunx内核和标准linux内核基本编译过程是一样的。 下载源码,官方或者其他地方均可,比如github的,还可以看到历史变更记录,例如 github/GalaxySII/samsung-kernel-galaxysii/ 最好先sudo -i。解压也要用root权限以保留权限,tar -jxvf xxxx; 理论上解压到任何地方均可,但是最好放到ext分区,因为可以保留权限。主要是initramfs里的文件会丢失权限导致内核无法启动(三星用initramfs,其实就是ramdisk,打包进内核里,并作为根目录挂载点)。 下载编译器,可以自己挑选一个,不过貌似用Sourcery G++ Lite 2009q3的比较多,desourcery/可以下载,可以解压到任何地方。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 即可加载默认配置文件 会生成android简单教程.config文件 然后可以在默认config基础上自己配置,make xconfig比较好用,基于图形界面的配置,需要安装个qt3,apt-get install 命令。 也可以尝试去修改自己感兴趣的东西,不过最好对内核源码有一点了解;通过查看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里安装一个终端,执行dmesg可以看内核输出的信息(就是代码里的printk的输出信息)。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论