# Linux Kernel Principles

เคอร์เนล (Kernel) สามารถแยกออกมาได้ 3 ประเภท ได้แก่&#x20;

* *Monolithic kernel* เช่น Linux Kernel, MS-DOS, Microsoft Windows 9x Series
* *Micro kernel* เช่น AIX, AmigaOS, Android OS, Haiku, L4 microkernel family เป็นต้น
* *Hybrid kernel* เช่น BeOS kernel, NetWare kernel, ReactOS kernel, NT kernel Windows NT kernel (Windows 2000/Windows XP/Windows 2003/Windows Vista), 8.XNU kernel (ใช้ใน Mac OS X) เป็นต้น

และเป็นที่ทราบกันดีว่าลีนุกซ์คอร์เนลโดยส่วนใหญ่นั้นจะเป็นชนิด monolithic kernel ซึ่งหมายถึงหน้าที่หลักโดยส่วนใหญ่ของระบบปฏิบัติการจะถูกเรียกผ่าน Kernel ทั้งหมด ดังแสดงในรูปข้างล่าง

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2Ftd6CF4WogFLIQA0x0Hns%2FMonolithic%20Kernel.png?alt=media&#x26;token=d341ea0c-8d01-4bf3-a367-aa14fc2dee08" alt=""><figcaption><p>แสดงการรายละเอียดการทำงานของ Monolithic Kernel</p></figcaption></figure>

แตกต่างจาก Micro Kernel ที่บางส่วนของระบบปฏิบัติการยังคงทำใน Kernel เช่น การสื่อสารระหว่างโปรเซส (inter-process communication) การจัดลำดับงานของอุปกรณ์อินพุต/เอาท์พุต (basic input/output scheduling) การจัดการหน่วยความจำ (memory management) ส่วนหน้าที่อื่นๆจะทำภายนอก Kernel ตัวอย่างเช่น drivers, network stack, file systems&#x20;

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2Fl97RFi3T0dqJxMQZT9nh%2FMicro%20Kernel.png?alt=media&#x26;token=8c6a1c06-4534-4703-94b0-295046f4e1a6" alt=""><figcaption><p>แสดงการรายละเอียดการทำงานของ Micro Kernel</p></figcaption></figure>

### Linux Kernel

ลีนุกซ์คอร์เนลซึ่งเป็นตัวกลางสำคัญของระบบปฏิบัติการลีนุกซ์ในการติดต่อระหว่างฮาร์ดแวร์และซอฟต์แวร์ โดยฮาร์ดแวร์นั้นหมายถึงอุปกรณ์ต่างๆภายในและอุปกรณ์รอบข้างเครื่องคอมพิวเตอร์ ตัวอย่างเช่น หน่วยประมวลผลกลาง หน่วยความจำ การ์ดแสดงผล ฮาร์ดดิสก์ อุปกรณ์อินพุตและเอาท์พุต เมาส์ คีย์บอร์ด เป็นต้น สำหรับซอฟแวร์นั้นประกอบไปด้วยโปรแกรมของระบบปฏิบัติการและโปรแกรมประยุกต์ต่างๆ โดยภายใน Kernel จะประกอบไปด้วย 2 ส่วนสำคัญคือ Kernel Module และ Device Driver ทั้งสองจะทำหน้าที่ในการดูแลจัดการการร้องขอที่เกิดขึ้นจากฮาร์ดแวร์และซอฟต์แวร์ แล้วทำการประมวลผลข้อมูลในเบื้องต้นเพื่อส่งต่อให้ระบบปฏิบัติการต่อไป เพื่อให้บริหารจัดการการใช้งานทรัพยากรทั้งหมดได้อย่างมีระบบ

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FSQrVx9xEtZMyD7t05MFi%2FLinux%20Kernel%20FLow.png?alt=media&#x26;token=be326802-368a-4c54-a9b0-9bf7b21eff1b" alt=""><figcaption><p>แสดงการสื่อสารระหว่างโปรแกรมในระบบปฏิบัติการและอุปกรณ์</p></figcaption></figure>

