2 คะแนน โดย GN⁺ 2024-07-28 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

บทนำ

ผู้เขียน

  • 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 ความคิดเห็น

 
GN⁺ 2024-07-28
ความคิดเห็นบน Hacker News
  • มีความเห็นว่า ตัวอย่าง "Detecting button presses" ทำได้ยากเพราะต้องบิลด์โมดูลสำหรับ RPi
    • qemu เป็นวิธีที่ดีในการลองทำ kernel hacking
  • มีความเห็นว่า Linux Foundation ควรสนับสนุนการอัปเดตหนังสือ LDD (linux device driver) และหนังสือ Linux kernel
  • มีการแชร์ประสบการณ์จากผู้ใช้ที่บอกว่าอ่านครั้งแรกเมื่อ 22 ปีก่อน
  • มีข่าวว่าอัปเดตล่าสุดของหนังสือ The Linux Memory Manager เกิดขึ้นเมื่อต้นเดือนกรกฎาคม และตอนนี้กำลังอยู่ระหว่างการแก้ไข
  • มีคำถามทั่วไปเกี่ยวกับการเขียนโปรแกรม Linux kernel เช่น การแฮ็ก file system หรือ memory management
    • เคยมีหนังสือ "Linux Kernel Development" ของ Robert Love แต่คงไม่ได้รับการอัปเดตอีกแล้ว
  • มีคำชมสำหรับบทสอนแบบละเอียดและเน้นลงมือปฏิบัติเกี่ยวกับการบิลด์ kernel module โดยตรง
  • มีคำถามว่าผู้เขียนใช้ LLM ในการเขียนหรือปรับปรุงข้อความหรือไม่