libusb เข้าถึงสิ่งเคอร์เนลอย่างไร


10

จากสิ่งที่ฉันเข้าใจ:

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

ดังนั้นวิธีการlibusbบรรลุ USB ระดับต่ำได้อย่างไร

คำตอบ:


10

Libusb เป็นไลบรารีเพื่อโต้ตอบกับอุปกรณ์ USB ในลักษณะเดียวกับที่ curses เป็นไลบรารีเพื่อโต้ตอบกับเทอร์มินัลข้อความ ALSA (ส่วนประกอบ libasound ที่แม่นยำยิ่งขึ้น) เป็นไลบรารีเพื่อโต้ตอบกับอุปกรณ์ audi เป็นต้นเคอร์เนลจัดการกับการโต้ตอบของฮาร์ดแวร์ มันมีแฟ้มอุปกรณ์ที่สามารถเปิดการใช้งานในการโต้ตอบกับฮาร์ดแวร์ผ่านread, writeและสายระบบioctl

ioctl เป็นการเรียกระบบ: อนุญาตให้แอปพลิเคชัน (รหัสระดับผู้ใช้) สามารถส่งคำขอที่ประมวลผลโดยเคอร์เนล

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

  • สัญญาณไฟฟ้าบนบัสทำให้เกิดเหตุการณ์บนคอนโทรลเลอร์ USB
  • คอนโทรลเลอร์ USB จะเพิ่มสัญญาณขัดจังหวะบนโปรเซสเซอร์หลัก
  • โปรเซสเซอร์ดำเนินการตัวจัดการขัดจังหวะในเคอร์เนลระบบปฏิบัติการ
  • ประกาศเคอร์เนลว่ากระบวนการที่เป็นอยู่ในปัจจุบันในการปิดกั้นread, writeหรือioctlโทรระบบแฟ้มอุปกรณ์และสาเหตุที่ระบบโทรกลับ
  • ในกระบวนการลงจอดของผู้ใช้เมื่อการเรียกระบบส่งคืนรหัสไลบรารีจะถูกดำเนินการ
  • รหัสห้องสมุดดำเนินการฟังก์ชั่นการโทรกลับที่ลงทะเบียนโดยโปรแกรมเมอร์โปรแกรม

ดังนั้นไม่จำเป็นต้องเขียนไดรเวอร์อุปกรณ์สำหรับอุปกรณ์ usb? (ยกเว้นกรณีที่อาจจะสำหรับการเพิ่มประสิทธิภาพความเร็ว)
โทมัส

@Thomas คุณต้องเขียนเคอร์เนลไดรเวอร์หากคุณต้องการเชื่อมต่อกับเฟรมเวิร์กที่ไม่ขึ้นกับการขนส่ง: แป้นพิมพ์, ที่เก็บข้อมูล, อีเธอร์เน็ต ฯลฯ มิฉะนั้นฉันคิดว่าคุณต้องใช้ไดรเวอร์หากความล่าช้าของโปรแกรม userland สูงเกินไป
Gilles 'หยุดความชั่วร้าย'

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

@ โทมัสฉันไม่รู้ว่า libusb สามารถรับมือกับทุกด้านของโปรโตคอล USB ได้หรือไม่ แต่โดยหลักการแล้วใช่ โปรแกรม userland สามารถสื่อสารกับอุปกรณ์แบบอนุกรม RS232 ใด ๆ /dev/ttyS*ผ่านทาง USB เป็นหลักการเดียวกันเท่านั้นเร็วขึ้นและซับซ้อนมากขึ้น
Gilles 'หยุดชั่วร้าย'

3

Linux ใช้วงแหวนสองวง 0 เรียกว่าระดับเคอร์เนลและแหวน 3 เรียกว่าระดับผู้ใช้ การเชื่อมต่อจากผู้ใช้ไปยังเคอร์เนลเสร็จสิ้น (ตามที่ได้กล่าวไปแล้ว) ผ่าน syscalls ระหว่างพวกเขาเป็นห้องสมุดเท่าที่เห็นจากผู้ใช้ ดังนั้นการเข้าถึงเคอร์เนลระดับต่ำที่สุดจึงถูกนำไปใช้ในไลบรารีเพื่อเหตุผลด้านความมั่นคงความปลอดภัยการซิงโครไนซ์การบันทึกระยะห่างและอื่น ๆ เคอร์เนลขับมีอินเตอร์เฟซที่แตกต่างเพื่อ userland นี้ (IOCTL, sysfs ซ็อกเก็ต, ตัวอักษรและบล็อกอุปกรณ์และอื่น ๆ ) ผู้ใช้พื้นที่เชื่อมต่อ ดังนั้นหากคุณต้องการคุณสามารถใช้การเข้าถึงเคอร์เนลไดร์เวอร์ได้ด้วยตัวเองโดยไม่ต้องใช้ไลบรารีหรือคอมไพล์ไบนารีของคุณได้ง่ายขึ้นด้วยไลบรารีที่ลิงก์แบบสแตติก

จุดเริ่มต้นที่ดีคือการอ่านแหล่ง libusb พวกเขามีเอกสารที่ดี


0

มันใช้syscalls (2)และไฟล์อุปกรณ์ที่จัดทำโดยเคอร์เนล ( /dev/bus/usb/*)


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