โปรแกรมคุยกับไดรเวอร์อุปกรณ์ได้อย่างไร


12

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

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


สิ่งนี้อาจช่วยได้ iacoma.cs.uiuc.edu/~nakano/dd/drivertut3.htmlรวมถึงสิ่งนี้ en.m.wikibooks.org/wiki/Windows_Programming/…
RubberDuck

1
เล็กน้อยทั้งสองและมันแตกต่างจากระบบปฏิบัติการและประเภทของอุปกรณ์
whatsisname

คำตอบ:


12

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

ฉันจะข้ามความซับซ้อนของระบบปฏิบัติการที่ทันสมัยและใช้CP / Mซึ่งเป็นระบบปฏิบัติการไมโครคอมพิวเตอร์ที่พัฒนาขึ้นเมื่อ 45 ปีก่อนเป็นตัวอย่าง CP / M เป็นเค้กชั้นที่มีสามชั้น:

โปรแกรม. ชั้นบนสุดเป็นโปรแกรมที่ทำสิ่งที่มีประโยชน์ (ประมวลผลคำเล่น Space Invaders) โดยทำการคำนวณและ I / O สมมติว่าในบางจุดโปรแกรมต้องการแสดงตัวอักษร 'A' เพื่อให้ผู้ใช้เห็น CP / M จัดให้มีสิ่งที่เป็นนามธรรมที่เรียกว่าคอนโซลซึ่งเป็นที่ที่ผู้ใช้โต้ตอบกับโปรแกรมควรมองหา วิธีการทั่วไปในการส่งอักขระมีคำแนะนำในการประกอบน้อย:

LD C,2   ; Load 2 into register C
LD E,65  ; Load the ASCII code for 'A' into register E
CALL 5   ; Call CP/M's routine for getting things done

(หากคุณไม่คุ้นเคยกับสิ่งเหล่านี้การลงทะเบียนอาจถือได้ว่าเป็นตัวแปรที่อยู่ในโปรเซสเซอร์) เราจะไปถึงหมายเลขมายากล2และ5ประมาณหนึ่งนาที Takeaway ที่นี่เป็นที่โปรแกรมทั้งหมดรู้คือมีคอนโซลและมีวิธีการเขียนถึงมัน มันไม่รู้หรือสนใจอะไรเลยนอกจากนั้น นี่เป็นนามธรรมแรกของสองเรื่องที่ CP / M ใช้สำหรับ I / O

BDOS ที่อยู่5โปรแกรมที่เรียกว่าเป็นจุดเริ่มต้นสำหรับชั้นถัดไปที่ระบบปฏิบัติการขั้นพื้นฐานดิสก์หรือBDOS BDOS นำเสนอฟังก์ชั่นตัวเลขทั้งหมดที่เหมือนกับการสั่งซื้อตามหมายเลขจากเมนูร้านอาหาร คุณบอกว่าคุณต้องการเอาท์พุทของคอนโซลโดยโหลดCรีจิสเตอร์ด้วยหมายเลขฟังก์ชั่น ( 2สำหรับเอาท์พุทของคอนโซล) และEลงทะเบียนด้วยตัวละครที่จะส่ง เอาท์พุทของคอนโซลเป็นการทำงานที่ง่ายมากและ BDOS ไม่จำเป็นต้องทำอะไรมากไปกว่าการเรียกเลเยอร์ถัดไป

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

คุณอาจสงสัยว่าทำไมมีสอง abstractions (program-to-BDOS และ BDOS-to-BIOS) แทนที่จะเป็นเพียงหนึ่งเดียว คำตอบคือ CP / M และ BDOS ของมันสามารถให้ในรูปแบบไบนารีให้กับผู้ผลิตคอมพิวเตอร์พวกเขาจะเขียนไบออสที่กำหนดเองพร้อมไดรเวอร์อุปกรณ์สำหรับฮาร์ดแวร์ของพวกเขาโบลต์ทั้งสองเข้าด้วยกันและจัดส่งเป็น OS สำหรับระบบของพวกเขา นี่เป็นเรื่องใหญ่เพราะ BDOS ได้รับการดูแลโดยองค์กรหนึ่งและดังนั้นจึงเป็นปริมาณที่ผู้ใช้โปรแกรมรู้อยู่เสมอทำให้สามารถเรียกใช้แอพพลิเคชั่นเดียวกันบนฮาร์ดแวร์ที่หลากหลาย (ในขณะนั้น) นี่คือเหตุผลที่ระบบปฏิบัติการที่มีอยู่และเราไม่ได้เป็นเพียงแค่การเขียนโปรแกรมที่กระดิกนิ้วเล่นกับฮาร์ดแวร์โดยตรง

