เกริ่นนำนิดหน่อย
ตั้งใจจะเขียนเรื่อง การเขียนลินุกซ์ดีไวซ์ไดร์เวอร์ บนบอร์ด ราสเบอรรี่พาย มานานแล้ว แต่พอมาลองเขียนเอาจริงๆ ก็เริ่มรู้สึกว่าถ้าไม่มีการปู
จั่วหัวว่าเป็นการศึกษาด้วยบอร์
เคอร์เนลสเปซ และ ยูสเซอร์สเปซ (Kernel space & User space)
ความเข้าใจพื้นฐานเรื่องนึงที่เ
เคอร์เน
ยูสเซอร์สเปซ คือบริเวณของหน่วยความจำที่โปรแกรมฝั่งยูสเซอร์สเปซทำงานอยู่ ซึ่งเป็นตำแหน่งหน่วยความจำเสมือน (Virtual memory) ซึ่งถูกจัดสรรโดยเคอร์เนล หน่วยความจำส่วนนี้ อาจถูกย้ายไปเก็บใน swap space บนดิสก์ ขึ้นกับระดับความสำคัญที่ระบบปฏิบัติการ ตัดสินใจ
โปรแกรมฝั่งเคอร์เนลสเปซ คือโค้ดที่ทำหน้าที่ติดต่อและคว
โปรแกรมฝั่งยูสเซอร์สเปซ คือโค้ดที่ทำหน้าติดต่อกับผุ้
โดยปกติการพัฒนาซอฟแวร์บนลินุกซ์ส่วนใหญ่
เหตุผลที่ต้องแบ่งเมมโมรี่สเปซออกเป็นสองส่วนที่ว่า แอดมินคิดว่ามีสองเหตุผลหลักๆ
ความปลอดภัยของระบบ เนื่องจากว่า โค้ดที่ทำงานอยู่ในเคอร์เนลสเปซนั้นสามารถเข้าถึงตำแหน่งหน่วยความจำจริง (Physical memory)ได้ทั้งหมด ดังนั้นหากนักพัฒนาเขียนโค้ดไม่รอบคอบ ข้อผิดพลาดนั้นก็สามารถทำให้ระบบล่มได้ รวมถึงความตั้งใจที่จะเข้าไปเอาข้อมูลของผู้ใช้งานคนอื่นที่อยู่ในระบบเดียวกันด้วย ด้วยเหตุนี้การแยกส่วนควบคุมทรัพยากรของระบบ ออกจากโปรแกรมแอพพลิเคชั่นที่อาจจะมาเพิ่มเข้าไปในระบบทีหลัง จึงสามารถเพิ่มระดับความปลอดภัยของข้อมูลและความน่าเชื่อถือของระบบได้ (อย่าลืมว่า ลินุกซ์นั้นสามารถสเกลได้ตั้งแต่ระบบเล็กๆจนไปถึงระบบใหญ่)
ความยืดหยุ่นสำหรับการพัฒนา การแยกส่วนของการใช้งานหน่วยความจำแบบนี้ จะทำให้การจำกัดขอบเขตของแอพพลิเคชั่นนั้นชัดเจน ทำให้การเขียนโค้ดเพียงครั้งเดียวแล้วสามารถนำไปใช้งานในระบบปฏิบัติการอื่นนอกจากลินุกซ์ทำได้ง่ายมากขึ้น
พื้นฐานการทำงานของระบบแฟ้มอุปกรณ์และลินุกซ์ดีไวซ์ไดร์เวอร์
ระบบปฏิบัติการลินุกซ์เป็
แนวคิดเรื่องนึงที่เกี่ยวข้องกั
การออกแบบระบบลินุกซ์ดีไวซ์ไดร์
Device files หรือ แฟ้มอุปกรณ์ (ในภาษาไทยดูไม่คุ้นเท่าไหร่) โดยปกติจะถูกรวบรวมไว้ภายใต้ /dev/ ของระบบแฟ้มของลินุกซ์ จัดเป็นไฟล์ชนิดพิเศษของระบบลินุ
drwxr-xr-x 8 root root 160 Nov 24 09:02 disk drwxr-xr-x 2 root root 140 Nov 24 09:02 dri crw------- 1 root root 247, 0 Nov 24 09:02 drm_dp_aux0 lrwxrwxrwx 1 root root 3 Nov 24 09:02 dvd -> sr0 lrwxrwxrwx 1 root root 3 Nov 24 09:02 dvdrw -> sr0 crw------- 1 root root 10, 61 Nov 24 09:02 ecryptfs crw-rw---- 1 root video 29, 0 Nov 24 09:02 fb0 lrwxrwxrwx 1 root root 13 Nov 24 09:02 fd -> /proc/self/fd crw-rw-rw- 1 root root 1, 7 Nov 24 09:02 full crw-rw-rw- 1 root root 10, 229 Nov 24 09:02 fuse crw------- 1 root root 246, 0 Nov 24 09:02 hidraw0 crw------- 1 root root 246, 1 Nov 24 09:02 hidraw1 crw------- 1 root root 246, 2 Nov 24 09:02 hidraw2 crw------- 1 root root 10, 228 Nov 24 09:02 hpet drwxr-xr-x 2 root root 0 Nov 24 09:02 hugepages crw------- 1 root root 10, 183 Nov 24 09:02 hwrng crw------- 1 root root 89, 0 Nov 24 09:02 i2c-0 crw------- 1 root root 89, 1 Nov 24 09:02 i2c-1 crw------- 1 root root 89, 2 Nov 24 09:02 i2c-2 crw------- 1 root root 89, 3 Nov 24 09:02 i2c-3 crw------- 1 root root 89, 4 Nov 24 09:02 i2c-4 crw------- 1 root root 89, 5 Nov 24 09:02 i2c-5 crw------- 1 root root 89, 6 Nov 24 09:02 i2c-6 |
กลุ่มที่ขึ้นต้นด้วย b และ c คือ device files แบ่งเป็น block device (b) และ character device (c)
แนวคิดเรื่อง block device และ character device ก็นำมาจากยูนิกซ์เหมือนกัน สองรูปแบบนี้แตกต่างกันคือเรื่อ