> For the complete documentation index, see [llms.txt](https://dev.tesa.or.th/tesa-developer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dev.tesa.or.th/tesa-developer/tesa-technical-contents/linux-os/zero-to-linux-hero/anatomy-of-linux-kernel-1/linux-kernel-principles.md).

# Linux Kernel Principles

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

* *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 ทั้งหมด ดังแสดงในรูปข้างล่าง

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

### Linux Kernel

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

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

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

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

#### Linux Versioning

โดยปกติทุก 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

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

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

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

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

{% 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>

\\
