We're hiring!
*

Quick hack: Raspberry Pi meets Linux kernel mainline

Helen Koike avatar

Helen Koike
March 12, 2019

Share this post:

With just a few simple steps, you can compile and boot a Raspberry Pi using the Linux kernel mainline source code. Here's a quick tutorial on how to do just that.

This post uses Raspberry Pi model B rev2 as a base, however you can easily adapt it to your board.

Install Raspbian on a SD card:

Download any Raspbian image from https://www.raspberrypi.org/downloads/raspbian/

unzip 2018-11-13-raspbian-stretch-lite.zip
# Check with lsblk what is the device path of your sdcard, using /dev/mmcblk0 just for this example
sudo dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/mmcblk0 bs=512M

Insert your SD card into the Raspberry Pi and turn it on. Raspbian will finish its installation.

Once the boot process is complete, turn it off and insert the SD card into your computer again.

Install the tool chain

sudo apt install gcc-arm-linux-gnueabihf

Cross compiling the kernel

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2835_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 zImage modules dtbs

Installing the kernel on the SD card

# Mount the sdcard partitions
mkdir -p ../rpi-boot
mkdir -p ../rpi-rootfs
sudo mount /dev/mmcblk0p1 ../rpi-boot
sudo mount /dev/mmcblk0p2 ../rpi-rootfs

# Install the modules to the rootfs
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../rpi-rootfs modules_install

# Copy the kernel and the device tree files to the sdcard
sudo cp arch/arm/boot/zImage ../rpi-boot
sudo cp arch/arm/boot/dts/*.dtb ../rpi-boot

# Inform to the firmware which kernel image and device tree to use
# You might need to change the device tree according to you board model
echo "kernel=zImage" >> ../rpi-boot/config.txt
echo "device_tree=bcm2835-rpi-b-rev2.dtb" >> ../rpi-boot/config.txt

# Unmount
sudo umount ../rpi-boot
sudo umount ../rpi-rootfs

That's it! Remove the SD card, plug it in your Raspberry Pi and boot!

Automating

Now, just put the previous commands in a bash script (just remember to remove the lines that modifies config.txt as this is only required once), and execute it whenever you want to re-build and re-install the kernel on your sdcard.

Booting the original kernel

If you need to revert to the original kernel, you can always do so by inserting the SD card into your computer, mounting the boot partition and commenting the kernel and device_tree lines from your config.txt

# Uncomment these lines to boot custom kernel
#kernel=zImage
#device_tree=bcm2835-rpi-b-rev2.dtb

Happy hacking!


Visit Helen's blog.

Comments (2)

  1. wb666greene:
    Mar 14, 2019 at 03:29 PM

    What is the point? What is wrong with the kernel that comes with Raspbian? How long does it take to compile? Took over five hours to compile openCV on my Pi2.

    Reply to this comment

    Reply to this comment

    1. Helen Koike:
      Mar 14, 2019 at 06:01 PM

      There are several reasons someone may want to use mainline kernel:
      * You want to contribute back to the community by fixing a bug, helping with testing and reporting the bugs you find, helping to develop a new feature or optimization.
      * You need a feature that was recently added to the kernel but it is not in Raspbian kernel yet
      * You want compile the kernel with some optimizations, or leave out some parts of the kernel that you don't use to make a smaller footprint.

      Regarding the compilation time, it depends on your machine, I have an XPS15 (i7-6700HQ CPU @ 2.60GHz) and compiling with 8 threads (the -j8 option) took me 4 minutes:

      $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
      ...
      $ time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 zImage modules dtbs
      ...
      real 3m6.684s
      user 19m0.466s
      sys 1m35.912s

      Reply to this comment

      Reply to this comment


Add a Comment






Allowed tags: <b><i><br>Add a new comment:


Search the newsroom

Latest Blog Posts

Virglrenderer and the state of virtualized virtual worlds

28/08/2019

With the release of virglrenderer 0.8.0, getting accelerated OpenGL within a virtual machine (VM) made a big leap forward. Since virglrenderer-0.7.0,…

ROCK Pi and an easy place: Panfrost & Wayland on a Rockchip board

06/08/2019

Ongoing work on the reverse-engineered Panfrost OpenGL ES driver for Arm Mali GPUs has turned the RK3399 SoC into a very attractive platform…

What's new in OpenXR 1.0 & Monado?

02/08/2019

As part of its unwavering commitment to open source and open standards, Collabora is proud to be part of bringing the recently-released…

Zink: Summer Update & SIGGRAPH 2019

25/07/2019

There's been quite a few updates to Zink, an OpenGL implementation on top of Vulkan, since I last wrote about it. Here's an overview of…

GStreamer in Oslo

18/07/2019

A little over a month and a half ago, Collaborans including Aaron Boxer, George Kiagiadakis, Guillaume Desmottes, Stéphane Cerveau and myself…

GNOME meets Panfrost

26/06/2019

In my last Panfrost blog post, I announced my internship goal: improve Panfrost to run GNOME3. GNOME is a popular Linux desktop making heavy…

Open Since 2005 logo

We use cookies on this website to ensure that you get the best experience. By continuing to use this website you are consenting to the use of these cookies. To find out more please follow this link.

Collabora Ltd © 2005-2019. All rights reserved. Website sitemap.