From b13595273eb63bb9e3f564e5947b86880517dd64 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sat, 24 Mar 2018 22:42:20 +0000 Subject: [PATCH] run: make text mode (-n) the default Rename the opposite graphics mode to -x. --- README.adoc | 50 +++++++++++++++++++++++++++++++------------------- run | 28 ++++++++++++++-------------- run-usage.adoc | 7 ++++--- 3 files changed, 49 insertions(+), 36 deletions(-) diff --git a/README.adoc b/README.adoc index e67d5f5..71f6e96 100644 --- a/README.adoc +++ b/README.adoc @@ -205,23 +205,36 @@ The superior alternative is to use text mode or a telnet connection. === Text mode -Show serial console directly on the current terminal, without opening a QEMU window: +By default, we show the serial console directly on the current terminal, without opening a QEMU window. + +To enable graphic mode, use: .... -./run -n +./run -x .... -To quit QEMU forcefully, just use Ctrl + C as usual. +Text mode is the default due to the following considerable advantages: -This mode is very useful to: - -* get full panic traces when you start making the kernel crash :-) See also: https://unix.stackexchange.com/questions/208260/how-to-scroll-up-after-a-kernel-panic * copy and paste commands and stdout output to / from host -* have a large scroll buffer, and be able to search it, e.g. by using GNU `screen` on host +* get full panic traces when you start making the kernel crash :-) See also: https://unix.stackexchange.com/questions/208260/how-to-scroll-up-after-a-kernel-panic +* have a large scroll buffer, and be able to search it, e.g. by using tmux on host +* one less window floating around to think about in addition to your shell :-) +* graphics mode has only been properly tested on `x86_64`. -Limitations: +Text mode has the following limitations over graphics mode: -* TODO: Ctrl + C kills the emulator, and not sent to guest processes. See: +* you can't see graphics such as those produced by <> +* Very early kernel messages such as `early console in extract_kernel` only show on the GUI, since at such early stages, not even the serial has been setup. + +Both good and bad: + +* Ctrl + C kills the host emulator instead of sending SIGINT to the guest process. ++ +On one hand, this provides an easy way to quit QEMU. ++ +On the other, we are unable to easily kill the foreground process, which is specially problematic when it is something like an infinite loop. and not sent to guest processes. ++ +TODO: understand why and how to change that. See: + -- ** https://unix.stackexchange.com/questions/167165/how-to-pass-ctrl-c-in-qemu @@ -244,7 +257,6 @@ Our workaround is: I think the problem was reversed in older QEMU versions: https://superuser.com/questions/1087859/how-to-quit-the-qemu-monitor-when-not-using-a-gui/1211516#1211516 + This is however fortunate when running QEMU with GDB, as the Ctrl + C reaches GDB and breaks. -* Very early kernel messages such as `early console in extract_kernel` only show on the GUI, since at such early stages, not even the serial has been setup. === Automatic startup commands @@ -465,7 +477,7 @@ When you hit `Ctrl + C`, if we happen to be inside kernel code at that point, wh tmux just makes things even more fun by allowing us to see both terminals at once without dragging windows around! https://unix.stackexchange.com/questions/152738/how-to-split-a-new-window-and-run-a-command-in-this-new-window-using-tmux/432111#432111 .... -./tmu ./rungdb && ./run -dn +./tmu ./rungdb && ./run -d .... === GDB step debug kernel module @@ -1009,13 +1021,13 @@ To have more control over the system, you can replace BusyBox's init with your o The following method replaces init and evals a command from the <>: .... -./run -E 'echo "asdf qwer";insmod /hello.ko;/poweroff.out' -n +./run -E 'echo "asdf qwer";insmod /hello.ko;/poweroff.out' .... It is basically a shortcut for: .... -./run -e 'init=/eval.sh - lkmc_eval="insmod /hello.ko;/poweroff.out"' -n +./run -e 'init=/eval.sh - lkmc_eval="insmod /hello.ko;/poweroff.out"' .... although `-E` is smarter: @@ -1032,7 +1044,7 @@ echo ' insmod /hello.ko /poweroff.out ' > gitignore.sh -./run -E "$(cat gitignore.sh)" -n +./run -E "$(cat gitignore.sh)" .... or add it to a file to the root filesystem guest and rebuild: @@ -1044,7 +1056,7 @@ insmod /hello.ko ' > rootfs_overlay/gitignore.sh chmod +x rootfs_overlay/gitignore.sh ./build -./run -e 'init=/gitignore.sh' -n +./run -e 'init=/gitignore.sh' .... Remember that if your init returns, the kernel will panic, there are just two non-panic possibilities: @@ -1115,7 +1127,7 @@ ____ And you can try it out with: .... -./run -e 'init=/init_env_poweroff.sh - asdf=qwer zxcv' -n +./run -e 'init=/init_env_poweroff.sh - asdf=qwer zxcv' .... Also note how the annoying dash `-` also gets passed as a parameter to `init`, which makes it impossible to use this method for most executables. @@ -1123,7 +1135,7 @@ Also note how the annoying dash `-` also gets passed as a parameter to `init`, w Finally, the docs are lying, arguments with dots that come after `-` are still treated specially (of the form `subsystem.somevalue`) and disappear: .... -./run -e 'init=/init_env_poweroff.sh - /poweroff.out' -n +./run -e 'init=/init_env_poweroff.sh - /poweroff.out' .... === Disable networking @@ -1170,10 +1182,10 @@ Build: .... ./build -b br2_x11 -./run +./run -x .... -We don't build X11 by default because it takes a considerable amount of time (~20%), and is not expected to be used by most users: you need to pass the `-x` flag to enable it. +We don't build X11 by default because it takes a considerable amount of time (about 20%), and is not expected to be used by most users: you need to pass the `-x` flag to enable it. Inside QEMU: diff --git a/run b/run index 20e8ea1..770cf86 100755 --- a/run +++ b/run @@ -23,9 +23,9 @@ lkmc_eval='' initrd=false initramfs=false memory=256M -nographic=false +nographic=true root='' -while getopts a:c:DdE:e:f:G:gIiKkm:nt:x OPT; do +while getopts a:c:DdE:e:f:G:ghIiKkm:x OPT; do case "$OPT" in a) arch="$OPTARG" @@ -49,16 +49,6 @@ while getopts a:c:DdE:e:f:G:gIiKkm:nt:x OPT; do f) extra_append_after_dash="$extra_append_after_dash $OPTARG" ;; - K) - kvm=true - ;; - k) - extra_append="$extra_append kgdbwait" - # For those who want to try KDB. - #extra_append="$extra_append kgdbwait kgdboc=kbd" - extra_flags_qemu="$extra_flags_qemu -serial tcp::1234,server,nowait" - kgdb=true - ;; G) gem5opts="$OPTARG" ;; @@ -75,11 +65,21 @@ while getopts a:c:DdE:e:f:G:gIiKkm:nt:x OPT; do i) initrd=true ;; + K) + kvm=true + ;; + k) + extra_append="$extra_append kgdbwait" + # For those who want to try KDB. + #extra_append="$extra_append kgdbwait kgdboc=kbd" + extra_flags_qemu="$extra_flags_qemu -serial tcp::1234,server,nowait" + kgdb=true + ;; m) memory="$OPTARG" ;; - n) - nographic=true + x) + nographic=false ;; esac done diff --git a/run-usage.adoc b/run-usage.adoc index 4d86b65..04d9cb4 100644 --- a/run-usage.adoc +++ b/run-usage.adoc @@ -25,15 +25,16 @@ most of which are prefixed by `lkmc_`, e.g.: `./run -f 'lkmc_eval="wget google.com" lkmc_nonet=y'` Mnenomic: comes after `-e`. -|`-K` | | Use KVM. Only works if guest arch == host arch. -|`-k` | | Enable KGDB. |`-G` | | Pass extra options to the gem5 executable. Only useful if `-g` is given. Do not confuse with the arguments passed to the config scripts, e.g. `fs.py` +|`-g` | | Use gem5 instead of QEMU. |`-h` | | Show this help message. |`-I` | | Run with initramfs. |`-i` | | Run with initrd. +|`-K` | | Use KVM. Only works if guest arch == host arch. +|`-k` | | Enable KGDB. |`-m` | | Set the memory size of the guest. E.g.: `-m 512M`. Default: `256M`. -|`-n` | | Run in nographic mode. +|`-x` | | Run in graphic mode. Mnemonic: X11. |===