Tag Archives: linux

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

สองตอนก่อนหน้าเป็นการพูดถึงสิ่งที่เกี่ยวข้องกับการทำงานระหว่างดีไวซ์ไดร์เวอร์และโปรแกรมฝั่งยูสเซอร์สเปซ ส่วนในตอนนี้เราจะพูดถึงการเชื่อมโยงทั้งสองส่วนเข้าหากัน ซึ่งจะทำให้เราเข้าใจภาพรวมทั้งหมด และเป็นพื้นฐานสู่การเขียนและรวมถึงการดีบัก ลินุกซ์ดีไวซ์ไดร์เวอร์ การอินเตอร์เฟสระหว่างดีไวซ์ไดร์เวอร์และโปรแกรมฝั่งยูสเซอร์สเปซ เนื่องจากว่าเหตุผลเรื่องความปลอดภัยของระบบลินุกซ์แนวคิดเรื่องการติดต่อกับอุปกรณ์บนระบบจึงต้องทำผ่านระบบแฟ้มซึ่งทำให้การควบคุมสิทธิในการเข้าถึงสามารถใช้รูปแบบเดียวกับไฟล์ทั่วๆไปได้ (permission) ข้อดีของวิธีนี้คือทำให้เข้าใจง่ายแยกหน้าที่ของส่วนต่างๆได้อย่างชัดเจน แต่ก็มีข้อเสียคือทำให้มีโอเวอร์เฮด(เวลา)ของการเข้าถึงของโปรแกรมฝั่งยูสเซอร์สเปซไปยังตัวอุปกรณ์ ซึ่งถ้าเทียบกับการเขียนโปรแกรมติดต่ออุปกรณ์แบบที่ไม่มีระบบปฎิบัติการจะเห็นว่าแบบหลังทำงานได้เร็วกว่า แต่โดยทั่วๆไปเวลาที่เสียไปส่วนนี้อาจไม่สนใจก็ได้หากไม่ใช่งานแบบเรียลไทม์ การทำงานผ่านระบบแฟ้มนี้ทำให้เรานำความรู้เกี่ยวกับการทำงานกับไฟล์ในภาษาซี มาใช้ได้ทันที เนื่องจากเหมือนกันเป๊ะ file operations open(),read(),write() และ close()

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

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

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

เกริ่นนำนิดหน่อย ตั้งใจจะเขียนเรื่อง การเขียนลินุกซ์ดีไวซ์ไดร์เวอร์ บนบอร์ด ราสเบอรรี่พาย มานานแล้ว แต่พอมาลองเขียนเอาจริงๆ ก็เริ่มรู้สึกว่าถ้าไม่มีการปูพื้นเรื่องที่เกี่ยวข้องให้ก่อน มือใหม่ที่พึ่งเริ่มศึกษาก็คงจะเข้าใจยากแน่ๆ และเรื่องที่จะเขียนนี้ก็คงไม่มีประโยชน์กับมือเก่าที่ได้ศึกษาโดยตรงกับ Textbook หรือ documentation อื่นๆที่มีอยู่แล้วในภาษาอังกฤษ เลยสรุปได้ว่าน่าจะเน้นไปที่เนื้อหาสำหรับมือใหม่ เพื่อที่จะเพิ่มจำนวนนักพัฒนาที่สามารถเข้าใจพื้นฐาน แล้วนำไปต่อยอดกันเองนะครับ

ความแตกต่างและหน้าที่ของไดเรคทอรี่ /proc และ /sys

แอดมินเคยได้รับคำถามเกี่ยวกับความแตกต่างและหน้าที่ของไดเรคทอรี่ /proc และ /sys ในตอนที่ไปสอนเรื่องลินุกซ์กับน้องๆ แล้วรู้สึกว่ายังอธิบายไม่ค่อยดีเท่าไหร่เนื่องจากตัวเองก็ยังมีคำถามในใจหลายข้อ เพราะบางอย่างที่มีอยู่ใน /sys ก็มีอยู่ใน /proc โดยที่มีโครงสร้างใกล้เคียงกัน ทำให้ไม่เข้าใจว่าจะมีซ้ำซ้อนไปทำไม แม้ว่าตัวเองจะเคยเขียนไดร์เวอร์ที่ใช้ sysfs ติดต่อกับโมดูล แต่ก็ยังไม่เข้าใจทั้งหมด จนกระทั่งได้ไปเจอคำตอบนี้จาก stackexchange นี้เข้าซึ่งคิดว่าอธิบายน่าจะครบถ้วนเลยรวมมาให้คนที่สนใจเหมือนกัน