จุดเด่นสำคัญอีกจุดหนึ่งคือลีนุกซ์คอร์เนลสามารถรองรับสถาปัตยกรรมที่มีอยู่ตั้งแต่ในอดีตจนถึงปัจจุบัน ซึ่งสามารถดูรายชื่อได้จากไดเรกทอรี `/arch` โดยสามารถแยกเป็นกลุ่มสถาปัตยกรรมได้ 2 แบบคือแบบ 32 บิต เช่น arm, avr32, blackfin, m68k, microblaze, mips, score, sparc, um, x86, powerpc และกลุ่มสถาปัตยกรรมแบบ 64 บิต เช่น alpha, arm64, ia64, sparc64, tile, x86\_64, powerpc&#x20;

รายละเอียดของแต่ละสถาปัตยกรรมเหล่านี้นักพัฒนาสามารถเข้าไปอ่านเพิ่มเติมได้จากไดเรกทอรี `arch/<arch>/Kconfig`, `arch/<arch>/README` หรือในไดเรกทอรี `Documentation/<arch>/` นอกจากนั้นลีนุกซ์คอร์เนลยังถูกปรับปรุงโค้ดภายใน ให้ทำงานได้อย่างมีประสิทธิภาพ และมีความยืดหยุ่นสูงกับสถาปัตยกรรมที่หลากหลายอย่างต่อเนื่องและรองรับการเข้ากันได้กับมาตราฐานฮาร์ดแวร์รุ่นใหม่ๆแต่ยังคงได้รับการควบคุมจากผู้เชี่ยวชาญที่ดูแลซอร์สโค้ดจากทั่วโลกเพื่อไม่ให้ใครแอบซ่อนโค้ดที่ไม่พึงประสงค์หรือสร้างความไม่ปลอดภัยให้กับระบบโดยรวม&#x20;

สำหรับนักพัฒนาระบบสมองกลฝังตัวสามารถที่จะเลือกใช้ฟังก์ชั่นบางตัวในลีนุกซ์คอร์เนลเพื่อให้เหมาะสมกับระบบฮาร์ดแวร์ที่มีอยู่บนบอร์ดสมองกลรวมทั้งสามารถเลือกโปรแกรมประยุกต์บางตัวที่ต้องการให้ทำงานอยู่ในบอร์ดสมองกลฝังตัวได้

#### Linux Versioning

&#x20;    โดยปกติทุก 2-3 ปี จะมีการออกรุ่นเสถียร (stable) ของลีนุกซ์คอร์เนลที่เป็นเลขคู่ เช่น 1.0.x, 2.0.x, 2.2.x, 2.4.x, 2.6.x, 3.0.x เมื่อมีการพัฒนาปรับปรุงฟังก์ชั่นใหม่ๆเข้าไปและมีการเปลี่ยนแปลงโค้ดชุดใหญ่ ก็จะออกเลขรุ่นโดยใช้เป็นเลขคี่ เช่น 2.1.x, 2.3.x, 2.5.x แต่สำหรับการปรับปรุงเปลี่ยนแปลงในระดับเล็กลงมา (Minor release) จะใช้เปลี่ยนเลขรุ่นหลักที่สาม เช่น 2.5.12, 2.6.39

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FzEUUhjPLCyk4O4FCgN9i%2FKernel%20releases.png?alt=media&#x26;token=9187f33a-618b-454d-8d99-2df55ea6c46b" alt=""><figcaption><p>แสดงการออกเลขเวอร์ชันของ Linux Kernel</p></figcaption></figure>

ตั้งแต่ปี ค.ศ. 2003 ถึง ค.ศ. 2011 รุ่น 2.6.x เป็นรุ่นที่มีระยะการใช้งานยาวนานมากเป็นพิเศษ อาจเนื่องมาจากช่วงนั้นเป็นยุคของการเติบโตและเปลี่ยนแปลงของคอมพิวเตอร์รวมทั้งอุปกรณ์อาร์ดแวร์ภายในเครื่องและอุปกรณ์ต่อพ่วงรอบข้างอย่างรุนแรงและยังเป็นการเกิดขึ้นของยุคคอมพิวเตอร์ชนิดพกพา เช่น Laptop, Netbook, Mobile Internet Device, Smart Phone, Tablet    &#x20;

ในที่สุดลีนุกซ์คอร์เนลรุ่น 3.0 ก็เริ่มประกาศเป็นทางการในเดือน กรกฏาคม ปีค.ศ. 2011 ซึ่งเป็นการเปลี่ยนขยับตัวเลขจาก 2.6 ไปสู่ 3.0 ที่ยาวนานแต่กลับไม่ได้เป็นการแก้ไขในระดับโค้ดมากแต่อย่างใด ขนาดภายในลีนุกซ์คอร์เนล 3.x จะมีขนาดโดยรวมอยู่ประมาณ 434 MB ด้วยจำนวนไฟล์ถึง 39,400 กว่าไฟล์ (มากกว่า 14,800,000 บรรทัด) ดังนั้นถ้าต้องการจะทำการบีบอัดให้มีขนาดเล็กที่สุดควรจะเป็นนามสกุล `.xz` (ลดลงไปได้ประมาณ 85.7%)&#x20;

