การศึกษาลินุกซ์เคอร์เนล ด้วย Raspberry Pi: พื้นฐานการทำงานของลินุกซ์ดีไวซ์ไดร์เวอร์ (ตอนที่ 2)

By | December 14, 2016

จากตอนที่แล้วที่เราพูดถึง device file โดยเริ่มทำความรู้จักกับ block device และ character device ในตอนนี้ เราก็จะมาทำความเข้าใจถึงคุณสมบัติพิเศษอื่นๆ ของไฟล์ชนิดนี้

หมายเลขหลัก และหมายเลขรอง ของอุปกรณ์ (Device major and minor number)

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

หมายเลขหลัก(major number) และหมายเลขรอง(minor number)ของอุปกรณ์ คือเลขสองชุดที่คั่นด้วยเครื่องหมายคอมม่า ดังที่แสดงในตารางด้านบน ใช้สำหรับเป็นตัวแทนของอุปกรณ์ในฝั่งเคอร์เนลสเปซ เนื่องจากว่าการทำงานกับตัวเลขนั้น โปรแกรมคอมพิวเตอร์จะทำงานได้ง่ายกว่า การทำงานกับตัวอักษร ลองนึกถึงการเขียนโค้ดให้ไล่เช็คกรณีที่ ต้องการหาว่าไดร์เวอร์ตัวไหนต้องมาทำงานให้กับอุปกรณ์นั้น คงจะพอเห็นภาพว่า การค้นหาด้วยตัวเลขมันเหมาะในแง่ของการเขียนโปรแกรมกว่าการค้นหาด้วยตัวอักษรยังไง เรื่องนี้รวมถึงความเร็วในการทำงานของโค้ดด้วย ส่วนในมุมของผู้ใช้ หากต้องมาจดจำว่าอุปกรณ์ใดคือเลขอะไร ก็คงไม่เหมาะเท่าไร เนื่องจากสมองมนุษย์นั้นจดจำตัวอักษรได้ดีกว่าตัวเลข

โดยปกติ หมายเลขหลัก(major number) จะถูกใช้เพื่อระบุชนิดของอุปกรณ์ และหมายเลขรอง(minor number) จะถูกใช้ระบุลำดับที่ของอุปกรณ์ชนิดนั้น แต่ในบางอุปกรณ์ เราก็สามารถพบลักษณะการใช้หมายเลขรอง(minor number) ในการระบุฟังก์ชั่นการทำงานของอุปกรณ์นั้น ตัวอย่างเช่นแยกการอ่านและการเขียนของ raw magnetic tape บน Solaris Unix ด้วยเลขคู่,คี่ ของหมายเลขรอง(minor number) หรือการแยกชนิดของการเข้าถึงอุปกรณ์แบบ block device และ character device ด้วยเลขคู่,คี่ ของ scsi disk

System Calls (การเรียกระบบ)

system calls คือ บริการที่เคอร์เนลเตรียมไว้ให้โปรแกรมฝั่งยูสเซอร์สเปซเรียกใช้ ซึ่งอาจเรียกได้ว่าการทำงานเกือบทุกอย่าง โปรแกรมฝั่งยูสเซอร์สเปซต้องร้องขอไปที่เคอร์เนลทั้งหมด เนื่องจากเคอร์เนลเป็นเจ้าของทรัพยากร

การเกิด system calls หรือการเรียกระบบ นี้ จะเกิดขึ้นมากมายหลายครั้งตลอดการทำงานของโปรแกรมจนกระทั่งโปรแกรมจบการทำงาน จนอาจมองได้ว่าเป็นโอเวอร์เฮดของระบบลินุกซ์ แต่ก็เป็นสิ่งที่เลี่ยงไม่ได้เนื่องจากความต้องการเรื่องการจัดการสิทธิและความปลอดภัยของระบบ รวมถึงการจัดลำดับความสำคัญของงานที่เกิดขึ้นไนระบบ ซึ่งทำให้การทำงานผ่าน system calls นั้นเป็นสิ่งที่ยอมรับได้ (ซึ่งถ้าซีพียูไม่ได้ทำงานเร็วแบบปัจจุบันนี้ วิธีนี้คงไม่เวิรค์)

ในการเขียนโปรแกรมฝั่งยูสเซอร์สเปซ เราไม่จำเป็นต้องเขียนฟังก์ชั่นให้เรียกใช้ system calls ตรงๆ เนื่องจากตัวไลบรารี่ glibc ทำหน้าที่ติดต่อกับเคอร์เนลอยู่แล้ว นอกเสียจากว่าเราต้องการสร้างชุดไลบรารี่ของเราขึ้นมาเอง หรือมีเหตุให้ต้องไปแก้ไขการทำงานส่วนนี้

ส่วนในการเขียนลินุกซ์ดีไวซ์ไดร์เวอร์ เราก็ไม่จำเป็นต้องเขียนฟังก์ชั่นให้รองรับการเรียกจาก system calls ตรงๆ เพราะว่าลินุกซ์เคอร์เนลได้เตรียม การทำงานส่วนนี้ไว้ให้เราเรียบร้อยแล้ว (Kernel facilities) ส่วนใหญ่จะเป็นการสร้างจุดเชื่อมโยงการรับส่งงานกัน รายละเอียดตรงส่วนนี้ จะยกไปพูดถึงในตอนลงมือเขียนโค้ดอีกทีหนึ่ง ในตอนนี้ขอให้เข้าใจก่อนว่า system calls จะเป็นตัวเชื่อมระหว่าง โปรแกรมฝั่งยูสเซอร์สเปซไปสู่เคอร์เนลเพื่อที่จะส่งต่อไปยังดีไวซ์ไดร์เวอร์ของเราอีกทีหนึ่

ตัวอย่างรายชื่อ system calls ทั้งหมดในระบบลินุกซ์ http://man7.org/linux/man-pages/man2/syscalls.2.html

Leave a Reply

Your email address will not be published. Required fields are marked *