ไดรเวอร์อุปกรณ์ใน Linux เป็นโปรแกรม / กระบวนการหรือเป็นเพียงไลบรารีหรือไม่


23

ไดรเวอร์อุปกรณ์เป็นโปรแกรมที่ทำงานด้วยตัวเองหรือเป็นเพียงไลบรารี (กลุ่มของฟังก์ชั่น) ที่โหลดในหน่วยความจำและโปรแกรมสามารถเรียกใช้หนึ่งในฟังก์ชั่นของมัน (ดังนั้นจึงไม่ได้ทำงานด้วยตัวเอง)

และถ้าเป็นโปรแกรมจะมี ID กระบวนการดังนั้นฉันสามารถยกเลิกไดรเวอร์อุปกรณ์ได้เช่นเดียวกับที่ฉันสามารถยกเลิกกระบวนการอื่นได้หรือไม่?


1
คุณสามารถ "ยกเลิกการโหลด" ไดรเวอร์ด้วย rmmod แต่ก็ต่อเมื่อไม่ได้ใช้งาน
pjc50

คำตอบ:


35

บน Linux ไดรเวอร์อุปกรณ์จำนวนมากเป็นส่วนหนึ่งของเคอร์เนลไม่ใช่ไลบรารีหรือกระบวนการ โปรแกรมโต้ตอบกับเหล่านี้โดยใช้แฟ้มอุปกรณ์ (โดยทั่วไปใน/dev) และระบบต่างๆที่เรียกเช่นopen, read, write, ioctl...

อย่างไรก็ตามมีข้อยกเว้น ไดรเวอร์อุปกรณ์บางตัวใช้การผสมผสานของ stubs ของเคอร์เนลไดรเวอร์และไลบรารีพื้นที่ผู้ใช้ ( เช่นใช้ UIO) คนอื่น ๆ จะดำเนินการทั้งหมดในพื้นที่ผู้ใช้มักจะอยู่ด้านบนของอินเตอร์เฟซที่กระแทกบิต (UART หรือ GPIO) ในทั้งสองกรณีพวกเขากำลังอยู่ระหว่างดำเนินการดังนั้นคุณจะไม่เห็นกระบวนการแยกต่างหากเพียงกระบวนการที่ใช้อุปกรณ์

ในการ "ยุติ" ไดรเวอร์อุปกรณ์คุณจะต้องหยุดกระบวนการทั้งหมดที่ใช้แล้วลบโมดูลเคอร์เนล (สมมติว่ามันสร้างเป็นโมดูล) และเลือกโมดูลอื่น ๆ ที่ใช้และไม่มีความจำเป็นอีกต่อไป คุณสามารถแสดงรายการโมดูลในระบบของคุณโดยใช้lsmodและยกเลิกการโหลดโมดูลเหล่านั้นโดยใช้rmmodหรือmodprobe -rทั้งสองอย่างจะใช้งานได้ก็ต่อเมื่อlsmodระบุว่าไม่มีผู้ใช้


2
หากคุณกล้าพอและเคอร์เนลของคุณถูกคอมไพล์ด้วยCONFIG_MODULE_FORCE_UNLOADคุณสามารถลองrmmod -fบังคับให้ยกเลิกการโหลดโมดูลที่ใช้งานอยู่ / ไม่ได้ออกแบบมาเพื่อลบ / ฯลฯ ซึ่งสิ่งนี้นอกจากจะทำให้เคอร์เนลอยู่ในสถานะที่ไม่น่าเชื่อถือ ยังทำให้เคอร์เนลมัวหมอง
Ruslan

9

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

ในบางกรณีลีนุกซ์ให้เฉพาะโปรโตคอลทั่วไปที่เขียนด้วยซอฟต์แวร์โดยที่ "ไดรเวอร์" ที่แท้จริงเป็นโครงสร้างอุปกรณ์ นั่นคือการกำหนดค่าพารามิเตอร์ฮาร์ดแวร์และซอฟต์แวร์ที่ใช้ในการสร้างไดรเวอร์

โดยทั่วไปแล้วอินเตอร์เฟสและโปรโตคอลของไดรเวอร์ที่ใช้พูดจะใช้งานโดยใช้โมดูลเคอร์เนลซึ่งโหลดตามความต้องการที่กำหนดโดยแผนผังอุปกรณ์หรือกฎ udev โมดูลเคอร์เนลไม่ได้อยู่ในกระบวนการหรือไลบรารีที่เข้มงวดที่สุด

ไลบรารีเป็นเพียงชุดโค้ดคงที่ที่สามารถโหลดลงในกระบวนการใดก็ตาม ระบบปฏิบัติการสมัยใหม่โหลดไลบรารีเหล่านี้ลงในหน่วยความจำที่ใช้ร่วมกัน กระบวนการสามารถลิงก์กับไลบรารีที่แบ่งใช้จำนวนเท่าใดก็ได้

กระบวนการเป็นโปรแกรมที่กำลังทำงานซึ่งโปรแกรมระบบหรือเคอร์เนลได้จัดสรรทรัพยากรเช่นหน่วยความจำระบบและเวลาซีพียู โมดูลเคอร์เนลอาจหรืออาจไม่เป็นไปตามรูปแบบนี้ด้วยตนเอง แต่ไม่ว่าจะถือเป็นกระบวนการ defacto ภายใต้ Linux

ดังนั้นเพื่อตอบคำถามของคุณผู้ขับขี่ไม่จำเป็นต้องดำเนินการ แต่อาจเป็นไปได้ ในขณะที่รหัสสามารถมีอยู่ในไลบรารีไดรเวอร์ยังคงโหลดลงใน memery ผ่านทางโปรแกรมไม่ว่าจะเป็นเคอร์เนลในรูปแบบของโมดูลเคอร์เนลหรือกระบวนการ userland

มันกลายเป็นข้อโต้แย้งเชิงความหมายมากกว่าเมื่อพิจารณาว่ายอดรวมของไดรเวอร์จริงๆ คุณสามารถบอกได้ว่าไดรเวอร์นั้นเป็นโปรแกรมเสมอ แต่บางครั้งมันก็ไม่เหมือนในกรณีที่ต้นไม้ของอุปกรณ์นั้นมันอาจเป็นกระบวนการ userland, ไฟล์ต้นไม้อุปกรณ์, กฎ udev และโมดูลเคอร์เนลที่กระบวนการและโมดูลทั้งสองใช้ไลบรารีทั้งหมด ตรรกะของไดรเวอร์


0

โปรแกรมควบคุมอุปกรณ์ลินุกซ์เป็นหลักห้องสมุดเคอร์เนลพื้นที่ การโทรนั้นส่วนใหญ่จะเริ่มต้นโดยไดรเวอร์ระดับสูงกว่าหรือโดยกระบวนการพื้นที่ผู้ใช้ที่ใช้มัน

มีข้อยกเว้นเพียงเล็กน้อยจากสิ่งนี้:

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

ในระบบอื่น ๆ เช่นเดียวกับใน GNU Hurd ไดรเวอร์นั้นเป็น daemons เป็นหลักโดยที่กระบวนการสามารถโต้ตอบกันได้ ใน Linux ไดรเวอร์คือไลบรารี แนวคิดทั้งสองมีข้อดีและข้อเสียของมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.