บทนำ
ผู้เขียน
- Linux Kernel Module Programming Guide เขียนขึ้นครั้งแรกโดย Ori Pomerantz สำหรับ Linux v2.2
- Peter Jay Salzman อัปเดตสำหรับ Linux v2.4
- Michael Burian ร่วมดูแลต่อสำหรับ Linux v2.6
- Bob Mottram อัปเดตตัวอย่างสำหรับเวอร์ชันหลัง Linux v3.8
- Jim Huang อัปเดตสำหรับ Linux เวอร์ชันล่าสุด (v5.0 ขึ้นไป) และแก้ไขเอกสาร LaTeX
คำขอบคุณ
- ผู้มีส่วนร่วมหลายคนได้ช่วยแก้ไขและเสนอแนะ
เคอร์เนลโมดูลคืออะไร?
- Linux kernel module คือส่วนของโค้ดที่สามารถโหลดและถอดออกจากเคอร์เนลแบบไดนามิกได้ตามต้องการ
- เคอร์เนลโมดูลช่วยขยายความสามารถของเคอร์เนลได้โดยไม่ต้องรีบูตระบบ
- หากไม่มีโมดูล ทุกครั้งที่ต้องการเพิ่มความสามารถใหม่จะต้องบิลด์เคอร์เนลใหม่และรีบูตระบบ
แพ็กเกจเคอร์เนลโมดูล
- Ubuntu/Debian:
sudo apt-get install build-essential kmod
- Arch Linux:
sudo pacman -S gcc kmod
เคอร์เนลของฉันมีโมดูลอะไรอยู่บ้าง?
- สามารถใช้คำสั่ง
lsmod เพื่อตรวจสอบโมดูลที่ถูกโหลดอยู่ในเคอร์เนลปัจจุบัน
- ตรวจสอบได้จากไฟล์
/proc/modules เช่นกัน
จำเป็นต้องดาวน์โหลดและคอมไพล์เคอร์เนลหรือไม่
- ไม่จำเป็นต้องดาวน์โหลดและคอมไพล์เคอร์เนลเพื่อทำตามคู่มือนี้
- การรันตัวอย่างบนดิสโทรสำหรับทดสอบจะปลอดภัยกว่า
ก่อนเริ่มต้น
- มีข้อควรระวังเกี่ยวกับการจัดการเวอร์ชันของโมดูล, การใช้ X Window System, SecureBoot เป็นต้น
เฮดเดอร์
- จำเป็นต้องติดตั้งไฟล์เฮดเดอร์ของเคอร์เนล
- Ubuntu/Debian:
sudo apt-get install kmod linux-headers-$(uname -r)
- Arch Linux:
sudo pacman -S linux-headers
- Fedora:
sudo dnf install kernel-devel kernel-headers
ตัวอย่าง
- ตัวอย่างทั้งหมดอยู่ในไดเรกทอรีย่อย examples ของเอกสาร
Hello World
โมดูลที่ง่ายที่สุด
- สร้างและคอมไพล์ไฟล์
hello-1.c
- อธิบายวิธีโหลดและถอดโมดูล
Hello และ Goodbye
- ตัวอย่างการใช้แมโคร
module_init และ module_exit
แมโคร __init และ __exit
- แมโคร
__init จะคืนหน่วยความจำเมื่อฟังก์ชันเริ่มต้นทำงานเสร็จ
- แมโคร
__exit จะละฟังก์ชันทิ้งหากโมดูลถูกฝังอยู่ในเคอร์เนล
ไลเซนส์และการจัดทำเอกสารโมดูล
- ใช้แมโคร
MODULE_LICENSE เพื่อกำหนดไลเซนส์ของโมดูล
- ตัวอย่างการใช้แมโคร
MODULE_AUTHOR, MODULE_DESCRIPTION
การส่งอาร์กิวเมนต์ทางบรรทัดคำสั่ง
- ใช้แมโคร
module_param เพื่อส่งอาร์กิวเมนต์ทางบรรทัดคำสั่งให้โมดูล
- ใช้แมโคร
MODULE_PARM_DESC เพื่อเพิ่มคำอธิบายของอาร์กิวเมนต์
โมดูลที่ครอบคลุมหลายไฟล์
- ตัวอย่างเคอร์เนลโมดูลที่แยกออกเป็นหลายไฟล์ซอร์ส
การบิลด์โมดูลสำหรับเคอร์เนลที่คอมไพล์ไว้ล่วงหน้า
- อธิบายวิธีบิลด์โมดูลสำหรับเคอร์เนลที่คอมไพล์ไว้ล่วงหน้า
สรุปโดย GN⁺
- คู่มือนี้เป็นแนวทางแบบครอบคลุมสำหรับการเขียนโปรแกรม Linux kernel module โดยครอบคลุมตั้งแต่แนวคิดพื้นฐานของเคอร์เนลโมดูลไปจนถึงหัวข้อขั้นสูง พร้อมตัวอย่างที่หลากหลาย
- เคอร์เนลโมดูลช่วยขยายความสามารถของเคอร์เนลได้โดยไม่ต้องรีบูตระบบ ซึ่งเป็นข้อได้เปรียบอย่างมากสำหรับนักพัฒนา
- ควรทำความเข้าใจและปฏิบัติตามข้อควรระวังต่าง ๆ เช่น การจัดการเวอร์ชันของโมดูลและ SecureBoot
- โครงการที่เกี่ยวข้อง ได้แก่ Linux Device Drivers, The Linux Programming Interface เป็นต้น
1 ความคิดเห็น
ความคิดเห็นบน Hacker News