Main source:


The module init tools was just duplicated into our tree (in lcd-domains/module_init_tools). For reference, this is the repo it comes from:

The Persistent Memory File System (PMFS) was installed into our main source repository by generating a patch from their code (see below). We forked the PMFS repository and our repo is here:

Source Layout

The majority of the source code/changes are in the lcd-domains folder. The LCD microkernel and test modules are all built as external builds. We originally built them with the rest of the kernel source and had fancy Kconfig entries; but we were wasting a lot of time rebuilding the whole kernel when we swapped branches, and there are enough pieces in our build now that it's too hard to build it with the rest of the source. Note: Yes, you can rebuild just a single kernel module at a time, even when building "in source" (as opposed to external).

  • Changes to Linux
    • There are various changes to the core of the Linux kernel, primarily:
      • Extra fields added to struct tast_struct
      • Modifications to kernel module loader, in kernel/module.c; grep for for_lcd
      • Modifications to kmod usermode helper, in kernel/kmod.c; grep for lcd
    • Charlie applied a patch that moved PMFS (Persistent Memory File System) into Linux; this modified a number of files. This was done in commit 0027b8396ad6c396d28e15bd87d1c440c0ba2457.
  • LCD microkernel
    • Arch-dependent part is in lcd-domains/arch/x86/microkernel
      • Internal definitions are in @@lcd-domains/arch/x86/include/asm/lcd_domains
    • Arch-independent part is in lcd-domains/microkernel
      • Internal definitions are in lcd-domains/include/lcd_domains/microkernel.h
  • LIBLCD interface
    • Most of the headers are in lcd-domains/include/liblcd
    • Some arch-dependent headers are in lcd-domains/arch/x86/include/asm/liblcd
  • kliblcd
    • Most of it is in lcd-domains/kliblcd
    • Some parts that are shared with liblcd are in lcd-domains/common (the code in this folder is designed to run in either environment, so we get code re-use)
    • Some internal definitions are in lcd-domains/include/lcd_domains/kliblcd.h
  • liblcd
    • Most of it is in lcd-domains/liblcd
    • Some parts that are shared with kliblcd are in lcd-domains/common
    • Some internal definitions are in
      • lcd-domains/include/lcd_domains/liblcd.h
      • lcd-domains/arch/x86/include/asm/lcd_domains/liblcd.h
  • libcap, libfipc, libasync
    • These are git submodules
    • libcap is in lcd-domains/libcap
    • libasync is in lcd-domains/libasync
    • libfipc is a submodule of libasync, in lcd-domains/libasync/fast-ipc-module
  • Patched insmod
    • This is in lcd-domains/module_init_tools
    • Open lcd-domains/module_init_tools/insmod.c and grep for lcd. You'll see that this patched version of insmod uses the ioctl interface provided by lcd_domains.ko (the LCD microkernel module).
  • Configuration headers/hacks
    • These are in lcd-domains/config. They are used to tweak the build for e.g. isolated code so we can build it at the same time as non-isolated code. This is because the isolated code environment doesn't support all of the bells and whistles quite yet.