KernelBuild » History » Revision 32
Revision 31 (Wolfgang Wiedmeyer, 05/08/2017 08:02 AM) → Revision 32/41 (Wolfgang Wiedmeyer, 05/08/2017 08:16 AM)
h1. Kernel Build h2. Use case Building a kernel aside Replicant is faster to set up and faster to build since you do not need to fetch and use the huge Android build system. Users wanting to add a driver to their kernel, or developers that want to work on kernel related areas can do that to speed up the development process. If the changes are integrated back into Replicant, they will automatically be built by the Android build system when building images. h2. Dependencies Since you are not compiling any user space applications, you don't need the Android build system. The Linux kernel and bootloaders such as U-Boot can be built without the Android build system. The Trisquel ARM version of gcc seem to work well. To install it run: <pre> $ apt-get install gcc-arm-none-eabi </pre> If you use distributions such as Parabola, this will probably not work because the arm-none-eabi-gcc is too recent for many device kernels. But there are efforts to make the kernel sources compatible with more recent compiler versions. You can install Trisquel in a container to work around this. This way, it will have very few CPU and memory overhead compared to a virtual machine. It will also save disk space since you can just store the Trisquel rootfs in any directory. h2. Example with crespo under Trisquel h3. Getting the right parameters First download the following example image and its signature: * https://ftp-osl.osuosl.org/pub/replicant/images/replicant-4.2/0004/images/crespo/replicant-4.2-crespo.zip.asc * https://ftp-osl.osuosl.org/pub/replicant/images/replicant-4.2/0004/images/crespo/replicant-4.2-crespo.zip As usual, verify the signature after [[ReplicantReleaseKey#Replicant-42-and-below|importing the release key]]: <pre> $ gpg --armor --verify path/to/replicant-4.2-crespo.zip.asc path/to/replicant-4.2-crespo.zip </pre> Make sure the check succeeds! Then unpack the zip file: <pre> $ mkdir replicant-4.2-crespo && cd replicant-4.2-crespo && unzip ../replicant-4.2-crespo.zip </pre> That should have extracted a boot.img. We then should not forget to look at what format the boot.img is in: <pre> $ file boot.img boot.img: Android bootimg, kernel (0x30008000), ramdisk (0x31000000), page size: 4096, cmdline (console=ttyFIQ0 no_console_suspend) </pre> Here it says it's an "Android bootimg", so we need the following tools: * mkbootimg to pack an image * unpackbootimg unbootimg to unpack an image Ways to get such tools: * [[ReplicantImages|Pre-built Pre-built by Replicant]] Replicant at https://ftp-osl.osuosl.org/pub/replicant/images/replicant-4.2/0004/tools/ * Some GNU/Linux distributions also have packages for some of the tools. * Build Replicant and use its tools. This would That defeat the purpose of this tutorial here since we want to avoid a full build of Replicant. building Replicant fully. Some android tools were converted to build on GNU/Linux without requiring the Android build system: system. * In https://github.com/freesmartphone/utilities, git://git.freesmartphone.org/utilities.git you have the source code for adb in android/adb and for android/adb, mkbootimg and unbootimg in android/image-utils. android/image-utils Some GNU/Linux distributions also have packages for some of the tools. Extract the ramdisk and the kernel image and parameters from the original boot.img: <pre> $ unbootimg --kernel kernel.img --ramdisk ramdisk.img -i boot.img total image size: 3100672 kernel size: 2903532 kernel load addr: 0x30008000 ramdisk size: 189142 ramdisk load addr: 0x31000000 2nd boot size: 0 2nd boot load addr: 0x30f00000 kernel tags addr: 0x30000100 page size: 4096 board: `' cmdline: `console=ttyFIQ0 no_console_suspend' id: bd59d387bf083b0946e25a8f17f1aaef4bcc7412000 </pre> We also check the kernel image format, since we will build that: <pre> $ file kernel.img kernel.img: Linux kernel ARM boot executable zImage (little-endian) </pre> h3. Building If you want to be able to run "make menuconfig", install libncurses5-dev: <pre> # apt-get install libncurses5-dev </pre> Download the sources: <pre> $ git clone https://git.replicant.us/replicant/kernel_samsung_crespo.git </pre> Then in each console you build from, do: <pre> export ARCH=arm export CROSS_COMPILE=arm-none-eabi- </pre> Configure it for crespo: <pre> $ make crespo_defconfig </pre> If you want to configure it furthurer: <pre> $ make menuconfig </pre> Then build a zImage: <pre> $ make -j4 zImage </pre> If the compilation succedded, the image is at: <pre> arch/arm/boot/zImage </pre> h3. Building Failures Many devices specific kernels often contains not very clean code. This is very common with high volume devices due to time to market constraints. Upstream Linux has way higher code quality standards, but having your patches merged there requires more time. As a result, variations in the default kernel configuration for your device can result in build errors. Compilation failures can also happen when you use another gcc version, like we do in this guide. This happens frequently if you use a gcc that is more recent than your kernel. The "not very clean code" also increase the probability of it. h3. Repacking We now create a new boot.img from the parameters and ramdisk.img we extracted from the default boot.img <pre> $ mkbootimg --kernel /path/to/arch/arm/boot/zImage --ramdisk ramdisk.img --cmdline "console=ttyFIQ0 no_console_suspend" --base 0x30000000 --pagesize 4096 -o new-boot.img </pre> Then we verify that it matches the default boot.img parameters: <pre> $ unbootimg -i new-boot.img total image size: 3096576 kernel size: 2899584 kernel load addr: 0x30008000 ramdisk size: 189142 ramdisk load addr: 0x31000000 2nd boot size: 0 2nd boot load addr: 0x30f00000 kernel tags addr: 0x30000100 page size: 4096 board: `' cmdline: `console=ttyFIQ0 no_console_suspend' id: f33faefb7b1eca7d1d1d6dc7603aed2bd82d65c000 </pre> Here we check if the following parameters match: * kernel load addr * ramdisk load addr * Kernel tag addr * page size * cmdline if you don't plan to change it. h3. Testing Reboot the device to the bootloader, and run: <pre> $ fastboot boot new-boot.img < waiting for device > downloading 'boot.img'... OKAY [ 0.435s] booting... OKAY [ 0.288s] finished. total time: 0.723s </pre>