חיקוי לינוס טורוואלדס: צור מערכת הפעלה משלך מאפס (VII)

ברוך הבא לפוסט אחר אודות כיצד ליצור מערכת הפעלה משלנו (מאמרים קודמים בסדרה: 1, 2, 3, 4, 5 y 6). עבר הרבה זמן מאז ההודעה האחרונה, בעיקר בגלל באג שמצאתי במה שיש לנו היום. אנחנו עוד נראה כיצד לטפל בשעון בארכיטקטורות.

בעבר הפעלנו את ה- IRQ בצורה כללית, אך הייתה בעיה קטנה מכיוון שלא הפעלנו אותם כראוי והעברנו נתונים נוספים. סוף סוף אנחנו מתקנים את זה קרלוסורטה ואני ואני יכולים להמשיך להגיב כיצד להמשיך.

ובכן, השעון הוא IRQ, במיוחד הראשון. כדי להגדיר את זה נשתמש בפונקציה שהגדרנו בעבר כדי להתקין באופן כללי את ה- IRQs, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; בטל ND :: טיימר :: שלב (int hz) {int divisor = 1193180 / hz; ND :: יציאות :: OutputB (0x43,0x36); ND :: יציאות :: OutputB (0x40, מחלק & 0xFF); ND :: יציאות :: OutputB (0x40, מחלק >> 8); } בטל ND :: טיימר :: המתן (int ticks) {לא חתומות ארוכות; eticks = ND_TIMER_TICKS + קרציות; בעוד (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: מסך :: PutString ("\ n הגדרת טיימר ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: מסך :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: מסך :: PutString ("נעשה"); } חיצוני "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 :: טיימר :: הגדרה, שמתקשר ND_IRQ_InstallHandler להכניס למיקום הראשון את ה- IRQ0, פונקציית התקשרות חוזרת כאשר האירוע מתרחש, כלומר ND_Timer_Handler שמגדיל את קרציות. כפי שקבענו את מהירות השעון ל- 18 הרץ, כפי שנראה בהמשך, אם נחלק אותה ב- 18 ונתן לנו מספר שלם, שנייה הייתה עוברת.

הפונקציה ND :: טיימר :: שלב זה עוזר לנו להתאים את המהירות של שעון עצר, המספר האקסטרווגנטי הזה הוא 1.19 מגה-הרץ שהוא ערך נפוץ. ובכן, עלינו להתקשר לפונקציה זו אם אנו רוצים לשנות את מהירות ה- שעון עצר, כברירת מחדל זה מגיע ל 18,22 הרץ, ערך מוזר שמישהו חייב להחליט בתוכו יבמ והיא נותרה עד היום.

הפונקציה ND :: טיימר :: המתן זה די פשוט, רק חכה עם לולאה בזמן עד ה קרציות הכרחי להמשך.

בתמונה אנו יכולים לראות שאם נבטל את הקוד בתוך ND_Timer_Handler אנו מקבלים את זה:

שניות ב- NextDivel

בפרק הבא נראה כיצד לקרוא קלט מקלדת ולהכין מעט פָּגָז לתקשר עם המערכת שלנו. כמו תמיד, הקוד זמין ב GitHub תחת הרישיון GNU GPL v2.


השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.

  1.   נח דיג'ו

    סדרת מדריכים מעניינת מאוד, באופן אישי לא ראיתי הרבה על יצירת הפצת לינוקס מאפס, ועוד פחות בספרדית וכל כך שלמה. אני חושב שתוכל ללמוד הרבה מזה וברגע שיש לי זמן אני מקווה שאוכל לעשות את ההדרכות האלה.
    כל מה שאני מבקש הוא שלא תתייאש ותסיים את ההדרכה, מכיוון שמצאתי הרבה הדרכות טובות שמעולם לא הסתיימו.
    ברכות ותודה :).

    1.    מטייל דיג'ו

      זה לא הפצה של לינוקס, זה גרעין 😛.

    2.    desikoder דיג'ו

      אתה טועה. יצירת דיסטרו של לינוקס אינה מרמזת על תכנות של דבר, למשל בלינוקס מאפס אינכם מתכנתים, מה שאתם עושים זה להתקין (מבוסס על קומפילציה), חבילות בסיסיות המרכיבות דיסטרו. זה שונה מאוד. זה יוצר מערכת הפעלה משלך. זה לא קשור לינוקס. זה מה שעשה טורבלדס בימיו בהשראת minix, ועם הדיון הסוער והפופולרי הזה בין טורוואלדס לאנדרו. טננבאום על גרעין מונוליטי מול מיקרו קרנל.

      Saludos!

  2.   אילוקי דיג'ו

    תודה צ'ה. עד עכשיו לא הקדשתי תשומת לב רבה לפוסט שלך אבל אני בפרויקט אז אני אסתכל עליהם.
    ברכות.

  3.   מטייל דיג'ו

    ראוי להזכיר כי ניתן להשתמש בשפות אחרות, כגון Objective-C (++), C ++, D או Rust.

    1.    אדריאן ארויו סטריט דיג'ו

      זה ב- C ++, לא ב- C. עם זאת, קשה לראות את ההבדלים מכיוון שמפעילי C ++ רבים דורשים גיבוי לספרייה, כמו למשל האופרטורים החדשים והמחקים. זה יהיה מעניין מאוד ליצור מערכת הפעלה ברוסט. יש למעשה ערוץ IRC המוקדש למערכות הפעלה ב- Rust (# rust-osdev ב- irc.mozilla.net). כל מי שמתכנס לקוד המכונה באמת שווה את זה, כולל ג'אווה אם אנו משתמשים ב- GCJ.

      1.    מטייל דיג'ו

        כן, אכן, חלודה היא שפה מעניינת מאוד עבור מערכות הפעלה, מכיוון שהיא לא רק קלה יותר ללמוד מאשר C או C ++ (היא עדיין ממשיכה בשינויים מתמשכים, אבל היא קלה יותר), אבל היא הרבה יותר בטוחה.

  4.   מטייל דיג'ו

    בשנות ה -70 היה די מקובל לתכנת ישירות על החומרה, ללא מערכת הפעלה.

  5.   כריסטופר דיג'ו

    מצוין ... עכשיו אני רק צריך להבין: 3 ...

  6.   מממ דיג'ו

    היי. תודה רבה על המאמרים האלה. אבל, אם אין לי ידע בתכנות, אני לא חושב שאני צריך לעשות את זה, נכון? אני אומר, אם לא זה יהיה "טוב, ועכשיו מה אני מעתיק ומדביק?" ... חבל, תמיד רציתי כל כך לדעת איך לתכנת ושום דבר, אני יותר חמור!

    1.    desikoder דיג'ו

      אל תאשים את עצמך, אתה לא חמור. ראשית, לא כל המתכנתים יודעים לכתוב גרעין, זו משימה מאוד קטנה, ובפועל היא גדולה יותר. לדוגמא, כאן המחבר יוצר דרייברים כלליים למקלדת ולמסך, תוך מניפולציה על מערך המסך, שזו שיטה שלא משתמשים בה כלל כיום. ה- tty בלינוקס כיום מורכבים מאוד מאוד, ואינם תלויים בכך שארכיטקטורת x86 תעמוד במערך מסך. בנוסף, חלק ניכר מהקודים ב- C תלויים בארכיטקטורה, כאשר האידיאל הוא להכין את קוד הארכיטקטורה במכלול וכי קוד ה- C עובד על כל מעבד. עם זאת, אני לא גורע מהמחבר, מכיוון שגרעין רוכש את המאפיינים שהיום אנו רואים כרגיל בגרעין לינוקס, למשל, זו לא משימה קלה, והיה סמוך ובטוח שאדם יחיד אינו מסוגל לחלוטין לעשות זאת. עבור משהו שהפרויקטים הגדולים כמו לינוקס, gcc, glibc וכו 'לא נעשים על ידי אדם אחד, אך ישנם משתפי פעולה רבים.

      כמו כן, אם אתה רוצה להתחיל לתכנת, יש לך לא מעט מדריכים באינטרנט, אם כי אתה צריך להיות זהיר, ולבחור את המדריכים הטובים. התחלתי לתכנת בלינוקס לקפוץ לבריכה עם הראש ובלי מים (כלומר עם שפת C האהובה), אם כי עכשיו יש לי כמה תפישות בסיסיות של פיתון (שזו גם שפה טובה מאוד). ישנם כמה ספרי C שבהם אתה מוותר בעמוד 6 על כמות כאב הראש שאתה מקבל, אך יותר מאשר ספרים הדברים נרכשים מניסיון. זה קורה כמו עם מודל רשת OSI. את התיעוד אודות מודל ה- osi אי אפשר להבין עבור העולה החדשה, אך אם אתה מוצא אתר עם הסבר טוב על שכבות הרשת, אתה מקבל במהירות את המושגים להתמודד עם מסמכים טכניים כגון RFC.

      בקיצור, ישנם אתרים ומדריכים טובים שם בחוץ, זה עניין של לרדת לזה ולמצוא חומר טוב.

      לגבי

  7.   חוֹפֶשׁ דיג'ו

    שלום, אחרי כל הניסיונות לפתור את "השגיאה: לא נמצא כותרת רבת-רגל". ו- «שגיאה אתה צריך לטעון את הליבה תחילה», מכיוון שלא יכולתי למצוא בשום מקום את הפיתרון לבעיית המאמר הראשון, שהיה לחלק כמוני ... הנה הפיתרון, אם זה עובד עבור מישהו ...

    אני לא יודע אם התיאוריה שלי לגבי סיבת השגיאה נכונה, אך בכל מקרה, השאלה היא שכאשר מקבצים את הקבצים במערכת הפעלה של 32 סיביות, היא לא יצרה את השגיאה, אך מכיוון שיש לי הפעלה של 64 סיביות. מערכת (Gnu / Linux Debian 7), וכי בעת הידור ובדיקה קיבלתי את השגיאה "לא נמצא כותרת רבת אתחול", ויש ספק, אז לדעתי הטעות נובעת מהסביבה או הארכיטקטורה של מערכת ההפעלה בו אנו מרכיבים את הקבצים שלנו ... ובכן מה שעשיתי הוא לאסוף את הקבצים שלי, ולציין את הסביבה או הארכיטקטורה של 32 ביט.
    * sudo as -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC-freestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC-freestanding
    הדבר המוזר הוא שיש לי כמה ספקות חחח, אז מערכת ההפעלה שאנחנו יוצרים צעד אחר צעד נועדה לארכיטקטורה של x86 או שאני טועה אג'אג '...

    נ.ב: מישהו שיעזור לי עם הספק, ויתרץ כמה שגיאות כתיב או את הביטוי הרע שלי, ובכן אני לא מושלם אז ל"שלמות יש את המחיר שלה "... והכי חשוב, לחקות מערכת הפעלה של 32 סיביות, פתרון קדוש ... .הההה

    1.    מרטין וילאלבה דיג'ו

      גאון! מאוד רציתי לעשות את ההדרכה הזו וירדתי בהתחלה עם הטעות ההה

  8.   אוסקר דיג'ו

    מזל טוב, זו תרומה מצוינת. מעכשיו אני משתף אתכם שעבודתכם הטובה דרכי ואחרים תוארך;

    לגבי