From e06171b48398a637c52ff48c7ecd24ceb2f7d5c8 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Thu, 11 May 2017 07:28:35 +0100 Subject: [PATCH] Buildroot QEMU works. Nuff said. --- README.md | 25 ++++++++++++++++++- kernel_module/Config.in | 1 + kernel_module/external.desc | 1 + kernel_module/external.mk | 1 + kernel_module/package/kernel_module/Config.in | 5 ++++ .../package/kernel_module/kernel_module.mk | 20 +++++++++++++++ .../package/kernel_module/src/Makefile | 10 ++++++++ .../package/kernel_module/src/hello.c | 17 +++++++++++++ .../package/kernel_module/src/hello2.c | 19 ++++++++++++++ run | 10 +++----- 10 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 kernel_module/Config.in create mode 100644 kernel_module/external.desc create mode 100644 kernel_module/external.mk create mode 100644 kernel_module/package/kernel_module/Config.in create mode 100644 kernel_module/package/kernel_module/kernel_module.mk create mode 100644 kernel_module/package/kernel_module/src/Makefile create mode 100644 kernel_module/package/kernel_module/src/hello.c create mode 100644 kernel_module/package/kernel_module/src/hello2.c diff --git a/README.md b/README.md index 7d3974c..fdbcdfd 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,32 @@ # Linux Kernel Module Cheat +Run one command, get into QEMU Buildroot BusyBox with several minimal Linux kernel module examples. Tested in Ubuntu 14.04. + +Usage: + + ./run + +First build will take a while (GCC, Linux kernel). + +QEMU opens up, and you can run: + + root + insmod /hello.ko + insmod /hello2.ko + rmmod hello + rmmod hello2 + +Each module comes from a C file under `kernel_module/package/kernel_module/src/`. + +The Linux kernel version can be found with: + + grep BR2_LINUX_KERNEL_VERSION buildroot/.config + 1. [Introduction](introduction.md) 1. [Build](build.md) 1. [kmod](kmod.md) 1. Examples 1. [Host](host/) 1. Buildroot - 1. [hello](hello.c) + 1. [hello](kernel_module/package/kernel_module/src/hello.c) + 1. [hello2](kernel_module/package/kernel_module/src/hello2.c) diff --git a/kernel_module/Config.in b/kernel_module/Config.in new file mode 100644 index 0000000..83e3f89 --- /dev/null +++ b/kernel_module/Config.in @@ -0,0 +1 @@ +source "$BR2_EXTERNAL_KERNEL_MODULE_PATH/package/kernel_module/Config.in" diff --git a/kernel_module/external.desc b/kernel_module/external.desc new file mode 100644 index 0000000..74da067 --- /dev/null +++ b/kernel_module/external.desc @@ -0,0 +1 @@ +name: KERNEL_MODULE diff --git a/kernel_module/external.mk b/kernel_module/external.mk new file mode 100644 index 0000000..3841755 --- /dev/null +++ b/kernel_module/external.mk @@ -0,0 +1 @@ +include $(sort $(wildcard $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/*/*.mk)) diff --git a/kernel_module/package/kernel_module/Config.in b/kernel_module/package/kernel_module/Config.in new file mode 100644 index 0000000..825e370 --- /dev/null +++ b/kernel_module/package/kernel_module/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_KERNEL_MODULE + bool "kernel_module" + depends on BR2_LINUX_KERNEL + help + Linux Kernel Module Cheat. diff --git a/kernel_module/package/kernel_module/kernel_module.mk b/kernel_module/package/kernel_module/kernel_module.mk new file mode 100644 index 0000000..def28d0 --- /dev/null +++ b/kernel_module/package/kernel_module/kernel_module.mk @@ -0,0 +1,20 @@ +################################################################################ +# +# kernel_module +# +################################################################################ + +KERNEL_MODULE_VERSION = 1.0 +KERNEL_MODULE_SITE = $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/kernel_module/src +KERNEL_MODULE_SITE_METHOD = local + +define KERNEL_MODULE_BUILD_CMDS + $(MAKE) -C '$(@D)' LINUX_DIR='$(LINUX_DIR)' PWD='$(@D)' CC='$(TARGET_CC)' LD='$(TARGET_LD)' +endef + +define KERNEL_MODULE_INSTALL_TARGET_CMDS + $(INSTALL) -D -m 0755 $(@D)/*.ko '$(TARGET_DIR)' +endef + +$(eval $(kernel-module)) +$(eval $(generic-package)) diff --git a/kernel_module/package/kernel_module/src/Makefile b/kernel_module/package/kernel_module/src/Makefile new file mode 100644 index 0000000..bb100a3 --- /dev/null +++ b/kernel_module/package/kernel_module/src/Makefile @@ -0,0 +1,10 @@ +obj-m += hello.o hello2.o +ccflags-y := -Wno-declaration-after-statement -std=gnu99 + +.PHONY: all clean + +all: + $(MAKE) -C '$(LINUX_DIR)' M='$(PWD)' modules + +clean: + $(MAKE) -C '$(LINUX_DIR)' M='$(PWD)' clean diff --git a/kernel_module/package/kernel_module/src/hello.c b/kernel_module/package/kernel_module/src/hello.c new file mode 100644 index 0000000..e82e153 --- /dev/null +++ b/kernel_module/package/kernel_module/src/hello.c @@ -0,0 +1,17 @@ +/* +Hello world module. +*/ + +#include +#include + +int init_module(void) +{ + printk(KERN_INFO "hello init\n"); + return 0; +} + +void cleanup_module(void) +{ + printk(KERN_INFO "hello cleanup\n"); +} diff --git a/kernel_module/package/kernel_module/src/hello2.c b/kernel_module/package/kernel_module/src/hello2.c new file mode 100644 index 0000000..cbdd63b --- /dev/null +++ b/kernel_module/package/kernel_module/src/hello2.c @@ -0,0 +1,19 @@ +/* +Hello world module 2. + +Mostly to check that our build infrastructure can handle more than one module! +*/ + +#include +#include + +int init_module(void) +{ + printk(KERN_INFO "hello2 init\n"); + return 0; +} + +void cleanup_module(void) +{ + printk(KERN_INFO "hello2 cleanup\n"); +} diff --git a/run b/run index c492369..7399b03 100755 --- a/run +++ b/run @@ -1,10 +1,8 @@ #!/usr/bin/env bash set -e cd buildroot -make BR2_EXTERNAL="$(pwd)/.." qemu_x86_64_defconfig -echo ' -BR2_TOOLCHAIN_EXTERNAL=y -BR2_PACKAGE_KERNEL_MODULE=y -' >> .config -make BR2_JLEVEL="$(($(nproc) - 2))" +make BR2_EXTERNAL="$(pwd)/../kernel_module" qemu_x86_64_defconfig +echo 'BR2_PACKAGE_KERNEL_MODULE=y' >> .config +# kernel_module-reconfigure rebuilds the modules if they were modified. +env -u LD_LIBRARY_PATH make BR2_JLEVEL="$(($(nproc) - 2))" kernel_module-reconfigure all qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user