กรณีการพัฒนาระบบสมองกลฝังตัวนั้นสามารถใช้ลีนุกซ์คอร์เนลเล็กที่สุดด้วยขนาดเพียง 1.3 MB เพื่อให้เหมาะสมกับข้อจำกัดของทรัพยากรภายในบอร์ดเมื่อเทียบกับเครื่องคอมพิวเตอร์ทั่วไป

#### โครงสร้างไดเรกทอรี และขนาดพื้นที่ของลีนุกซ์คอร์เนล 3.2

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FdjVX6rEUSBrNulFZdn0U%2FLinux%20Directory.png?alt=media&#x26;token=71ebebee-1082-41af-b2ed-555f19d334f3" alt=""><figcaption><p>แสดงโครงสร้างไดเรกทอรีของลีนุกซ์เคอร์เนล</p></figcaption></figure>

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FT4bAbE8ZfaO8q4ZBB0mz%2FLinux%20Code%20lines.png?alt=media&#x26;token=2005ab6e-646d-4a88-bd14-8e29c301187e" alt=""><figcaption><p>แสดงการเพิ่มขนาดการใช้พื้นที่ของลีนุกซ์เคอร์เนลตั้งแต่เวอร์ชัน 2.2 ถึง เวอร์ชัน 3.3</p></figcaption></figure>

{% hint style="info" %}
ตารางแสดงรายละเอียดโครงสร้างไดเรกทอรีของระบบปฏิบัติการลีนุกซ์ Kernel code
{% endhint %}

<table><thead><tr><th width="345">ไดเรกทอรี</th><th>รายละเอียด</th></tr></thead><tbody><tr><td>arch/&#x3C;architecture></td><td>Architecture specific code</td></tr><tr><td>arch/&#x3C;architecture>/include/asm</td><td>Architecture and machine dependent headers</td></tr><tr><td>arch/&#x3C;architecture>/mach-&#x3C;machine></td><td>Machine/board specific code</td></tr><tr><td>block</td><td>Block layer code</td></tr><tr><td>COPYING</td><td>Linux copyright conditions (GNU GPL)</td></tr><tr><td>CREDITS</td><td>Linux main contributors </td></tr><tr><td>crypto/</td><td>Cryptographic libraries</td></tr><tr><td>Documentation/</td><td>Kernel Documentation. Don’t miss!</td></tr><tr><td>drivers/</td><td>All device drivers expect sound ones (usb, pci..)</td></tr><tr><td>fs/</td><td>Filesystems (fs/ext3/, etc.)</td></tr><tr><td>include/</td><td>Kernel headers</td></tr><tr><td>include/linux</td><td>Linux kernel core headers</td></tr><tr><td>init/</td><td>Linux initialization (including main.c) </td></tr><tr><td>ipc/</td><td>Code used for process communication</td></tr><tr><td>Kbuild</td><td>Part of the kernel build system</td></tr><tr><td>Kernel/</td><td>Linux kernel core (very small!)</td></tr><tr><td>lib/</td><td>Misc library routines</td></tr><tr><td>MAINTAINERS</td><td>Maintain of each kernel part. Very Useful!</td></tr><tr><td>Makefile</td><td>Top Linux Makefile (Set arch and version)</td></tr><tr><td>mm/</td><td>Memory Management code</td></tr><tr><td>net/</td><td>Network support codes (not drivers)</td></tr><tr><td>README</td><td>Overview and Build Instructions</td></tr><tr><td>REPORTING-BUGS</td><td>Bug report instruction</td></tr><tr><td>samples/</td><td>Sample codes (markers, kprobes, kobjects)</td></tr><tr><td>scripts/</td><td>Scripts for internal or external uses</td></tr><tr><td>security/</td><td>Security Model Implementation (SELinux...)</td></tr><tr><td>sound/</td><td>Sound support codes and drivers</td></tr><tr><td>usr/</td><td>Code to generate an initramfs cpio archive.</td></tr></tbody></table>

<br>
