This is an old revision of the document!
Small projects
Make individual syscalls or groups of syscalls optional. See the
syscalls page for a list of syscalls that can't currently be compiled out. (Note that in most cases you'll want to compile out the underlying kernel functionality exposed by those syscalls; if that functionality is not already optional, this will likely turn into a large project.)
Turn contig_page_data
into .bss since it needs so little of itself initialized.
Configure out writing time to the hardware clock (and in the process, compile out RTC_LIB)
Compile out kernel/time/ntp.c, along with adjtimex and similar syscalls.
Compile out arch/x86/boot/early_serial_console
Remove runtime extable sorting logic if CONFIG_BUILDTIME_EXTABLE_SORT
Rip out the rest of kernel/smpboot.c if !CONFIG_SMP
Make SRCU optional; make portions of the kernel that define an srcu_struct
depend on the resulting new Kconfig symbol.
Compile out printks below a certain priority level.
Only include mm/highmem.c if CONFIG_HIGHMEM
Add size test for kselftest: boot a minimal kernel under qemu/kvm and capture the display of available memory from early boot, which also confirms that the kernel booted at all.
Larger projects
Make ptrace optional.
Rip out more of the per-CPU infrastructure when CONFIG_SMP=n
Support configuring out kswapd.
Make the kernel's entire random number infrastructure optional.
Compile out mm/vmstat
(need to stub out bits that obtain statistics used by other bits of the kernel)
Compile out signal handling.
Compile out support for capabilities; make capable always return true for root and false for non-root.
Compile out support for "personalities".
Compile out support for non-root users. When disabled, UID and GID effectively always equal 0, and all the syscalls involving UIDs and GIDs go away.
Compile out support for xattrs, and all the corresponding syscalls.
Compile out support for sockets and all the socket-related syscalls.
Support nommu on x86.
Revive the function-sections support.
Drop exports not used by the set of modules compiled with the kernel
Automatic syscall elimination
Kernel command-line constant folding
Execute in place (XIP) for x86
Constant folding for unused mount options (for instance, drop ext4's dioread_lock options at build time)
Go look at patches in OpenWRT to make the kernel smaller
Analyze size of inlines (Andi Kleen has some scripts)
make kernel/pid.o configurable (replace pidhash system with simpler pid allocator (e.g. from 1.0))
review items in kernel/Makefile: obj-y target, and eliminate or reduce for tiny kernels
Modify GCC's __attribute__((section(...)))
to support specifying different sections for initialized (.data
) and uninitialized (.bss
) data. Use that to put uninitialized __initdata
or per-CPU data into .bss
. (This will require very detailed exploration of the toolchain, Linux's linker scripts, and similar.)
Teach GCC to merge identical function bodies
Make link-time optimization work
Compress "cold" code paths (saves runtime memory)
Analysis to detect dead structure fields
Automatic structure re-layout to drop fields not referenced
Dropping structure field assignments; mark dead fields with an attribute, ignore writes, error on reads