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

ยินดีต้อนรับสู่โพสต์อื่นเกี่ยวกับ วิธีสร้างระบบปฏิบัติการของเราเอง (บทความก่อนหน้านี้ในชุด: 1, 2, 3, 4, 5 y 6). โพสต์ที่แล้วมานานมากแล้วสาเหตุหลักมาจากข้อบกพร่องที่พบในสิ่งที่เรามีในวันนี้ เราจะเห็น วิธีจัดการนาฬิกาบนสถาปัตยกรรม x86.

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

นาฬิกาเป็น IRQ โดยเฉพาะอย่างยิ่งตัวแรก ในการกำหนดค่าเราจะใช้ฟังก์ชันที่เรากำหนดไว้ก่อนหน้านี้เพื่อติดตั้ง IRQ โดยทั่วไปคือ ND_IRQ_InstallHandler

int ND_TIMER_TICKS = 0; เป็นโมฆะ ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: พอร์ต :: เอาท์พุท B (0x43,0x36); ND :: พอร์ต :: เอาต์พุต B (0x40, ตัวหาร & 0xFF); ND :: พอร์ต :: เอาต์พุต B (0x40, ตัวหาร >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + เห็บ; ในขณะที่ (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ n ตัวจับเวลาการตั้งค่า ... "); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: หน้าจอ :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("เสร็จแล้ว"); } extern "C" เป็นโมฆะ ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; ถ้า (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ n อีกหนึ่งวินาที"); เราควรทำการรีเฟรชหน้าจอ}}

รหัสทำงานดังนี้ระบบเริ่มต้นเรียกใช้ ND :: Timer :: Setupซึ่งโทร ND_IRQ_ติดตั้งตัวจัดการ เพื่อแทรกในตำแหน่งแรก IRQ0 ซึ่งเป็นฟังก์ชันเรียกกลับเมื่อเหตุการณ์เกิดขึ้นนั่นคือ ND_Timer_Handler ที่เพิ่ม เห็บ. เมื่อเราตั้งความเร็วสัญญาณนาฬิกาไว้ที่ 18 Hz ดังที่เราจะเห็นในภายหลังถ้าเราหารด้วย 18 และให้จำนวนเต็มเราจะผ่านไปหนึ่งวินาที

ฟังก์ชั่น ND :: Timer :: เฟส ช่วยให้เราปรับความเร็วของไฟล์ เครื่องจับเวลาจำนวนที่ฟุ่มเฟือยนั้นคือ 1.19 MHz ซึ่งเป็นค่าทั่วไป เราควรเรียกใช้ฟังก์ชันนี้หากเราต้องการเปลี่ยนความเร็วของไฟล์ เครื่องจับเวลาโดยค่าเริ่มต้นจะไปที่ 18,22 Hz ซึ่งเป็นค่าเฉพาะที่ใครบางคนต้องตัดสินใจภายใน ไอบีเอ็ม และมันยังคงอยู่จนถึงทุกวันนี้

ฟังก์ชั่น ND :: Timer :: รอ มันค่อนข้างง่ายเพียงแค่รอด้วยการวนซ้ำ ในขณะที่ จนถึง เห็บ จำเป็นต้องดำเนินการต่อ

ในภาพเราจะเห็นว่าหากเรายกเลิกการใส่ข้อคิดเห็นรหัสภายใน ND_Timer_Handler เราจะได้รับสิ่งนี้:

วินาทีใน NextDivel

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


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

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

*

