Linux Kernel Development


Part 1



by:

Sameer Rahmani



Chapter 1

Basics

Overview




  • What is Linux Kernel ?
  • Why I need to learn about Kernel ?
  • Linux Kernel development process
  • Basic Linux Kernel internals

What is kernel anyway?



Kernel is responsible for communication
 with hardware


Kernel Provides a unique interface for
 software to use hardware 


Kernel is responsible to handle network
 communications


Kernel schedules processes to use CPU time


Kernel shares resources between processes




Very Basic Schema of an operating system


Why software need

 kernel?


  • Without a kernel each software has to implement its own interface to use hardware
  • With lots of interfaces around, there will be huge number of software bugs around.
  • There is no warranty for performance of each interface.

Why do i need to know about

 Kernel?



  • You can improve your system performance
  • You can install some device drivers by yourself *
  • It's good to know about your Linux box
  • If you are a developer or want to be one you have to know how your operating system operates.

Why Linux Kernel ?


  • It's totally free ( under GPL v2)
  • Monolithic with support for loadable modules
  • True multi-tasking
  • Support for hardware and filesystem
  • Multi-arch
  • Robust community 
  • People watching, So no backdoor
  • Configurable
  • ........




that's Enough, let's begin



First Step

Build a custom kernel

Requirements for build


1. Linux kernel source code. Get it from www.kernel.org
$ wget  https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.x.y.tar.xz 

2. A bootloader. You definitely have one already.

3.ncurses library and build tools          (on a debian box)
# apt install libncurses5 build-essential 

Lets Do it


Extract the source code.
$ tar Jxvf linux-3.x.y.tar.xz  
Create a build directoy
$ mkdir build 
Configure the kernel  ( It's the hard part )
$ cd linux-3.x.y && make O=../build menuconfig 
build the kernel
$ make O=../build -j 4 

Installation

Install new kernel image
# make O=../build modules_install install 

update your bootloader configuration to load new image.
# update-grub2 
* In case of a grub2 bootloader on a debian compatible boxes


Reboot & Enjoy new kernel

Initial Ram disk



Installer script probably created it for you.



Manual creation of initrd:

# cd /boot/ && mkinitramfs -v -o ./initrd-3.x.y 3.x.y 



Understanding

Start up Process




BIOS -> Bootloader -> Kernel

Bios



BIOS performs hardware-platform specific
 startup tasks



BIOS loads and executes the partition boot code
 from the designated boot device
(Phase 1 of a Linux bootloader)

Bootloader

Phase 1 loads phase 2 (the bulk of the boot loader code).

Some bootloaders use a phase called "Phase 1.5"
Without is some modern disks may not be 
fully available.

Decompress OS into memory and load it.

Prepare hardware and memory before calling
  'start_kernel()'

Kernel



'start_kernel()' perform OS setup
( Interrupts, Memory management, Drivers, etc )


Kernel spawns idle process, scheduler and systemd


  systemd sets up and load the user space world




Wait until next chapter To learn about startup process in nutshell 



End of Chapter 1


References: 

  • https://www.kernel.org/doc/
  • Linux Kernel Development (3rd Edition) ISBN: 978-0672329463
  • Linux kernel documentation (documents directory in source tree)

Contact me


Website :     www.lxsameer.com

IRC:     irc://irc.freenode.net/#5hit

Email:       lxsameer@gnu.org

twitter:          @lxsameer

Linux Kernel Development

By Sameer Rahmani

Linux Kernel Development

  • 2,644