ทุกสิ่งที่ฉันอธิบายที่นี่ใช้กับระบบปฏิบัติการที่ทันสมัยเช่นกัน เช่น Unix, abstracts ทุกอย่างเป็นไฟล์ มันจะช่วยให้โปรแกรมชุดเดียวกันของสายระบบ ( open(), write(), close()ฯลฯ ) ในการสื่อสารไม่ว่าจะเป็นดิสก์ไดรฟ์หรือพอร์ตอนุกรม ชุดของการตัดสินใจและ abstractions มีความซับซ้อนมากขึ้น แต่ในที่สุดก็ยังคงลดลงเพื่อเลือกรหัสไดรเวอร์อุปกรณ์ที่ชั้นล่างสุดที่จะต้องทำงานเพื่อให้การดำเนินการเกิดขึ้น


ฉันไม่เคยดูรหัส CP / M มาก่อน (ก่อนหน้านี้นิดหน่อย ... ฉันเคยใช้คอมพิวเตอร์ CP / M แต่ไม่เคยเขียนรหัสสำหรับพวกเขา) แต่ฉันค่อนข้างแปลกใจกับการใช้call 5ที่นี่ จะไม่rst 8ได้มีประสิทธิภาพมากขึ้น (มันจะเสียสละหน่วยความจำ 3 ไบต์ที่ที่อยู่ปลายทาง แต่บันทึก 2 ทุกครั้งที่เรียกว่า ... )?
จูลส์

@Jules: CP / M ได้รับการพัฒนาสำหรับ 8080 ซึ่งมีโหมดการขัดจังหวะเพียงโหมดเดียวที่อุปกรณ์การขัดจังหวะจะทำให้คำสั่งไบต์เดียว (ปกติRST) บนบัสข้อมูล ฉันไม่สามารถพูดได้อย่างแน่นอน แต่อาจเป็นไปได้ว่ามีช่องไม่พอที่จะครอบคลุมความต้องการของอุปกรณ์ทั้งหมดรวมถึง DDT (ซึ่งใช้เพื่อทำให้จุดพักเกิดขึ้น) และใช้ช่องทางหนึ่งเพื่อเข้าสู่ BDOS .
Blrfl

อา. นั่นทำให้รู้สึกใช่ ประสบการณ์การพัฒนาของฉัน 8 บิตจะถูก จำกัด ให้เครื่องที่มีเพียงแหล่งที่มาขัดจังหวะเดียวเพื่อจะได้ไม่ต้องกังวลมากเกี่ยวกับสิ่งต่างๆ ... :)
จูลส์

คำถามด่วนกระบวนการนี้เกี่ยวข้องกับระบบปฏิบัติการ windows และเคอร์เนล windows อย่างไร หรือฉันควรตั้งคำถามใหม่สำหรับสิ่งนั้น
Jason

@Jason: Wikipedia มีหน้าที่อธิบายสถาปัตยกรรมและให้คำตอบ ทุกสิ่งที่ Microsoft ผลิตมาตั้งแต่ปี 1993 ใช้สถาปัตยกรรมนี้ มันเหมือนกันมากแค่เพิ่มเลเยอร์ในเค้ก
Blrfl

0

มีความเป็นไปได้ต่าง ๆ มากมาย:

  • สำหรับอุปกรณ์ที่ใช้กันทั่วไประบบปฏิบัติการมักจะรวม API ที่ไดรเวอร์ใช้และไลบรารีมาตรฐานของภาษาของคุณปรับใช้ ตัวอย่างทั่วไป: ระบบไฟล์เครื่องพิมพ์เครือข่ายเครื่องมือ MIDI
  • สำหรับอุปกรณ์ที่แปลกใหม่ผู้ผลิตอุปกรณ์ต้องจัดหาไดรเวอร์และบางครั้งอุปกรณ์เหล่านั้นจะรวมการผูกภาษาสำหรับภาษายอดนิยมด้วย อย่างน้อยก็จะมีการผูก C และภาษาทุกภาษามีวิธีเรียกไลบรารี C
  • ภายในสองกรณีนี้อุปกรณ์ง่าย ๆ อาจใช้การเชื่อมต่อทั่วไปเช่นพอร์ตอนุกรมเท่านั้นและผู้ผลิตจะเผยแพร่โปรโตคอลที่คุณสามารถใช้ผ่านไดร์เวอร์พอร์ตอนุกรมทั่วไปเท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.