# Linux Kernel Module Cheat

#### 2.6.2. Prebuilt setup getting started

Checkout to the latest tag and use the Ubuntu packaged QEMU to boot Linux:

    sudo apt-get install qemu-system-x86
    git clone https://github.com/cirosantilli/linux-kernel-module-cheat
    cd linux-kernel-module-cheat
    git checkout "$(git rev-list --tags --max-count=1)"
    ./release-download-latest
    unzip lkmc-*.zip
    ./run --qemu-which host

You have to checkout to the latest tag to ensure that the scripts match the release format: https://stackoverflow.com/questions/1404796/how-to-get-the-latest-tag-name-in-current-branch-in-git

This is known not to work for aarch64 on an Ubuntu 16.04 host with QEMU 2.5.0, presumably because QEMU is too old, the terminal does not show any output. I haven’t investigated why.

Or to run a baremetal example instead:

    ./run \
      --arch aarch64 \
      --baremetal userland/c/hello.c \
      --qemu-which host \
    ;

Be saner and use our custom built QEMU instead:

    ./setup
    ./build --download-dependencies qemu
    ./run

To build the kernel modules as in Your first kernel module hack do:

    git submodule update --depth 1 --init --recursive "$(./getvar linux_source_dir)"
    ./build-linux --no-modules-install -- modules_prepare
    ./build-modules --gcc-which host
    ./run

TODO: for now the only way to test those modules out without building Buildroot is with 9p, since we currently rely on Buildroot to manipulate the root filesystem.

Command explanation:

- `modules_prepare` does the minimal build procedure required on the kernel for us to be able to compile the kernel modules, and is way faster than doing a full kernel build. A full kernel build would also work however.

- `--gcc-which host` selects your host Ubuntu packaged GCC, since you don’t have the Buildroot toolchain

- `--no-modules-install` is required otherwise the `make modules_install` target we run by default fails, since the kernel wasn’t built

To modify the Linux kernel, build and use it as usual:

    git submodule update --depth 1 --init --recursive "$(./getvar linux_source_dir)"
    ./build-linux
    ./run