Ciro Santilli 750bf431e8 readme ++
2017-05-20 11:52:21 +01:00
bak
2017-05-09 19:59:56 +01:00
2017-05-15 09:08:16 +01:00
0
2016-07-30 09:38:06 +01:00
bak
2017-05-09 19:59:56 +01:00
2017-05-16 07:57:02 +01:00
2016-12-15 22:53:13 +00:00
0
2016-07-30 09:38:06 +01:00
0
2016-07-30 09:38:06 +01:00
2017-05-20 11:52:21 +01:00
2017-05-20 11:17:37 +01:00
2017-05-20 11:17:37 +01:00
2017-05-20 11:17:37 +01:00

Linux Kernel Module Cheat

Run one command, get into QEMU Buildroot BusyBox with several minimal Linux kernel 4.9 module example tutorials. Tested in Ubuntu 14.04 - 16.10 hosts.

Usage:

sudo apt-get install qemu
./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

This should print to the screen:

hello init
hello2 init
hello cleanup
hello2 cleanup

which are printk messages from init and cleanup methods of those modules.

Each module comes from a C file under kernel_module/. For module usage do:

head *. use Buildroot's default kernel version, you can confirm it after build with:

grep BR2_LINUX_KERNEL_VERSION buildroot/.config

After the first build, you can also run just:

./runqemu

to save a few seconds. ./run wouldn't rebuild everything, but checking timestamps takes a few moments.

We use printk a lot, and it shows on the QEMU terminal by default. If that annoys you (e.g. you want to see stdout separately), do:

dmesg -n 1

See also: https://superuser.com/questions/351387/how-to-stop-kernel-messages-from-flooding-my-console

Debugging

To GDB the Linux kernel, first run:

./runqemu -d

If you want to break immediately at a symbol, e.g. start_kernel of the boot sequence, open another terminal and run:

./rungdb start_kernel

Now QEMU will stop there, and you can use the normal GDB commands:

l
n
c

To skip the boot, run just:

./rungdb

and when you want to break, do Ctrl + C from GDB.

To have some fun, you can first run inside QEMU:

/count.sh

which counts to infinity to stdout, and then:

Ctrl + C
break sys_write

And now you can control the counting from GDB:

continue
continue
continue

See also: http://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu

Text mode

Show serial output of QEMU directly on the current terminal, without opening a QEMU window:

./run -n

To exit, just do a regular:

poweroff

This is particularly useful to get full panic traces when you start making the kernel crashing :-)

In case of a panic, you want your terminal back with Ctrl + C, A and type quit. See also: http://stackoverflow.com/questions/14165158/how-to-switch-to-qemu-monitor-console-when-running-with-curses

See also: https://unix.stackexchange.com/questions/208260/how-to-scroll-up-after-a-kernel-panic

Table of contents

  1. Introduction
  2. Build
  3. kmod
  4. Bibliography
  5. Examples
    1. Host
    2. Buildroot
      1. Debugging
        1. hello
        2. hello2
        3. debugfs
        4. panic
      2. fops
      3. Asynchronous
        1. workqueue
        2. sleep
        3. kthread
        4. timer
        5. work_from_work
Description
No description provided
Readme 202 MiB
Languages
Python 37.3%
C 33.8%
Assembly 13.6%
C++ 8.6%
Shell 3.7%
Other 2.8%