mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 02:05:57 +01:00
userland: make --host awesome
This commit is contained in:
71
README.adoc
71
README.adoc
@@ -1995,7 +1995,7 @@ And you are back in KDB. Now you can:
|
|||||||
|
|
||||||
And you will break whenever `__x64_sys_write` is hit.
|
And you will break whenever `__x64_sys_write` is hit.
|
||||||
|
|
||||||
TODO: `bp __x64_sys_write` is failing with `illegal numeric value` as of 10dd9178c6dccf1964002cc9368a5aa83b345487. I think it worked before.
|
TODO: `bp __x64_sys_write` is failing with `illegal numeric value` as of 10dd9178c6dccf1964002cc9368a5aa83b345487. I think it worked before, so needs bisection.
|
||||||
|
|
||||||
The other KDB commands allow you to instruction steps, view memory, registers and some higher level kernel runtime data.
|
The other KDB commands allow you to instruction steps, view memory, registers and some higher level kernel runtime data.
|
||||||
|
|
||||||
@@ -7703,7 +7703,9 @@ QEMU user mode completely bypasses the kernel that we've built: all it takes is
|
|||||||
|
|
||||||
This runs link:userland/print_argv.c[]. `--userland` path resolution is analogous to <<baremetal-setup-getting-started,that of `--baremetal`>>.
|
This runs link:userland/print_argv.c[]. `--userland` path resolution is analogous to <<baremetal-setup-getting-started,that of `--baremetal`>>.
|
||||||
|
|
||||||
QEMU user mode also supports dynamically linked executables.
|
`./build-userland` is further documented at: <<userland-directory>>.
|
||||||
|
|
||||||
|
As we've just seen, QEMU user mode supports dynamically linked executables.
|
||||||
|
|
||||||
This requires point it to the root filesystem with the `-L` option so that it can find the dynamic linker and shared libraries.
|
This requires point it to the root filesystem with the `-L` option so that it can find the dynamic linker and shared libraries.
|
||||||
|
|
||||||
@@ -11034,13 +11036,6 @@ They contain data structs and magic constant for kernel to userland communicatio
|
|||||||
|
|
||||||
Userland test programs.
|
Userland test programs.
|
||||||
|
|
||||||
It is possible to build and run those examples directly on your host:
|
|
||||||
|
|
||||||
....
|
|
||||||
cd userland
|
|
||||||
make
|
|
||||||
....
|
|
||||||
|
|
||||||
For usage in the guest, build with:
|
For usage in the guest, build with:
|
||||||
|
|
||||||
....
|
....
|
||||||
@@ -11057,12 +11052,48 @@ In order to place them in the root filesystem image itself, you must also run:
|
|||||||
./build-buildroot
|
./build-buildroot
|
||||||
....
|
....
|
||||||
|
|
||||||
To force rebuild all examples, pass the `-B` option to `make`:
|
It is possible to build and run those examples directly on your host:
|
||||||
|
|
||||||
....
|
....
|
||||||
./build-buildroot --make-args=-B
|
cd userland
|
||||||
|
make
|
||||||
|
./hello.out
|
||||||
|
make clean
|
||||||
....
|
....
|
||||||
|
|
||||||
|
or more cleanly out of tree:
|
||||||
|
|
||||||
|
....
|
||||||
|
./build-userland --host --userland-build-id host
|
||||||
|
$(./getvar --userland-build-id host userland_build_dir)/hello.out
|
||||||
|
....
|
||||||
|
|
||||||
|
Extra make flags may be passed as:
|
||||||
|
|
||||||
|
....
|
||||||
|
./build-userland --host --userland-build-id host-static --make-args="-B CFLAGS_EXTRA=-static"
|
||||||
|
$(./getvar --userland-build-id host-static userland_build_dir)/hello.out
|
||||||
|
....
|
||||||
|
|
||||||
|
This for example would both force a rebuild due to `-B` and link statically due to `CFLAGS_EXTRA=-static`.
|
||||||
|
|
||||||
|
TODO: OpenMP does not like `-static`:
|
||||||
|
|
||||||
|
....
|
||||||
|
/usr/lib/gcc/x86_64-linux-gnu/5/libgomp.a(target.o): In function `gomp_target_init':
|
||||||
|
(.text+0xba): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
|
||||||
|
....
|
||||||
|
|
||||||
|
See: https://stackoverflow.com/questions/23869981/linking-openmp-statically-with-gcc
|
||||||
|
|
||||||
|
It is also possible to build other architectures with the host toolchain for other archs than your host arch:
|
||||||
|
|
||||||
|
....
|
||||||
|
./build-userland --arch arm --host --userland-build-id host
|
||||||
|
....
|
||||||
|
|
||||||
|
You won't be able to run those executables directly, but this is interesting if you are playing around with <<qemu-user-mode>>.
|
||||||
|
|
||||||
==== packages directory
|
==== packages directory
|
||||||
|
|
||||||
Every directory inside it is a Buildroot package.
|
Every directory inside it is a Buildroot package.
|
||||||
@@ -11109,18 +11140,26 @@ These are typically patches that don't contain fundamental functionality, so we
|
|||||||
|
|
||||||
==== rootfs_overlay
|
==== rootfs_overlay
|
||||||
|
|
||||||
Copied into the target filesystem.
|
We use this directory for:
|
||||||
|
|
||||||
We use it for:
|
|
||||||
|
|
||||||
* customized configuration files
|
* customized configuration files
|
||||||
* userland module test scripts that don't need to be compiled.
|
* userland module test scripts that don't need to be compiled.
|
||||||
+
|
+
|
||||||
C files for example need compilation, and must go through the regular package system, e.g. through link:kernel_modules/user[].
|
C files for example need compilation, and must go through the regular package system, e.g. through link:kernel_modules/user[].
|
||||||
|
|
||||||
This directory gets <<9p>> mounted on the guest at: `/mnt/9p/rootfs_overlay`
|
This directory is copied into the target filesystem by link:copy-overlay[], which then it visible via <<9p>> on the guest at:
|
||||||
|
|
||||||
Furthermore, link:copy-overlay[] copies it to our generated overlay, which appears on the guest at `/mnt/9p/out_rootfs_overlay`.
|
....
|
||||||
|
ls /mnt/9p/out_rootfs_overlay
|
||||||
|
....
|
||||||
|
|
||||||
|
Furthermore, since this directory does not require compilation, we also make it <<9p>> available to the guest directly even without `copy-overlay` at:
|
||||||
|
|
||||||
|
....
|
||||||
|
ls /mnt/9p/rootfs_overlay
|
||||||
|
....
|
||||||
|
|
||||||
|
This way you can just hack away the scripts and try them out immediately without any further operations.
|
||||||
|
|
||||||
=== Test this repo
|
=== Test this repo
|
||||||
|
|
||||||
|
|||||||
1
baremetal/README.adoc
Normal file
1
baremetal/README.adoc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
https://github.com/cirosantilli/linux-kernel-module-cheat#baremetal-setup
|
||||||
@@ -19,7 +19,10 @@ class ModulesComponent(common.Component):
|
|||||||
'--host',
|
'--host',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
default=False,
|
default=False,
|
||||||
help='Build the Linux kernel modules for the host instead of guest',
|
help='''\
|
||||||
|
Build the Linux kernel modules for the host instead of guest.
|
||||||
|
Use the host packaged cross toolchain.
|
||||||
|
''',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'kernel_modules',
|
'kernel_modules',
|
||||||
|
|||||||
@@ -17,6 +17,15 @@ class UserlandComponent(common.Component):
|
|||||||
help='''\
|
help='''\
|
||||||
Indicate that a given package is present in the root filesystem, which
|
Indicate that a given package is present in the root filesystem, which
|
||||||
allows us to build examples that rely on it.
|
allows us to build examples that rely on it.
|
||||||
|
''',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--host',
|
||||||
|
action='store_true',
|
||||||
|
default=False,
|
||||||
|
help='''\
|
||||||
|
Build the userland programs for the host instead of guest.
|
||||||
|
Use the host packaged cross toolchain.
|
||||||
''',
|
''',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -38,7 +47,10 @@ has the OpenBLAS libraries and headers installed.
|
|||||||
def do_build(self, args):
|
def do_build(self, args):
|
||||||
build_dir = self.get_build_dir(args)
|
build_dir = self.get_build_dir(args)
|
||||||
os.makedirs(build_dir, exist_ok=True)
|
os.makedirs(build_dir, exist_ok=True)
|
||||||
allowed_toolchains = ['buildroot']
|
if args.host:
|
||||||
|
allowed_toolchains = ['host']
|
||||||
|
else:
|
||||||
|
allowed_toolchains = ['buildroot']
|
||||||
cc = common.get_toolchain_tool('gcc', allowed_toolchains=allowed_toolchains)
|
cc = common.get_toolchain_tool('gcc', allowed_toolchains=allowed_toolchains)
|
||||||
cxx = common.get_toolchain_tool('g++', allowed_toolchains=allowed_toolchains)
|
cxx = common.get_toolchain_tool('g++', allowed_toolchains=allowed_toolchains)
|
||||||
common.run_cmd(
|
common.run_cmd(
|
||||||
|
|||||||
13
common.py
13
common.py
@@ -264,7 +264,9 @@ See the documentation for other values known to work.
|
|||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-M', '--gem5-build-id',
|
'-M', '--gem5-build-id',
|
||||||
help='gem5 build ID. Allows you to keep multiple separate gem5 builds. Default: %(default)s'.format(default_build_id)
|
help='''\
|
||||||
|
gem5 build ID. Allows you to keep multiple separate gem5 builds. Default: {}
|
||||||
|
'''.format(default_build_id)
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-N', '--gem5-worktree',
|
'-N', '--gem5-worktree',
|
||||||
@@ -298,7 +300,7 @@ Default: %(default)s
|
|||||||
help='''\
|
help='''\
|
||||||
Use prebuilt packaged host utilities as much as possible instead
|
Use prebuilt packaged host utilities as much as possible instead
|
||||||
of the ones we built ourselves. Saves build time, but decreases
|
of the ones we built ourselves. Saves build time, but decreases
|
||||||
the likelihood of compatibility.
|
the likelihood of incompatibilities.
|
||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -318,7 +320,7 @@ Default: the run ID (-n) if that is an integer, otherwise 0.
|
|||||||
help='gem5 build type, most often used for "debug" builds. Default: %(default)s'
|
help='gem5 build type, most often used for "debug" builds. Default: %(default)s'
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--userland-build-id', default=default_build_id
|
'--userland-build-id', default=None
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-v', '--verbose', default=False, action='store_true',
|
'-v', '--verbose', default=False, action='store_true',
|
||||||
@@ -666,6 +668,11 @@ def setup(parser):
|
|||||||
gem5_build_id_given = False
|
gem5_build_id_given = False
|
||||||
else:
|
else:
|
||||||
gem5_build_id_given = True
|
gem5_build_id_given = True
|
||||||
|
if args.userland_build_id is None:
|
||||||
|
args.userland_build_id = default_build_id
|
||||||
|
this_module.userland_build_id_given = False
|
||||||
|
else:
|
||||||
|
this_module.userland_build_id_given = True
|
||||||
if args.gem5_worktree is not None and not gem5_build_id_given:
|
if args.gem5_worktree is not None and not gem5_build_id_given:
|
||||||
args.gem5_build_id = args.gem5_worktree
|
args.gem5_build_id = args.gem5_worktree
|
||||||
this_module.machine = args.machine
|
this_module.machine = args.machine
|
||||||
|
|||||||
@@ -93,7 +93,9 @@ cpio \
|
|||||||
expect \
|
expect \
|
||||||
flex \
|
flex \
|
||||||
gcc-aarch64-linux-gnu \
|
gcc-aarch64-linux-gnu \
|
||||||
gcc-arm-linux-gnueabi \
|
gcc-arm-linux-gnueabihf \
|
||||||
|
g++-aarch64-linux-gnueabi \
|
||||||
|
g++-arm-linux-gnueabihf \
|
||||||
git \
|
git \
|
||||||
libguestfs-tools \
|
libguestfs-tools \
|
||||||
moreutils \
|
moreutils \
|
||||||
@@ -150,7 +152,7 @@ EOF
|
|||||||
# Building SDL for QEMU in Buildroot was rejected upstream because it adds many dependencies:
|
# Building SDL for QEMU in Buildroot was rejected upstream because it adds many dependencies:
|
||||||
# https://patchwork.ozlabs.org/patch/770684/
|
# https://patchwork.ozlabs.org/patch/770684/
|
||||||
# We are just using the host SDL for now, if it causes too much problems we might remove it.
|
# We are just using the host SDL for now, if it causes too much problems we might remove it.
|
||||||
# libsdl2-dev needs to be installed separatedly from sudo apt-get build-dep qemu
|
# libsdl2-dev needs to be installed separately from sudo apt-get build-dep qemu
|
||||||
# because Ubuntu 16.04's QEMU uses SDL 1.
|
# because Ubuntu 16.04's QEMU uses SDL 1.
|
||||||
$mysudo apt-get install $y \
|
$mysudo apt-get install $y \
|
||||||
$pkgs \
|
$pkgs \
|
||||||
|
|||||||
Reference in New Issue
Block a user