> For the complete documentation index, see [llms.txt](https://lagnos.gitbook.io/linux-kernel-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lagnos.gitbook.io/linux-kernel-notes/lkmp/prerequisites.md).

# Prerequisites

### C Prorgramming and Debugging

* C fundamentals (unions, structs, typedefs, pointers, pointers vs arrays, etc.)
* callbacks and function pointers
* macros and preprocessors
* scope (extern, static, etc.)
* linking libraries and ability to work with Makefile and KConfig Files
* generation of static and shared (`.so`) libraries
* Debugging
  * Fluent in using GDB, Valgrid, strace, ptrace, etc. debugging and tracing tools

#### Resources

* Pointers on C Book by Kenneth A. Reek (**highly recommended**) - teaches you pointers and other important topics
* [Beej’s Guide to C Programming](https://beej.us/guide/bgc/html/split/) for basics and fundamental C
* Expert C Programming by van der Linden, Peter

### Operating Systems Concepts

* You need overall knowledge of working of operating systems
* Knowledge of userspace linux APIs and syscalls is highly recommended

#### Resources

* [Operating Systems Concept by Abraham Silberschatz](https://os-book.com/) or [Operating Systems: Three Easy Pieces](https://pages.cs.wisc.edu/~remzi/OSTEP/)
* MIT 6.1810 or 6.828 : Operating System Engineering (Labs + xv6 book is **must**) - [link](https://pdos.csail.mit.edu/6.828/2023/index.html). This will give you the important prerequisites and the confidence to explore into the kernel. Remember, complete all the labs.
