# 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>

\\


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
