diff --git a/README.adoc b/README.adoc index 871943e..f7320a3 100644 --- a/README.adoc +++ b/README.adoc @@ -1,5 +1,5 @@ = Linux Kernel Module Cheat -:description: The perfect emulation setup to study and develop the <> v5.2.1, kernel modules, <>, <> and x86_64, ARMv7 and ARMv8 <> and <> assembly, <>, <> and <>. <> and <> just work. Powered by <> and <>. Highly automated. Thoroughly documented. Automated <>. "Tested" in an Ubuntu 18.04 host. +:description: The perfect emulation setup to study and develop the <> v5.2.1, kernel modules, <>, <> and x86_64, ARMv7 and ARMv8 <> and <> assembly, <>, <> and <>. <> and <> just work. Powered by <> and <>. Highly automated. Thoroughly documented. Automated <>. "Tested" in an Ubuntu 18.04 host. :idprefix: :idseparator: - :nofooter: @@ -1254,7 +1254,7 @@ For example, to run link:baremetal/arch/aarch64/dump_regs.c[] in QEMU do: And the terminal prints the values of certain system registers. This example prints registers that are only accessible from <> or higher, and thus could not be run in userland. -In addition to the examples under link:baremetal/[], several of the <> can also be run in baremetal! This is largely due to the <>. +In addition to the examples under link:baremetal/[], several of the <> can also be run in baremetal! This is largely due to the <>. The examples that work include most <> that don't rely on complicated syscalls such as threads, and almost all the <> examples. @@ -3765,7 +3765,7 @@ or: .... ./run \ --arch aarch64 \ - --userland "$(./getvar --arch aarch64 buildroot_target_dir)/bin/sh" \ + --userland "$(./getvar --arch aarch64 buildroot_target_dir)/bin/sh" \ --userland-args='-c "uname -a && pwd"' \ ; .... @@ -4041,7 +4041,7 @@ Since gem5 has to implement syscalls itself in syscall emulation mode, it can of ./run \ --emulator gem5 \ --static userland/arch/x86_64/freestanding/linux/hello.S \ - --userland \ + --userland \ --trace-stdout \ --trace ExecAll,SyscallBase,SyscallVerbose \ ; @@ -5996,7 +5996,7 @@ depends: dep We can double check with: .... -strings 3 dep2.ko | grep -E 'depends' +strings 3 dep2.ko | grep -E 'depends' .... The output contains: @@ -6729,7 +6729,7 @@ Where the data comes from and how to modify it: In this repo, leaking host information, and to make builds more reproducible, we are setting: - user and date to dummy values with `KBUILD_BUILD_USER` and `KBUILD_BUILD_TIMESTAMP` -- hostname to the kernel git commit with `KBUILD_BUILD_HOST` and `KBUILD_BUILD_VERSION` +- hostname to the kernel git commit with `KBUILD_BUILD_HOST` and `KBUILD_BUILD_VERSION` A sample result is: @@ -9641,7 +9641,7 @@ Buildroot's Linux tools package provides some GPIO CLI tools: `lsgpio`, `gpio-ev ==== LEDs -TODO: broken when `arm` moved to `-M virt`, same as <>. +TODO: broken when `arm` moved to `-M virt`, same as <>. Hack QEMU's `hw/misc/arm_sysctl.c` with a printf: @@ -10714,7 +10714,7 @@ ps Haux | grep qemu | wc Remember <> though. -At 369a47fc6e5c2f4a7f911c1c058b6088f8824463 + 1 QEMU appears to spawn 3 host threads plus one for every new guest thread created. Remember that link:userland/posix/pthread_count.c[] spawns N + 1 total threads if you count the `main` thread. +At 369a47fc6e5c2f4a7f911c1c058b6088f8824463 + 1 QEMU appears to spawn 3 host threads plus one for every new guest thread created. Remember that link:userland/posix/pthread_count.c[] spawns N + 1 total threads if you count the `main` thread. ====== gem5 syscall emulation multithreading @@ -11122,7 +11122,7 @@ gnuplot \ xdg-open bst_vs_heap_vs_hashmap.tmp.png .... -The parameters `heap_zoom_max` and `hashmap_zoom_max` are chosen manually interactively to best showcase the regions of interest in those plots. +The parameters `heap_zoom_max` and `hashmap_zoom_max` are chosen manually interactively to best showcase the regions of interest in those plots. To benchmark on gem5, we first build the benchmark with <> enabled, and then we run it and extract the stats: @@ -12219,7 +12219,7 @@ The `--gem5-script biglittle` option enables the alternative `configs/example/ar Advantages over `fs.py`: -* more representative of mobile ARM SoCs, which almost always have big little cluster +* more representative of mobile ARM SoCs, which almost always have big little cluster * simpler than `fs.py`, and therefore easier to understand and modify Disadvantages over `fs.py`: @@ -15537,7 +15537,7 @@ It competes with <> because its implementations are desig ARM is generally considered a RISC instruction set, although there are some more complex instructions which would not generally be classified as purely RISC. -ARM is developed by the British funded company ARM Holdings: https://en.wikipedia.org/wiki/Arm_Holdings which originated as a joint venture between Acorn Computers, Apple and VLSI Technology in 1990. +ARM is developed by the British funded company ARM Holdings: https://en.wikipedia.org/wiki/Arm_Holdings which originated as a joint venture between Acorn Computers, Apple and VLSI Technology in 1990. ARM Holdings was bought by the Japanese giant SoftBank in 2016. @@ -17335,8 +17335,6 @@ IN: main which does an `eret` and jumps back to 0x4000209c, which is 4 bytes and therefore one instruction after where SVC was taken at 0x40002098. -In QEMU, and then we just continue running from the exception handler address. - On the terminal output, we observe the initial values of: * DAIF: 0x3c0, i.e. 4 bits (6 to 9) set to 1, which means that exceptions are masked for each exception type: Synchronous, System error, IRQ and FIQ. @@ -17607,7 +17605,7 @@ TODO: create and study a minimal examples in gem5 where the DMB instruction lead ==== ARM timer -The ARM timer is the simplest way to generate hardware interrupts periodically, and therefore serves as the simples example of <> usage. +The ARM timer is the simplest way to generate hardware interrupts periodically, and therefore serves as the simples example of <> usage. Working on QEMU: link:baremetal/arch/aarch64/timer.c[] @@ -19448,7 +19446,7 @@ git clone https://my.private.repo.com/my-fork/gem5.git gem5-internal gem5_internal="$(pwd)/gem5-internal" .... -Next, when you want to build with the private repository, use the `--gem5-build-dir` and `--gem5-source-dir` argument to override our default gem5 source and build locations: +Next, when you want to build with the private repository, use the `--gem5-build-dir` and `--gem5-source-dir` argument to override our default gem5 source and build locations: .... cd linux-kernel-module-cheat @@ -20094,7 +20092,7 @@ Go through all the other <> sections in order. Once everything looks fine, publish the release with: .... -git tag -a v3.0 +git tag -a v3.0 # Describe the release int the tag message. git push --follow-tags ./release-zip --all-archs