การจำลอง Linus Torvalds: สร้างระบบปฏิบัติการของคุณเองตั้งแต่เริ่มต้น (VIII)

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

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

อย่างไรก็ตามตัวจัดการแป้นพิมพ์ของเราค่อนข้างซับซ้อนกว่าเมื่อเราอ่านคีย์และฝากไว้ในบัฟเฟอร์

extern "C" เป็นโมฆะ ND_Keyboard_Handler (struct regs * r) {char scancode ที่ไม่ได้ลงชื่อ = ND :: Keyboard :: GetChar (); ถ้า (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

เราสามารถตรวจสอบว่าเราเรียกใช้ฟังก์ชันที่เรียกว่า ND :: Keyboard :: GetChar ได้อย่างไร ที่นั่นเราได้รับตัวละครแล้วถ้ามันไม่ใช่อักขระว่าง (ที่นี่ฉันใช้ 255 เราจะต้องใช้ระบบที่ดีกว่า) เราวางตัวละครบนหน้าจอและเก็บไว้ในบัฟเฟอร์ของอักขระ (นี่คือ อาจมีการปรับปรุงระบบปัจจุบันอาจล้น)

nsigned char ND :: Keyboard :: GetChar () {char scancode ที่ไม่ได้ลงชื่อ; scancode = (ถ่านที่ไม่ได้ลงนาม) ND :: Ports :: InputB (0x60); ถ้า (scancode & ND_KEYBOARD_KEY_RELEASE) {กลับ 255; } else {return en_US [scancode]; }} ถ่าน * ND :: แป้นพิมพ์ :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; ส่งคืน stringBuffer; }

http://gist.github.com/2d4f13e0b1a281c66884

ที่นี่เราสามารถดูว่าคีย์ที่ถูกกดนั้นได้มาอย่างไร ที่ 0x60 จะมีการกดปุ่มสุดท้ายเสมอ ในความเป็นจริงสามารถอ่านได้โดยตรงโดยไม่ต้องใช้ IRQ แต่เราจะไม่รู้ว่าจะระบุได้อย่างไรเมื่อมีการเปลี่ยนแปลง ที่นั่นเราตรวจสอบด้วยการดำเนินการ AND ว่ารหัสที่เราได้รับนั้นตรงกับคีย์ที่ถูกหยุดการกด

ในกรณีนั้นเราจะส่งคืน 255 (เพราะเราจะเพิกเฉยในภายหลัง) และมิฉะนั้นคีย์ถูกกด ในกรณีนี้เราจะคืนตำแหน่งของอาร์เรย์ที่เรียกว่า en_US อาร์เรย์นี้มีข้อมูลอะไรบ้าง? อาร์เรย์นี้เรียกว่าคีย์แมปหรือแมปอักขระ ดังที่คุณทราบภาษาต่างๆมีแป้นพิมพ์ที่แตกต่างกันและไม่ได้รับการสนับสนุนเมื่อเขียนทับแป้น ดังนั้น en_US จะให้คีย์ที่ตรงกับแต่ละรหัสแก่เราและมันจะทำงานบนแป้นพิมพ์อเมริกัน

ถ่านที่ไม่ได้ลงนาม en_US [128] = {0,27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0 ',' - ',' = ',' \ b ',' \ t ',' q ',' w ',' e ',' r ',' t ',' y ',' u ',' ผม ',' o ',' p ',' [','] ',' \ n ', 0, / * Ctrl * /' a ',' s ',' d ',' f ',' g ', 'h', 'j', 'k', 'l', ';', '\' ',' ``, 0, / * Shift ซ้าย * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * กะขวา * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * ปุ่ม F1-F10 * / 0, / * Num lock * / 0, / * ล็อคการเลื่อน * / 0, / * ปุ่มโฮม * / 0, / * ลูกศรขึ้น * / 0, / * เลื่อนหน้าขึ้น * / '-', 0, / * ลูกศรซ้าย * / 0, 0, / * ลูกศรขวา * / '+', 0, / * แป้นวางสาย * / 0, / * ลูกศรลง * / 0, / * เลื่อนหน้าลง * / 0, / * แป้นแทรก * / 0, / * แป้นลบ * / 0,0,0, 0, 0, 11, / * F12-F0 คีย์ * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

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

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

ต่อไปShellLite


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   ดาริโอ dijo

    ติวเตอร์ยอดเยี่ยม! ขอบคุณ🙂

  2.   ป๊อบอาร์ค dijo

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

  3.   แมวของ Lopez dijo

    ขออภัยในความโง่เขลาของฉัน ... รหัสเหล่านี้เขียนมาจากไหน? จากเทอมินอล ??

    1.    เอเดรียน ArroyoStreet dijo

      รหัสเป็นส่วนหนึ่งของซอร์สโค้ด ฉันไม่ได้ใส่ให้สมบูรณ์เพราะอย่างอื่นโพสต์เป็นรหัสทั้งหมดและไม่มีคำอธิบายใด ๆ ขอแนะนำให้คุณอ่านบทแนะนำตั้งแต่ต้นหากคุณต้องการทำตาม คุณสามารถตรวจสอบซอร์สโค้ดแบบเต็มได้ที่นี่ (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady dijo

    การปรับปรุงจะทำอย่างไรไม่ให้ล้น

    1.    Plock dijo

      Kady คุณตรวจสอบรหัสพื้นที่เก็บข้อมูลแล้วหรือยัง มีการกำหนดขนาดสูงสุดรวมถึงฟังก์ชันในการควบคุมที่นั่นคุณสามารถทำการเปลี่ยนแปลงขนาดหรือใช้วิธีที่เหมาะสมในการปลดปล่อยบัฟเฟอร์เมื่ออิ่มตัว
      ฉันทิ้งลิงค์ไว้ให้คุณตรวจสอบ https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   นิโก้ dijo

    สวัสดีน่าสนใจมากคุณจะดำเนินการต่อกับ "ซีรีส์" ของ Emulating Linus Torvals นี้หรือไม่
    ช่วยแนะนำหนังสือข้อมูลที่จะทำ kernel แบบนี้ได้ไหม

    ทักทาย!

  6.   คำตอบ Veganas.Org dijo

    สวัสดี. ขอบคุณสำหรับบทแนะนำ โปรดช่วยแนะนำหนังสือที่คุณทำขึ้นซึ่งไม่ใช่ "ระบบปฏิบัติการ" โดย Tanenbaum ได้หรือไม่ ขอบคุณล่วงหน้า.
    อาศิรพจน์