Difference between revisions of "Kernel: Anatomi Kernel Source"

From OnnoWiki
Jump to navigation Jump to search
(New page: Sumber: http://www.linuxchix.org/content/courses/kernel_hacking/lesson6 In this lesson, you'll get a general idea of where the various parts of the kernel are located in the source tree, ...)
 
 
(31 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
Sumber: http://www.linuxchix.org/content/courses/kernel_hacking/lesson6
 
Sumber: http://www.linuxchix.org/content/courses/kernel_hacking/lesson6
  
In this lesson, you'll get a general idea of where the various parts of the kernel are located in the source tree, what order they execute in, and how to go looking for a particular piece of code.
+
Pada bagian ini, kita akan mempelajari secara umum berbagai bagian dari kernel, seperti,
Where is all the code?
+
* letak pada source tree (pohon source code).
 +
* urutan mereka di jalankan / di eksekusi.
 +
* bagaimana cara mencari source code tertentu.
  
Let's start with the top-level directory of the Linux source tree, which is usually but not always in /usr/src/linux-<version>. We won't get too detailed, because the Linux source changes constantly, but we'll try to give you enough information to figure out where a certain driver or function is.
+
==Dimana source code berada?==
Makefile
 
  
This file is the top-level Makefile for the whole source tree. It defines a lot of useful variables and rules, such as the default gcc compilation flags.
+
Mulai dari directory pada top-level di Linux source tree, biasanya (walaupun belum tentu selalu) ada di bawah /usr/src/linux-<version>. Kita tidak akan terlalu detail disini, karena source Linux selalu berubah, paling tidak informasi yang akan diberikan cukup untuk mencari driver atau function tertentu berada.
Documentation/
 
  
This directory contains a lot of useful (but often out of date) information about configuring the kernel, running with a ramdisk, and similar things. The help entries corresponding to different configuration options are not found here, though - they're found in Kconfig files in each source directory.
+
===Makefile===
arch/
+
File ini adalah top-level Makefile untuk seluruh source tree. File ini mendefinisikan banyak sekali variable dan rule, seperti flag kompilasi gcc dll.
  
All the architecture specific code is in this directory and in the include/asm-<arch> directories. Each architecture has its own directory underneath this directory. For example, the code for a PowerPC based computer would be found under arch/ppc. You will find low-level memory management, interrupt handling, early initialization, assembly routines, and much more in these directories.
+
===Documentation/===
crypto/
+
Directory ini berisi banyak sekali informasi bermanfaat (walaupun kadang-kadang kadaluarsa) tentang cara konfigurasi kernel, menjalankan dengan ramdisk, dan banyak lagi. Informasi help yang berhubungan dengan berbagai pilihan konfigurasi tidak dapat ditemukan disini - walaupun mereka dapat di temukan pada file Kconfig di masing-masing directory source.
  
This is a cryptographic API for use by the kernel itself.
+
===arch/===
drivers/
+
Semua code spesifik arsitektur berada di directory ini dan di directory include/asm-<arch>. Setiap arsitektur mempunyai directory di bawah directory ini. Contoh, code untuk komputer PowerPC dapat di temukan di arch/ppc. Kita dapat menemukan  low-level memory management, penanganan interupsi, inisialisasi awal, dan banyak lagi di directory ini.
  
As a general rule, code to run peripheral devices is found in subdirectories of this directory. This includes video drivers, network card drivers, low-level SCSI drivers, and other similar things. For example, most network card drivers are found in drivers/net. Some higher level code to glue all the drivers of one type together may or may not be included in the same directory as the low-level drivers themselves.
+
===crypto/===
fs/
+
Ini adalah API cryptographic untuk digunakan oleh kernel itu sendiri.
  
Both the generic filesystem code (known as the VFS, or Virtual File System) and the code for each different filesystem are found in this directory. Your root filesystem is probably an ext2 filesystem; the code to read the ext2 format is found in fs/ext2. Not all of the filesystems compile or run, and the more obscure filesystems are always a good candidate for someone looking for a kernel project.
+
===drivers/===
include/
+
Aturan umum, code untuk menjalankan device peripheral dapat di temukan di subdirectory dari directory ini. Ini termasuk, driver video, driver network card, driver SCSI low-level, dan berbagai hal sekitar itu. Contoh, kebanyakan driver network card dapat ditemukan di drivers/net. Beberapa higher level code digunakan untuk menempelkan semua tipe driver, yang mungkin tidak berada di directory yang sama seperti low level driver itu sendiri, menjadi satu kesatuan.
  
Most of the header files included at the beginning of a .c file are found in this directory. Architecture specific include files are in asm-<arch>. Part of the kernel build process creates the symbolic link from asm to asm-<arch>, so that #include <asm/file.h> will get the proper file for that architecture without having to hard code it into the .c file. The other directories contain non-architecture specific header files. If a structure, constant, or variable is used in more than one .c file, it should be probably be in one of these header files.
+
===fs/===
init/
+
Baik code file sistem generik (dikenal sebagai VFS, atau Virtual File System) dan code untuk berbagai file sistem yang berbeda dapat di temukan pada directory ini. Root file sistem yang kita gunakan mungkin ext2; code untuk membaca format ext2 dapat di temukan dalam fs/ext2. Tidak semua file sistem dapat di compile dan di run, file system yang baru dan aneh adalah contoh yang baik bagi mereka yang ingin mencari proyek baru untuk kernel.
  
This directory contains the files main.c, version.c, and code for creating "early userspace". version.c defines the Linux version string. main.c can be thought of as the kernel "glue". We'll talk more about main.c in the next section. Early userspace provides functionality that needs to be available while a Linux kernel is coming up, but that doesn't need to be run inside the kernel itself.
+
===include/===
ipc/
+
Sebagian besar file header yang di include di awal file source code .c dapat di temukan di directory ini. Arsitektur spesifik dari include file biasanya di asm-<arch>. Bagian dari proses kernel build adalah membuat link simbolik dari asm ke asm-<arch>, sehingga #include <asm/file.h> dapat memperoleh file yang benar untuk arsitektur tersebut tanpa harus melakukan hard code ke dalam file .c. Directory lain berisi header yang non-arsitektur spesifik. Jika sebuah struktur, konstanta, atau variable digunakan di lebih dari satu file .c, maka kemungkinan besar itu akan ada dalam salah satu file header ini.
  
"IPC" stands for "Inter-Process Communication". It contains the code for shared memory, semaphores, and other forms of IPC.
+
===init/===
kernel/
+
Directory ini berisi file main.c, version.c, dan code untuk membuat "early userspace". version.c mendefinisikan string Linux version. main.c dapat dilihat sebagai "lem" kernel. kita akan membicarakan lebih dalam tentang main.c di bagian selanjutnya. Userspace awal akan memberikan fungsionalitas yang dibutuhkan saat Linux kernel nyala, tapi tidak perlu berada / berjalan dalam kernel itu sendiri.
  
Generic kernel level code that doesn't fit anywhere else goes in here. The upper level system call code is here, along with the printk() code, the scheduler, signal handling code, and much more. The files have informative names, so you can type ls kernel/ and guess fairly accurately at what each file does.
+
===ipc/===
lib/
+
"IPC" singkatan dari "Inter-Process Communication". Ini berisi code untuk shared memory, semaphores, dan berbagai bentuk IPC.
  
Routines of generic usefulness to all kernel code are put in here. Common string operations, debugging routines, and command line parsing code are all in here.
+
===kernel/===
mm/
+
Code level kernel generic yang tidak masuk ke mana-mana ada dalam directory ini. Level atas dari code sistem call ada disini, bersama dengan code printk(), scheduler, code untuk handling sinyal, dan banyak lagi. Nama file cukup informatif, kita dapat mengetik ls kernel/ dan dapat mengira-ngira dengan akurat fungsi dari masing-masing file.
  
High level memory management code is in this directory. Virtual memory (VM) is implemented through these routines, in conjunction with the low-level architecture specific routines usually found in arch/<arch>/mm/. Early boot memory management (needed before the memory subsystem is fully set up) is done here, as well as memory mapping of files, management of page caches, memory allocation, and swap out of pages in RAM (along with many other things).
+
===lib/===
net/
+
Subroutine yang secara generic bermanfaat untuk semua code kernel diletakan disini. Operasi string, routing debugging, dan code untuk parsing command line semua ada disini.
  
The high-level networking code is here. The low-level network drivers pass received packets up to and get packets to send from this level, which may pass the data to a user-level application, discard the data, or use it in-kernel, depending on the packet. The net/core directory contains code useful to most of the different network protocols, as do some of the files in the net/ directory itself. Specific network protocols are implemented in subdirectories of net/. For example, IP (version 4) code is found in the directory net/ipv4.
+
===mm/===
scripts/
+
High level memory management code berada dalam directory ini. Virtual memory (VM) di implementasikan melalui subroutine disini, dibantu oleh subroutine arsitektur spesifik low level yang biasanya ada di arch/<arch>/mm/. Saat awal boot memory management (dibutuhkan sebelum subsistem memory di setup secara penuh) dilakukan disini, termasuk memory mapping dari file, manajemen dari page cache, alokasi memory, dan swap out dari page di RAM (dan masih banyak lagi).
  
This directory contains scripts that are useful in building the kernel, but does not include any code that is incorporated into the kernel itself. The various configuration tools keep their files in here, for example.
+
===net/===
security/
+
Networking code high level berada disini. Network driver low-level akan menerima dan mengirim paket melalui level ini, yang kemudian meneruskannya ke level aplikasi, atau membuang data, atau menggunakannya di kernel, tergantung jenis paketnya. Directory net/core berisi code yang berguna untuk berbagai protokol jaringan, juga beberapa file di directory /net. Protokol jaringan yang spesifik di implementasikan di subdirectory net/. Contoh, code IP (versi 4) ada di directory net/ipv4.
  
Code for different Linux security models can be found here, such as NSA Security-Enhanced Linux and socket and network security hooks.
+
===scripts/===
sound/
+
Directory ini berisi script yang berguna untuk membangun kernel, tapi tidak termasuk code yang masuk dalam kernel itu sendiri. Contoh, berbagai tool untuk konfigurasi tersimpan file-nya disini.
  
Drivers for sound cards and other sound related code is placed here.
+
===security/===
usr/
+
Code untuk berbagai model security di Linux dapat di temukan disini, seperto NSA
 +
Security-Enhanced Linux maupun kait untuk socket dan network security.
  
This directory contains code that builds a cpio-format archive containing a root filesystem image, which will be used for early userspace.
+
===sound/===
Where does it all come together?
+
Driver untuk sound card dari berbagai code berhubungan dengan sound / audio berada disini.
  
The central connecting point of the whole Linux kernel is the file init/main.c. Each architecture executes some low-level setup functions and then executes the function called start_kernel, which is found in init/main.c.
+
===usr/===
 +
Directory ini berisi code untuk build arsip dengan format cpio berisi image root file sistem, yang akan digunakan untuk user space awal.
  
The order of execution of code looks something like this:
+
==Bagaimana semua ini menjadi satu?==
  
  Architecture-specific setup code (in arch/<arch>/*)
+
Pusat dari seluruh kernel [[Linux]] adalah file init/main.c. Setiap arsitektur akan menjalankan function untuk setup low level dan kemudian akan mengeksekusi function start_kernel, yang dapat ditemukan di init/main.c.
 +
 
 +
Urutan eksekusi code akan tampak seperti berikut ini:
 +
 
 +
  Architecture-specific setup code (di arch/<arch>/*)
 
     |
 
     |
 
     v
 
     v
  The function start_kernel() (in init/main.c)
+
  function start_kernel() (di init/main.c)
 
     |
 
     |
 
     v
 
     v
  The function init() (in init/main.c)
+
  function init() (di init/main.c)
 
     |
 
     |
 
     v
 
     v
  The user level "init" program
+
  user level "init" program
 +
 
 +
Untuk lebih detailnya, berikut adalah yang terjadi:
 +
 
 +
    Architecture-specific set up code yang akan melakukan:
 +
        Unzip dan move ke kernel code itu sendiri, jika dibutuhkan
 +
        Inisialisasi hardware
 +
            Ini dapat termasuk setup low-level memory management
 +
        Transfer control ke function start_kernel()
 +
    start_kernel() akan melakukan, antara lain:
 +
        Print out versi kernel dan command line
 +
        Start output ke console
 +
        Aktifkan interupsi
 +
        Kalibrasi delay loop
 +
        Call rest_init(), yang akan melakukan:
 +
            Start kernel thread untuk menjalankan function init()
 +
            Masuk ke idle loop
 +
    init() akan melakukan:
 +
        Start processor lainnya (di mesin SMP)
 +
        Start subsystem device
 +
        Mount root filesystem
 +
        Bebaskan kernel memory yang tidak digunakan
 +
        Jalankan /sbin/init (atau /etc/init, atau ...)
 +
 
 +
Pada titik ini, userlevel init program sudah berjalan, yang akan menjalankan berbagai hal seperti start layanan jaringan dan jalankan getty (login program) pada console.
 +
 
 +
Kita dapat mengenali kapan sebuah subsistem di inisialisasi dari start_kernel() atau init() dengan menulis printk oleh kita dan melihat kapan printk dari subsistem tersebut muncul relatif terhadap printk kita. Contoh, kita ingin mengetahui kapan sound system ALSA di inisialisasi, tulis printk di awal start_kernel() dan init() dan cari kapan "Advanced Linux Sound Architecture [...]" di cetak relatif terhadap printk. Untuk mengerti lebih lanjut ada baiknya membaca cara menggunakan function printk() dalam hacking kernel.
  
In more detail, this is what happens:
+
==Mencari berbagai hal di kernel source tree==
  
    Architecture-specific set up code that does:
+
Misalnya kita ingin mengerjakan sebuah driver, misalnya, USB driver. Mulai dari manakah kita untuk mencari USB code tersebut?
        Unzip and move the kernel code itself, if necessary
 
        Initialize the hardware
 
            This may include setting up low-level memory management
 
        Transfer control to the function start_kernel()
 
    start_kernel() does, among other things:
 
        Print out the kernel version and command line
 
        Start output to the console
 
        Enable interrupts
 
        Calibrate the delay loop
 
        Calls rest_init(), which does:
 
            Start a kernel thread to run the init() function
 
            Enter the idle loop
 
    init() does:
 
        Start the other processors (on SMP machines)
 
        Start the device subsystems
 
        Mount the root filesystem
 
        Free up unused kernel memory
 
        Run /sbin/init (or /etc/init, or...)
 
  
At this point, the userlevel init program is running, which will do things like start networking services and run getty (the login program) on your console(s).
+
Pertama-tama, kita dapat mencoba menggunakan perintah find pada directory kernel pada top-level, sebagai berikut:
  
You can figure out when a subsystem is initialized from start_kernel() or init() by putting in your own printk's and seeing when the printk's from that subsystem appear with regard to your own printk's. For example, if you wanted to find out when the ALSA sound system was initialized, put printk's at the beginning of start_kernel() and init() and look for where "Advanced Linux Sound Architecture [...]" is printed out relative to your printk's. (See Kernel Hacking Lesson #5 for help with using the printk() function.)
+
$ find . -name \*usb\*
Finding things in the kernel source tree
 
  
So, you want to start working on, say, the USB driver. Where do you start looking for the USB code?
+
Perintah ini akan mem-print setiap filename yang ada kata "usb" di tengahnya.
  
First, you can try a find command from the top-level kernel directory:
+
Cara lain, kita dapat mencoba untuk mencari string yang unik. String unik ini dapat berupa output dari printk(), nama file di /proc, atau string unik lainnya yang dapat di temukan di source code dari dari driver tersebut. Contoh, USB akan mengeluarkan message seperti:
  
  $ find . -name \*usb\*
+
usb-ohci.c: USB OHCI at membase 0xcd030000, IRQ 27
  
This command will print out every filename that has the string "usb" in the middle of it.
+
Oleh karenanya kita dapat mencoba untuk melakukan recursive grep untuk menemukan bagian dari to find printk yang menulis, misalnya:
  
Another thing you might try is looking for a unique string. This unique string can be the output of a printk(), the name of a file in /proc, or any other unique string that might be found in the source code for that driver. For example, USB prints out the message:
+
$ grep -r "USB OHCI at" .
  
  usb-ohci.c: USB OHCI at membase 0xcd030000, IRQ 27
+
Cara lain, kita dapat mencari USB source code dengan melihat /proc. Jika kita ketik
  
So you might try using a recursive grep to find the part of that printk that is not a conversion character like %d:
+
find /proc -name usb
  
  $ grep -r "USB OHCI at" .
+
mungkin kita akan menemukan sebuah directory dengan nama /proc/bus/usb. Kita mungkin akan menemukan string unik untuk di grep sesudah membaca entry dari directory tersebut.
  
Another way you might try to find the USB source code is by looking in /proc. If you type find /proc -name usb, you might find that there is a directory named /proc/bus/usb. You might be able to find a unique string to grep for by reading the entries in that directory.
+
Jika semua gagal, kita dapat mencoba masuk ke dalam directory yang ada secara individual dan melihat file-nya, atau melihat hasil dari perintah
  
If all else fails, try descending into individual directories and listing the files, or looking at the output of ls -lR. You may see a filename that looks related. But this should really be a last resort, and something to be tried only after you have run many different find and grep commands.
+
ls -lR
  
Once you've found the source code you are interested in, you can start reading it. Reading and understanding Linux kernel code is another lesson in itself. Just remember that the more you read kernel code, the easier it gets. Have fun exploring the kernel!
+
Kita dapat memperhatikan kalau-kalau filename yang keluar mungkin yang kita maksud. Tetapi cara ini sebaiknya adalah cara terakhir, sesudah semua cara menggunakan perintah find dan grep dilakukan.
  
 +
Setelah kita menemukan source code yang kita inginkan / tertarik, kita dapat mulai membacanya. Membaca dan mengerti kernel Linux adalah pembelajaran tersendiri. Perlu di ingat bahwa semakin sering kita membaca kernel code, semakin memudahkan kita.
  
 +
Selamat mengeksplorasi kernel!!
  
 
==Referensi==
 
==Referensi==
Line 132: Line 147:
 
* [[Linux]]
 
* [[Linux]]
 
* [[Ubuntu]]
 
* [[Ubuntu]]
 +
* [[Buku Sistem Operasi]]
 +
 +
===Secara Umum===
 +
 
* [[Sistem Operasi]]
 
* [[Sistem Operasi]]
 +
 +
===Instalasi Linux===
 +
 +
* [[Linux: CLI untuk Survival]]
 +
* [[Linux: Skema Partisi di Linux]]
 +
* [[Linux: Instalasi Sistem Operasi]]
 +
* [[Membuat Repository Ubuntu Lokal menggunakan debmirror]]
 +
 +
===Compile Kernel===
 +
 
* [[Kernel]]
 
* [[Kernel]]
 +
* [[OS: Linux Kernel]]
 +
* [[Kernel: Anatomi Kernel Source]]
 
* [[Compile Kernel]]
 
* [[Compile Kernel]]
 
* [[Compile Kernel: Konfigurasi Kernel]]
 
* [[Compile Kernel: Konfigurasi Kernel]]
* [[Kernel: Anatomi Kernel Source]]
+
 
* [[OS: Linux Kernel]]
+
===Remaster Linux===
 +
 
 +
* [[Cara Cepat Melakukan Remastering Ubuntu]]
 +
 
 +
===Sistem Operasi untuk Embedded===
 +
 
 +
* [[OpenWRT]]
 +
* [[OpenWRT: Download Firmware yang sudah jadi]]
 +
* [[OpenWRT: Source Repository Download]]
 +
* [[OpenWRT: Melihat Daftar Package]]
 +
 
 +
====Membuat Firmware Sendiri====
 +
 
 +
* [[OpenWRT: Build Firmware]]
 +
* [[OpenWRT: Build Firmware Buffalo WZRHPG450H]]
 +
* [[OpenWRT: Build Firmware Buffalo WZRHPG300N]]
 +
* [[OpenWRT: Build Firmware Ubiquiti NanoStation2]]
 +
* [[OpenWRT: Build Firmware Mikrotik RB433]]
 +
* [[OpenWRT: Build Firmware Linksys WRT160NL]]
 +
* [[OpenWRT: Build Firmware Linksys WRT54GL]]
 +
 
 +
====Flash ke Device====
 +
 
 +
* [[OpenWRT: Flash Linksys WRT54GL]]
 +
* [[OpenWRT: Flash Buffalo WZRHP450H]]
 +
* [[OpenWRT: Flash Buffalo WZRHP300N]]
 +
* [[OpenWRT: Flash UBNT NanoStation2]]
 +
* [[OpenWRT: Flash Linksys WRT160NL]]
 +
 
 +
====Beberapa Tip====
 +
 
 +
* [[OpenWRT: Mikrotik RB433]]
 +
* [[OpenWRT: 3G modem]]
 +
* [[OpenWRT: Build Firmware dengan 3G Modem Support]]
 +
* [[OpenWRT: Setup Firewall]]
 +
* [[OpenWRT: Konfigurasi UBNT NanoStation2 tanpa WebGUI]]
 +
 
 +
===Tuning Kernel===
 +
 
 
* [[OS: Parameter Kernel Default]]
 
* [[OS: Parameter Kernel Default]]
 +
 +
====Tuning Kernel Scheduler====
 +
 
* [[OS: Kernel Scheduler]]
 
* [[OS: Kernel Scheduler]]
 +
* [[OS: Tuning Kernel Scheduler]]
 +
* [[OS: Tuning Completely Fair scheduler CFS]]
 
* [[OS: Complete Teori Tuning Kernel Scheduler]]
 
* [[OS: Complete Teori Tuning Kernel Scheduler]]
 +
 +
====Tuning I/O Scheduler====
 +
 +
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]]
 
* [[OS: Complete Teori Tuning I/O Performance]]
 
* [[OS: Complete Teori Tuning I/O Performance]]
* [[OS: Tuning Kernel Scheduler]]
+
 
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]]
+
====Tuning Manajemen Memory====
* [[OS: Tuning Completely Fair scheduler CFS]]
+
 
 +
* [[OS: Tuning Manajemen Memory]]
 +
 
 +
===Android===
 +
 
 +
* [[OS: Android - Download]]
 +
 
 +
===Membuat Kernel Module===
 +
 
 +
* [[OS: Mengerti System Call]]
 +
* [[OS: Membuat Kernel Modul]]
 +
 
 +
===Monitoring & Benchmark===
 +
 
 
* [[OS: Build in Monitoring Tool]]
 
* [[OS: Build in Monitoring Tool]]
 
* [[Linux Benchmarking]]
 
* [[Linux Benchmarking]]
 
* [[OS: Benchmarking menggunakan UnixBench]]
 
* [[OS: Benchmarking menggunakan UnixBench]]
 
* [[OS: Benchmarking menggunakan LLCBench]]
 
* [[OS: Benchmarking menggunakan LLCBench]]
* [[OS: Membuat Kernel Modul]]
 

Latest revision as of 05:41, 9 May 2013

Sumber: http://www.linuxchix.org/content/courses/kernel_hacking/lesson6

Pada bagian ini, kita akan mempelajari secara umum berbagai bagian dari kernel, seperti,

  • letak pada source tree (pohon source code).
  • urutan mereka di jalankan / di eksekusi.
  • bagaimana cara mencari source code tertentu.

Dimana source code berada?

Mulai dari directory pada top-level di Linux source tree, biasanya (walaupun belum tentu selalu) ada di bawah /usr/src/linux-<version>. Kita tidak akan terlalu detail disini, karena source Linux selalu berubah, paling tidak informasi yang akan diberikan cukup untuk mencari driver atau function tertentu berada.

Makefile

File ini adalah top-level Makefile untuk seluruh source tree. File ini mendefinisikan banyak sekali variable dan rule, seperti flag kompilasi gcc dll.

Documentation/

Directory ini berisi banyak sekali informasi bermanfaat (walaupun kadang-kadang kadaluarsa) tentang cara konfigurasi kernel, menjalankan dengan ramdisk, dan banyak lagi. Informasi help yang berhubungan dengan berbagai pilihan konfigurasi tidak dapat ditemukan disini - walaupun mereka dapat di temukan pada file Kconfig di masing-masing directory source.

arch/

Semua code spesifik arsitektur berada di directory ini dan di directory include/asm-<arch>. Setiap arsitektur mempunyai directory di bawah directory ini. Contoh, code untuk komputer PowerPC dapat di temukan di arch/ppc. Kita dapat menemukan low-level memory management, penanganan interupsi, inisialisasi awal, dan banyak lagi di directory ini.

crypto/

Ini adalah API cryptographic untuk digunakan oleh kernel itu sendiri.

drivers/

Aturan umum, code untuk menjalankan device peripheral dapat di temukan di subdirectory dari directory ini. Ini termasuk, driver video, driver network card, driver SCSI low-level, dan berbagai hal sekitar itu. Contoh, kebanyakan driver network card dapat ditemukan di drivers/net. Beberapa higher level code digunakan untuk menempelkan semua tipe driver, yang mungkin tidak berada di directory yang sama seperti low level driver itu sendiri, menjadi satu kesatuan.

fs/

Baik code file sistem generik (dikenal sebagai VFS, atau Virtual File System) dan code untuk berbagai file sistem yang berbeda dapat di temukan pada directory ini. Root file sistem yang kita gunakan mungkin ext2; code untuk membaca format ext2 dapat di temukan dalam fs/ext2. Tidak semua file sistem dapat di compile dan di run, file system yang baru dan aneh adalah contoh yang baik bagi mereka yang ingin mencari proyek baru untuk kernel.

include/

Sebagian besar file header yang di include di awal file source code .c dapat di temukan di directory ini. Arsitektur spesifik dari include file biasanya di asm-<arch>. Bagian dari proses kernel build adalah membuat link simbolik dari asm ke asm-<arch>, sehingga #include <asm/file.h> dapat memperoleh file yang benar untuk arsitektur tersebut tanpa harus melakukan hard code ke dalam file .c. Directory lain berisi header yang non-arsitektur spesifik. Jika sebuah struktur, konstanta, atau variable digunakan di lebih dari satu file .c, maka kemungkinan besar itu akan ada dalam salah satu file header ini.

init/

Directory ini berisi file main.c, version.c, dan code untuk membuat "early userspace". version.c mendefinisikan string Linux version. main.c dapat dilihat sebagai "lem" kernel. kita akan membicarakan lebih dalam tentang main.c di bagian selanjutnya. Userspace awal akan memberikan fungsionalitas yang dibutuhkan saat Linux kernel nyala, tapi tidak perlu berada / berjalan dalam kernel itu sendiri.

ipc/

"IPC" singkatan dari "Inter-Process Communication". Ini berisi code untuk shared memory, semaphores, dan berbagai bentuk IPC.

kernel/

Code level kernel generic yang tidak masuk ke mana-mana ada dalam directory ini. Level atas dari code sistem call ada disini, bersama dengan code printk(), scheduler, code untuk handling sinyal, dan banyak lagi. Nama file cukup informatif, kita dapat mengetik ls kernel/ dan dapat mengira-ngira dengan akurat fungsi dari masing-masing file.

lib/

Subroutine yang secara generic bermanfaat untuk semua code kernel diletakan disini. Operasi string, routing debugging, dan code untuk parsing command line semua ada disini.

mm/

High level memory management code berada dalam directory ini. Virtual memory (VM) di implementasikan melalui subroutine disini, dibantu oleh subroutine arsitektur spesifik low level yang biasanya ada di arch/<arch>/mm/. Saat awal boot memory management (dibutuhkan sebelum subsistem memory di setup secara penuh) dilakukan disini, termasuk memory mapping dari file, manajemen dari page cache, alokasi memory, dan swap out dari page di RAM (dan masih banyak lagi).

net/

Networking code high level berada disini. Network driver low-level akan menerima dan mengirim paket melalui level ini, yang kemudian meneruskannya ke level aplikasi, atau membuang data, atau menggunakannya di kernel, tergantung jenis paketnya. Directory net/core berisi code yang berguna untuk berbagai protokol jaringan, juga beberapa file di directory /net. Protokol jaringan yang spesifik di implementasikan di subdirectory net/. Contoh, code IP (versi 4) ada di directory net/ipv4.

scripts/

Directory ini berisi script yang berguna untuk membangun kernel, tapi tidak termasuk code yang masuk dalam kernel itu sendiri. Contoh, berbagai tool untuk konfigurasi tersimpan file-nya disini.

security/

Code untuk berbagai model security di Linux dapat di temukan disini, seperto NSA Security-Enhanced Linux maupun kait untuk socket dan network security.

sound/

Driver untuk sound card dari berbagai code berhubungan dengan sound / audio berada disini.

usr/

Directory ini berisi code untuk build arsip dengan format cpio berisi image root file sistem, yang akan digunakan untuk user space awal.

Bagaimana semua ini menjadi satu?

Pusat dari seluruh kernel Linux adalah file init/main.c. Setiap arsitektur akan menjalankan function untuk setup low level dan kemudian akan mengeksekusi function start_kernel, yang dapat ditemukan di init/main.c.

Urutan eksekusi code akan tampak seperti berikut ini:

 Architecture-specific setup code (di arch/<arch>/*)
   |
   v
 function start_kernel() (di init/main.c)
   |
   v
 function init() (di init/main.c)
   |
   v
 user level "init" program

Untuk lebih detailnya, berikut adalah yang terjadi:

   Architecture-specific set up code yang akan melakukan:
       Unzip dan move ke kernel code itu sendiri, jika dibutuhkan
       Inisialisasi hardware
           Ini dapat termasuk setup low-level memory management
       Transfer control ke function start_kernel()
   start_kernel() akan melakukan, antara lain:
       Print out versi kernel dan command line
       Start output ke console
       Aktifkan interupsi
       Kalibrasi delay loop
       Call rest_init(), yang akan melakukan:
           Start kernel thread untuk menjalankan function init()
           Masuk ke idle loop
   init() akan melakukan:
       Start processor lainnya (di mesin SMP)
       Start subsystem device
       Mount root filesystem
       Bebaskan kernel memory yang tidak digunakan
       Jalankan /sbin/init (atau /etc/init, atau ...)

Pada titik ini, userlevel init program sudah berjalan, yang akan menjalankan berbagai hal seperti start layanan jaringan dan jalankan getty (login program) pada console.

Kita dapat mengenali kapan sebuah subsistem di inisialisasi dari start_kernel() atau init() dengan menulis printk oleh kita dan melihat kapan printk dari subsistem tersebut muncul relatif terhadap printk kita. Contoh, kita ingin mengetahui kapan sound system ALSA di inisialisasi, tulis printk di awal start_kernel() dan init() dan cari kapan "Advanced Linux Sound Architecture [...]" di cetak relatif terhadap printk. Untuk mengerti lebih lanjut ada baiknya membaca cara menggunakan function printk() dalam hacking kernel.

Mencari berbagai hal di kernel source tree

Misalnya kita ingin mengerjakan sebuah driver, misalnya, USB driver. Mulai dari manakah kita untuk mencari USB code tersebut?

Pertama-tama, kita dapat mencoba menggunakan perintah find pada directory kernel pada top-level, sebagai berikut:

$ find . -name \*usb\*

Perintah ini akan mem-print setiap filename yang ada kata "usb" di tengahnya.

Cara lain, kita dapat mencoba untuk mencari string yang unik. String unik ini dapat berupa output dari printk(), nama file di /proc, atau string unik lainnya yang dapat di temukan di source code dari dari driver tersebut. Contoh, USB akan mengeluarkan message seperti:

usb-ohci.c: USB OHCI at membase 0xcd030000, IRQ 27

Oleh karenanya kita dapat mencoba untuk melakukan recursive grep untuk menemukan bagian dari to find printk yang menulis, misalnya:

$ grep -r "USB OHCI at" .

Cara lain, kita dapat mencari USB source code dengan melihat /proc. Jika kita ketik

find /proc -name usb

mungkin kita akan menemukan sebuah directory dengan nama /proc/bus/usb. Kita mungkin akan menemukan string unik untuk di grep sesudah membaca entry dari directory tersebut.

Jika semua gagal, kita dapat mencoba masuk ke dalam directory yang ada secara individual dan melihat file-nya, atau melihat hasil dari perintah

ls -lR

Kita dapat memperhatikan kalau-kalau filename yang keluar mungkin yang kita maksud. Tetapi cara ini sebaiknya adalah cara terakhir, sesudah semua cara menggunakan perintah find dan grep dilakukan.

Setelah kita menemukan source code yang kita inginkan / tertarik, kita dapat mulai membacanya. Membaca dan mengerti kernel Linux adalah pembelajaran tersendiri. Perlu di ingat bahwa semakin sering kita membaca kernel code, semakin memudahkan kita.

Selamat mengeksplorasi kernel!!

Referensi

Pranala Menarik

Secara Umum

Instalasi Linux

Compile Kernel

Remaster Linux

Sistem Operasi untuk Embedded

Membuat Firmware Sendiri

Flash ke Device

Beberapa Tip

Tuning Kernel

Tuning Kernel Scheduler

Tuning I/O Scheduler

Tuning Manajemen Memory

Android

Membuat Kernel Module

Monitoring & Benchmark