*

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

  1.   โนอาห์ dijo

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

    1.    โรเดอร์ dijo

      ไม่ใช่การแจกแจงลินุกซ์ แต่เป็นเคอร์เนล😛

    2.    ดีไซโคเดอร์ dijo

      คุณผิด. การสร้าง linux distro ไม่ได้หมายความถึงการเขียนโปรแกรมอะไรเลยตัวอย่างเช่นใน linux ตั้งแต่เริ่มต้นคุณไม่ได้ตั้งโปรแกรมสิ่งที่คุณทำคือติดตั้ง (ขึ้นอยู่กับการคอมไพล์) แพ็คเกจพื้นฐานที่ประกอบขึ้นเป็น distro นี้แตกต่างกันมาก เป็นการสร้างระบบปฏิบัติการของคุณเอง มันไม่มีอะไรเกี่ยวข้องกับ linux นี่คือสิ่งที่ torvalds ทำในสมัยของเขาที่ได้รับแรงบันดาลใจจากมินิกซ์และด้วยการสนทนาที่ร้อนแรงและเป็นที่นิยมระหว่าง torvalds และ Andrew s Tanenbaum บนเคอร์เนลเสาหินเทียบกับไมโครเคอร์เนล

      Saludos!

  2.   Illukki dijo

    ขอบคุณครับ จนถึงตอนนี้ฉันไม่ได้ให้ความสนใจกับโพสต์ของคุณมากนัก แต่ฉันอยู่ในโครงการดังนั้นฉันจะดูโพสต์เหล่านี้
    อาศิรพจน์

  3.   โรเดอร์ dijo

    ควรค่าแก่การกล่าวถึงว่าสามารถใช้ภาษาอื่นได้เช่น Objective-C (++), C ++, D หรือ Rust

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

      อันนี้อยู่ใน C ++ ไม่ใช่ C อย่างไรก็ตามมันยากที่จะเห็นความแตกต่างเนื่องจากตัวดำเนินการ C ++ จำนวนมากต้องการการสำรองไลบรารีเช่นตัวดำเนินการใหม่และตัวลบ มันน่าสนใจมากที่จะสร้างระบบปฏิบัติการใน Rust จริงๆแล้วมีช่อง IRC สำหรับระบบปฏิบัติการบน Rust (# rust-osdev บน irc.mozilla.net) ใครที่คอมไพล์เป็นรหัสเครื่องก็คุ้มมากรวมถึง Java ด้วยถ้าเราใช้ GCJ

      1.    โรเดอร์ dijo

        ใช่ Rust เป็นภาษาที่น่าสนใจมากสำหรับระบบปฏิบัติการเพราะไม่เพียง แต่เรียนรู้ได้ง่ายกว่า C หรือ C ++ (ยังคงมีการเปลี่ยนแปลงอย่างต่อเนื่อง แต่ง่ายกว่า) แต่ยังปลอดภัยกว่ามาก

  4.   โรเดอร์ dijo

    ในทศวรรษที่ 70 เป็นเรื่องปกติที่จะตั้งโปรแกรมโดยตรงบนฮาร์ดแวร์โดยไม่มีระบบปฏิบัติการ

  5.   คริส dijo

    ยอดเยี่ยม ... ตอนนี้ฉันต้องเข้าใจ: 3 ...

  6.   mmm dijo

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

    1.    ดีไซโคเดอร์ dijo

      อย่าโทษตัวเองคุณไม่ได้ลา เริ่มต้นด้วยโปรแกรมเมอร์บางคนไม่ทราบวิธีเขียนเคอร์เนลมันเป็นงานง่ายๆเพียงเล็กน้อยและในทางปฏิบัติมันใหญ่กว่า ตัวอย่างเช่นที่นี่ผู้เขียนสร้างไดรเวอร์ทั่วไปสำหรับแป้นพิมพ์และหน้าจอโดยจัดการอาร์เรย์หน้าจอซึ่งเป็นวิธีการที่ไม่ได้ใช้เลยในปัจจุบัน tty ใน linux ในปัจจุบันมีความซับซ้อนมากและไม่ได้ขึ้นอยู่กับสถาปัตยกรรม x86 ที่มีอาร์เรย์หน้าจอในการกำจัด นอกจากนี้โค้ดส่วนใหญ่ใน C ยังขึ้นอยู่กับสถาปัตยกรรมเมื่ออุดมคติคือการสร้างโค้ดสถาปัตยกรรมในแอสเซมเบลอร์และโค้ด C ทำงานบนโปรเซสเซอร์ใด ๆ อย่างไรก็ตามฉันไม่ได้หันเหความสนใจจากผู้เขียนเพราะเคอร์เนลได้รับคุณสมบัติที่เราถือว่าเป็นเรื่องปกติในเคอร์เนลลินุกซ์ในปัจจุบันเช่นไม่ใช่เรื่องง่ายและมั่นใจได้ว่าคน ๆ เดียวไม่สามารถทำได้อย่างแน่นอน สำหรับบางสิ่งบางอย่างโครงการขนาดใหญ่เช่น linux, gcc, glibc ฯลฯ ไม่ได้สร้างขึ้นโดยคนคนเดียว แต่มีผู้ทำงานร่วมกันจำนวนมาก

      นอกจากนี้หากคุณต้องการเริ่มต้นการเขียนโปรแกรมคุณมีคำแนะนำบางอย่างบนเว็บแม้ว่าคุณจะต้องระวังและเลือกคำแนะนำที่ดี ฉันเริ่มเขียนโปรแกรมด้วยลินุกซ์กระโดดลงสระด้วยหัวและไม่มีน้ำ (นั่นคือด้วยภาษา C อันเป็นที่รัก) แม้ว่าตอนนี้ฉันจะมีแนวคิดพื้นฐานเกี่ยวกับ python (ซึ่งเป็นภาษาที่ดีมาก) มีหนังสือ C บางเล่มที่คุณยอมแพ้ในหน้า 6 เป็นเรื่องที่น่าปวดหัว แต่มากกว่าหนังสือสิ่งเหล่านี้ได้มาจากประสบการณ์ มันเกิดขึ้นเช่นเดียวกับโมเดลเครือข่าย OSI เอกสารเกี่ยวกับโมเดล osi เป็นไปไม่ได้ที่จะเข้าใจสำหรับผู้มาใหม่ แต่หากคุณพบไซต์ที่มีคำอธิบายที่ดีเกี่ยวกับเลเยอร์เครือข่ายคุณจะได้รับแนวคิดในการจัดการกับเอกสารทางเทคนิคเช่น RFC ได้อย่างรวดเร็ว

      ในระยะสั้นมีเว็บไซต์และคู่มือที่ดีอยู่ที่นั่นเป็นเรื่องของการเข้าถึงและค้นหาเนื้อหาที่ดี

      ความนับถือ

  7.   ฟรี_DOM dijo

    สวัสดีหลังจากพยายามอย่างหนักเพื่อแก้ปัญหา "error: no multiboot header found" และ«ข้อผิดพลาดที่คุณต้องโหลดเคอร์เนลก่อน»เนื่องจากฉันไม่พบวิธีแก้ปัญหาของบทความแรกที่บางคนเหมือนฉัน ... นี่คือวิธีแก้ปัญหาถ้ามันใช้ได้กับใครบางคน ...

    ฉันไม่รู้ว่าทฤษฎีของฉันเกี่ยวกับสาเหตุของข้อผิดพลาดนั้นถูกต้องหรือไม่ แต่อย่างไรก็ตามคำถามก็คือเมื่อรวบรวมไฟล์ในระบบปฏิบัติการ 32 บิตมันไม่ได้สร้างข้อผิดพลาด แต่เนื่องจากฉันมี 64 บิต ระบบปฏิบัติการ (Gnu / Linux Debian 7) และเมื่อรวบรวมและทดสอบฉันได้โยนข้อผิดพลาด "ไม่พบส่วนหัวมัลติบูต" และมีข้อสงสัยจากนั้นในความคิดของฉันข้อผิดพลาดเกิดจากสภาพแวดล้อมหรือสถาปัตยกรรมของการปฏิบัติการ ระบบที่เรากำลังรวบรวมไฟล์ของเรา ... และสิ่งที่ฉันทำคือคอมไพล์ไฟล์ของฉันระบุสภาพแวดล้อมหรือสถาปัตยกรรม 32 บิต ..
    * sudo เป็น -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestand -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -f อิสระ
    สิ่งที่แปลกคือฉันมีข้อสงสัยบางอย่างฮ่า ๆ ๆ แล้วระบบปฏิบัติการที่เรากำลังสร้างขึ้นทีละขั้นตอนนั้นเป็นสถาปัตยกรรม x86 หรือฉันผิดอัจจจ….

    PS: มีคนช่วยไขข้อสงสัยและแก้ตัวสะกดคำผิดหรือสำนวนที่ไม่ดีของฉันและฉันก็ไม่สมบูรณ์แบบดังนั้น "ความสมบูรณ์แบบมีราคา" ... และที่สำคัญที่สุดคือเลียนแบบระบบปฏิบัติการ 32 บิตศักดิ์สิทธิ์ วิธีแก้…. ฮ่า ๆ ๆ

    1.    มาร์ตินวิลลาลบา dijo

      อัจฉริยะ! ฉันอยากจะทำแบบฝึกหัดนี้จริงๆและฉันก็เริ่มต้นด้วยความผิดพลาดนั้นฮ่าฮ่า

  8.   ออสการ์ dijo

    ยินดีด้วยเป็นผลงานที่ยอดเยี่ยม จากนี้ไปฉันจะบอกคุณว่างานดีๆของคุณผ่านฉันและคนอื่น ๆ จะได้รับการขยายออกไป

    ความนับถือ