Previous Lecture 🏠 Course Home
›
Chapter 2
›
Lecture 7 — Key Config Options
Next Lecture→
📘 Free Linux Kernel Development Course — Chapter 2
What Will You Learn in This Free Linux Kernel Development Lecture?
This is Lecture 7 in EmbeddedPathashala’s free Linux kernel development course. In Lectures 5 and 6 you mastered the Kconfig/Kbuild system and the menuconfig interface. Now it is time to apply that knowledge. In this lecture we walk through ten real, important kernel configuration options — explaining what each one does, why it matters to a kernel developer, and how to verify your changes.
- What
CONFIG_IKCONFIGdoes and how to read the embedded config from a running kernel - How
CONFIG_LOCALVERSIONaffects the kernel version string - What the UIO (Userspace I/O) framework is and when to use it
- Why you must never disable
CONFIG_SECURITYin production - What kernel debug options like
CONFIG_DEBUG_STACK_USAGEcatch - How to verify all your changes with a single grep command
- What changed between kernel 5.4 and 6.x for these options
Config Options Covered in This Lecture
CONFIG_IKCONFIG
CONFIG_IKCONFIG_PROC
CONFIG_PROFILING
CONFIG_HAMRADIO
CONFIG_VBOXGUEST
CONFIG_UIO
CONFIG_MSDOS_FS
CONFIG_SECURITY
CONFIG_DEBUG_STACK_USAGE
The Practice Configuration Table
The table below is our hands-on exercise for this lecture. Each row shows a config option, its location in the menuconfig menu, what we are changing it to, and why. We will cover each one in detail in the sections below. All paths are verified against Linux 6.x.
| CONFIG Symbol | Menu Path (6.x) | Old | New |
|---|---|---|---|
| CONFIG_LOCALVERSION | General setup → Local version | “” | “-ep” |
| CONFIG_IKCONFIG | General setup → Kernel .config support | n | y |
| CONFIG_IKCONFIG_PROC | General setup → Kernel .config support → Enable access via /proc/config.gz | n | y |
| CONFIG_PROFILING | General setup → Profiling support | y | n |
| CONFIG_HAMRADIO | Networking support → Amateur Radio support | y | n |
| CONFIG_VBOXGUEST | Device Drivers → Virtualization drivers → VirtualBox Guest integration | n | m |
| CONFIG_UIO | Device Drivers → Userspace I/O Drivers | n | m |
| CONFIG_MSDOS_FS | File systems → DOS/FAT/NT Filesystems → MSDOS fs support | n | m |
| CONFIG_SECURITY | Security options → Enable different security models | y | n ⚠️ |
| CONFIG_DEBUG_STACK_USAGE | Kernel hacking → Memory Debugging → Stack utilization instrumentation | n | y |
Option 1: CONFIG_LOCALVERSION — Naming Your Custom Kernel
Local version – append to kernel release
Text input field
Every Linux kernel has a version string. When you build a custom kernel — a key practical skill in this free Linux kernel development course — you want to be able to identify your build among other kernels on the system. CONFIG_LOCALVERSION lets you add a custom suffix to that version string.
Navigate to General setup → Local version – append to kernel release. Press Enter on the ( ) field, type -embeddedpathashala, and press Enter to confirm.
# After building and booting your kernel:
$ uname -r
6.12.0-embeddedpathashala
CONFIG_LOCALVERSION_AUTO in the same section. If enabled, it appends the git commit hash automatically, giving strings like 6.12.0-g3a1b2c3-embeddedpathashala. Disable it if you want a clean, predictable version string.Option 2: CONFIG_IKCONFIG — Embedding the Build Config in the Kernel
Kernel .config support
Tristate: y / m / n
Have you ever run a kernel on a device and wondered exactly what configuration options it was built with? CONFIG_IKCONFIG solves this by embedding a compressed copy of the .config file directly inside the kernel image itself.
Once enabled, you can extract the config from any kernel image — even if you no longer have the source tree — using the scripts/extract-ikconfig script:
# Extract config from a kernel image on disk:
scripts/extract-ikconfig /boot/vmlinuz-6.12.0-embeddedpathashala | less
# Or, if CONFIG_IKCONFIG_PROC is also enabled (see next section):
zcat /proc/config.gz | grep CONFIG_UIO
Option 3: CONFIG_IKCONFIG_PROC — Live Config Access via /proc
Requires CONFIG_IKCONFIG first
This is a child option of CONFIG_IKCONFIG. When both are enabled, the kernel’s embedded configuration becomes accessible as a gzip-compressed pseudo-file at /proc/config.gz. You can read it on any running system without needing the original source tree or build directory.
Many Linux distributions (Android, Arch Linux) enable both options so kernel developers can always inspect the exact configuration of any running kernel image.
Option 4: CONFIG_PROFILING — Kernel Performance Profiling
Disabling for this exercise only
Kernel profiling support enables the infrastructure needed by performance analysis tools like perf and OProfile. It allows you to measure where the kernel spends its CPU time, which code paths are hot, and which functions are bottlenecks.
We disable it in this exercise (n) purely to practice turning off a default-on option. In real development work, keep this enabled — perf is one of the most powerful tools in a Linux kernel developer’s toolkit.
CONFIG_PROFILING=y, tools like perf stat, perf record, and perf top will not work. Only disable on extremely resource-constrained embedded targets where every byte matters.Option 5: CONFIG_HAMRADIO — Amateur Radio Support
The Linux kernel includes support for Amateur (HAM) Radio hardware and the AX.25 packet radio protocol. This is a great example of a broad theme in this free Linux kernel development course: the kernel contains code for an enormous variety of hardware, and most of it will never be used on any given system. For typical x86 development machines or embedded targets, HAM radio hardware simply does not exist.
Disabling this option (n) reduces the kernel’s config surface area with zero practical downside for the vast majority of systems. This is healthy kernel hygiene — include only what you actually need.
Option 6: CONFIG_VBOXGUEST — VirtualBox Guest Integration
Setting to m (module)
If you are learning kernel programming inside a VirtualBox virtual machine — a common setup in this free Linux kernel development course — this driver provides guest integration features: shared clipboard, better mouse integration, and dynamic screen resolution changes.
We set it to m (module). This is the ideal choice: on a VirtualBox guest the module is loaded automatically; on physical hardware it simply does not load. Zero overhead either way, and no need to decide at build time whether you are in a VM or not.
Option 7: CONFIG_UIO — Userspace I/O Framework
Setting to m (module)
UIO (Userspace I/O) is a kernel framework that allows most of a device driver’s logic to run in userspace rather than in kernel space. A thin kernel module handles only interrupt notifications; all device communication, register access, and data processing happens in a normal userspace application. This makes driver development simpler, safer (bugs crash the app, not the kernel), and easier to debug with standard userspace tools.
CONFIG_UIO_PDRV_GENIRQ extends this for platform devices (common on ARM/RISC-V SoCs) that use a standard generic interrupt handler. Enable it to m alongside CONFIG_UIO.
Option 8: CONFIG_MSDOS_FS — MS-DOS Filesystem
The MSDOS filesystem is the original FAT12/FAT16 format without long filename support. It is rarely used on modern primary storage, but still appears on floppy disk images, some embedded bootloader partitions, and very old removable media. We enable it as a module (m) so the kernel can mount such filesystems when needed, without the code occupying memory all the time.
Note: If you need standard FAT32 support for modern USB drives, that is a different option: CONFIG_VFAT_FS. MSDOS FS and VFAT FS are different drivers in the kernel.
⚠️ Option 9: CONFIG_SECURITY — Linux Security Modules
⚠️ Exercise only — never disable in real systems
CONFIG_SECURITY enables the Linux Security Modules (LSM) framework — the pluggable architecture that makes mandatory access control systems like SELinux, AppArmor, TOMOYO, and SMACK possible. These go far beyond standard Unix file permissions and are fundamental to modern Linux security.
⚠️ CRITICAL WARNING:
We disable CONFIG_SECURITY in this lecture only as a configuration exercise. Never do this on a production system. Without the LSM framework, AppArmor, SELinux, and all other security modules stop working entirely. The system falls back to basic Unix DAC permissions only — a significant security downgrade. Only disable on a throwaway test VM used solely for kernel build experiments.
Option 10: CONFIG_DEBUG_STACK_USAGE — Stack Instrumentation
Setting to y (built-in)
Every kernel thread has a fixed-size stack — typically 8KB on 32-bit systems and 16KB on 64-bit x86. Stack overflows in kernel space are catastrophic because the kernel has no mechanism to handle them gracefully — they cause silent data corruption or a kernel panic. CONFIG_DEBUG_STACK_USAGE adds lightweight instrumentation to track how much of each thread’s stack is actually consumed, helping developers identify dangerous code paths.
This is essential in any free Linux kernel development course — when you are writing new kernel code, you need to know you are not approaching the stack limit.
CONFIG_KASAN (Kernel Address Sanitizer) and CONFIG_UBSAN (Undefined Behavior Sanitizer). These are industry-standard tools for catching memory bugs in kernel code — covered in later lectures of this free Linux kernel programming course.
Verifying All Your Changes
After making changes in menuconfig and saving, verify the resulting .config file before starting the build. Use grep to check multiple options at once:
# Verify all our changes in one command:
grep -E "CONFIG_LOCALVERSION|CONFIG_IKCONFIG|CONFIG_UIO|CONFIG_VBOXGUEST|\
CONFIG_SECURITY|CONFIG_DEBUG_STACK_USAGE|CONFIG_PROFILING|CONFIG_HAMRADIO" .config
Expected output after completing this lecture’s exercise:
CONFIG_LOCALVERSION="-embeddedpathashala"
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
# CONFIG_PROFILING is not set
# CONFIG_HAMRADIO is not set
CONFIG_VBOXGUEST=m
CONFIG_UIO=m
CONFIG_UIO_PDRV_GENIRQ=m
# CONFIG_MSDOS_FS is not set
# CONFIG_SECURITY is not set
CONFIG_DEBUG_STACK_USAGE=y
Once you are satisfied, start the kernel build:
# Build using all available CPU cores (fastest):
make -j$(nproc)
# Check how many cores you have:
nproc
Bonus: Other Useful Configuration make Targets
| Command | Purpose |
|---|---|
| make listnewconfig | Lists config options in the kernel but missing from your .config — useful after upgrading |
| make olddefconfig | Preserves old choices and sets new options to defaults. No prompts. |
| make savedefconfig | Saves a minimal config (only non-default values) to a file called defconfig |
| make localmodconfig | Generates a minimal config from currently loaded modules — ideal for embedded targets |
| make mrproper | ⚠️ Deletes .config and all build artifacts. Use only for a completely fresh start. |
Common Mistakes and Security Considerations
- Disabling CONFIG_SECURITY on anything other than a throwaway test kernel removes all LSM-based security (AppArmor, SELinux). Never do this in production.
- Forgetting make modules_install after building. Your kernel may boot but modules will fail to load if they are not installed to the correct path.
- Mixing module versions — always run
make modules_installfor the same kernel version you are about to boot. Running mismatched modules causes load failures. - Not backing up .config before
make mrproper. This is the most common way to lose hours of configuration work. - Enabling too many debug options simultaneously on embedded targets. Options like CONFIG_KASAN significantly increase memory usage — enable them one at a time.
🎯 Key Takeaways — Lecture 7
CONFIG_LOCALVERSIONadds a custom suffix to your kernel version — helps identify custom builds withuname -r.CONFIG_IKCONFIG=yembeds the build config in the kernel image;CONFIG_IKCONFIG_PROC=yexposes it at/proc/config.gz.- Disabling unused options (HAMRADIO, PROFILING) is healthy kernel hygiene — include only what your hardware needs.
CONFIG_UIOenables the Userspace I/O framework — an important concept in any free Linux device driver course.CONFIG_SECURITY=ndisables AppArmor, SELinux, and all LSMs — only acceptable on throwaway test kernels.- Debug options like
CONFIG_DEBUG_STACK_USAGEare essential for kernel development — enable them in dev kernels, disable in production. - Always verify changes with
grep CONFIG_XXX .configbefore starting the build.
Frequently Asked Questions — Linux Kernel Configuration Options
Q1. What is CONFIG_IKCONFIG and why is it recommended in a free Linux kernel development course?
CONFIG_IKCONFIG embeds a compressed copy of the kernel’s .config file directly into the kernel image. This is invaluable for debugging because you can always extract the exact configuration of any running kernel — even months after building it — using scripts/extract-ikconfig. Combined with CONFIG_IKCONFIG_PROC, you can read it live via zcat /proc/config.gz. It is recommended for development kernels to ensure reproducibility and traceability.
Q2. What is UIO and when would you choose it over a regular kernel driver?
UIO (Userspace I/O) is a framework where most driver logic runs in userspace, with only interrupt handling in a thin kernel module. Choose UIO when: the hardware does not require time-critical kernel-space processing; you want simpler development and debugging; or the driver team is more comfortable with userspace C than kernel C. UIO is popular in industrial control, FPGA interfaces, and embedded systems. For performance-critical paths or complex DMA requirements, a traditional full kernel driver is usually better.
Q3. What exactly does CONFIG_SECURITY protect, and what breaks if you disable it?
CONFIG_SECURITY enables the Linux Security Modules (LSM) framework. If disabled, the following stop working entirely: AppArmor (Ubuntu’s default security system), SELinux (used by RHEL, Fedora, Android), TOMOYO, and SMACK. The kernel falls back to only standard POSIX DAC (file ownership and permissions). This removes mandatory access control, namespace-based isolation for containers may be weakened, and many security-sensitive syscall restrictions are lifted. Never disable in production environments.
Q4. Why compile a driver as a module (m) instead of built-in (y)?
Modules reduce the kernel image size (faster boot, less RAM used from the start), can be loaded and unloaded at runtime without rebooting, and multiple versions can coexist on disk. Built-in (y) is required only for features needed before the root filesystem is mounted — such as the storage driver for the root partition. Everything else is usually better as a module for flexibility. CONFIG_VBOXGUEST=m is a perfect example: useful in a VM, irrelevant on physical hardware, and a module means no overhead when not needed.
Q5. What is CONFIG_DEBUG_STACK_USAGE and when should I enable it?
CONFIG_DEBUG_STACK_USAGE instruments each kernel thread’s stack to track maximum usage. The kernel periodically fills unused stack space with a pattern and checks how much has been overwritten to determine actual usage. This helps catch code paths that are dangerously close to the fixed stack limit (8/16 KB). Enable it in any development or testing kernel where you are writing new kernel code. Disable in production as it adds a small per-thread overhead.
Q6. What is the difference between CONFIG_MSDOS_FS and CONFIG_VFAT_FS?
CONFIG_MSDOS_FS supports the original FAT12/FAT16 format (MS-DOS filesystem) without long filename support — used for very old removable media and some embedded bootloader partitions. CONFIG_VFAT_FS adds VFAT support — FAT12/16/32 with long filename (VFAT/LFN) support — which is what modern USB drives and SD cards use. For mounting standard USB drives and SD cards formatted as FAT32, you want CONFIG_VFAT_FS. CONFIG_MSDOS_FS is for legacy hardware only.
Q7. How do I verify my config changes without opening menuconfig again?
Use grep directly on the .config file. For example: grep CONFIG_IKCONFIG .config shows the current value. For multiple options at once: grep -E "CONFIG_UIO|CONFIG_IKCONFIG|CONFIG_SECURITY" .config. Enabled options appear as CONFIG_XXX=y or CONFIG_XXX=m; disabled ones appear as # CONFIG_XXX is not set. This is faster than reopening menuconfig and is scriptable for automated build pipelines.
Q8. Does this free Linux kernel development course cover ARM and embedded platforms?
Yes. The configuration concepts in Lectures 5–7 apply identically to ARM, RISC-V, MIPS, and any other architecture supported by Linux. Future lectures in this free embedded systems course cover cross-compilation toolchains, device tree fundamentals, and platform-specific kernel configuration for ARM SoCs. The Kconfig/Kbuild system is architecture-independent by design.
References and Further Reading
- Linux Kernel Documentation — Kconfig language reference (docs.kernel.org)
- Linux Kernel Documentation — UIO: Userspace I/O driver guide
- Linux Kernel Documentation — Linux Security Module (LSM) framework
- kernel.org — Official Linux kernel releases
- Oracle Blogs — Exploring Linux kernel configurations with kconfigs
🎉 Chapter 2 Complete!
You have completed all three configuration lectures in this free Linux kernel development course. You now understand the entire kernel configuration workflow — from Kconfig language to menuconfig navigation to individual CONFIG_ options. You are ready to build your first custom Linux 6.x kernel.
