kririn כתב:קודם כל חלוקת זיכרון ,קימת בPC שנים ,במחשבים שאין להם זיכרון גרפי
אתה מגדיר את זה כבר ברמת הביוס ,מכמה אפשרויות ,ובעצם חלק מהRAM ,מופרד תוכנתית ומשמש כזיכרון גרפי ,זה פיתרון עקום ,אבל קים שנים
בעניין תכנות ,רק לא מזמן פרסמו WIN95 רצה על הXBO ,וXBO לא פרוץ
וזה כי MS החליטה לאפשר פיתוח תוכנות לXBO ,אומנם עם הגבלות מסוימות ,אבל עדין אפשר לפתח תוכנות לXBO
הזיכרון המהיר ,זה התחליף שלהם לGDDR5 ,במחשבי משחקים יש GDDR5 או GDDR5X או הזיכרון החדש שכחתי את השם
MS החליטה ללכת על ESRAM
וזה גרם ועדין גורם לבעיות ,כי זה לא הסטנדרט ,ומפתחים דיברו על זה
הדרך לפתח במחשבה על ESRAM בכמות קטנה מול GDDR5 בכמות גדולה ,פשוט שונה
ESRAM הרבה יותר מהיר ,אבל בגלל הכמות הקטנה ,זה בעיתי לפתח למולטיפלטפורם ,שהמתחרות בGDDR5
וכמו שאמרתי חלק מהמשחקים צד ראשון ושני מגעים גם לPC ,ככה שגם שם זה דבר בעיתי
חלוקת זיכרון לא מוגדרת בBios. לפני שמערכת הפעלה עולה כל הזיכרון פתוח בפניה, היא עובדת למעשה בפריביליגיה של Ring 0, היא יכולה לכתוב לאיזה כתובת פיסית שהיא רוצה (מניפולציות שעושה בדרך כלל Bios זה למפות רכיבי IO ספציפיים לכתובות פיסיות, כמו למשל הDevice של הVGA, אולי גם את טבלת הIVT, לא זוכר), הלינקר שמבצע Merge לתוכנה שכתבת (במקרה שלנו מערכת ההפעלה) וגוזר את הבינארי הסופי מקבל סקריפט שאומר לו באיזה כתובות פיסיות לשים כל אזור של הפורמט הבינארי שהגדרת. אם לדוגמא הפורמט הבינארי שלי מכתיב אזור של Read only שבו אני שם את הקוד, אני אציין ממש כתובת פיסית בו לשים את הקוד שלי בסקריפט. אם לדוגמא יש לי Stack ראשוני של הKernel, אני אציין את כתובת של האזור בוא הוא שוכן (גם בסקריפט) ככתובת פיסית ואעדכן את רגיסטר הESP עם ראש הStack בפונקציות האיתחול.
דוגמא לאיך נראה חלק מסקריפט כזה:
SECTIONS
{
/* Begin putting sections at 1 MiB, a conventional place for kernels to be
loaded at by the bootloader. */
. = 1M;
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
שים לב שהכתובת 0x1000000 כבר הוגדרה וכל מערכת ההפעלה תתחיל להופיע אחריה. אם לא הייתי בעבודה והיה לי פה readelf הייתי מראה לך איך זה נראה בבינארי הסופי.
מדובר פה על שני אזורים לדוגמא, multiboot כולל את הmagic word לBootloader שיזהה את הפורמט הבינארי ולאחריו הStack, הtext כבר מגדיר את הקוד שלי והוא RO גם.
תמיד כל הזיכרון זמין למערכת ההפעלה, זה כל הפואנטה, יש לה גישה להכל, לכל הDevices ולכל הזיכרון. Bios זה סתם תוכנה קטנה שעושה וולידציה על חומרה, מאתחלת כמה רכיבי IO ודואגת לקרוא לBootloader שיטען את מערכת ההפעלה.
החלוקה שאני דיברתי עליה היא ממש שני RAMים שונים אחד של GPU ואחד של CPU במחשב, אין בינהם קשר מלבד העתקות של הלוך ושוב. אבל בכל אחד מהם תהיה כתובת 0 מחדש, זה שונה מאשר לחיות במודל אקסלרטור על אותו זיכרון בלי גורם אחד שמנהל אותך (כמו מערכת הפעלה), יש MMU כמובן, אבל אתה כתוכנה היית רוצה מנהל תוכנתי אחד שיבצע את כלל ההקצאות ויראה אתה תמונה המלאה, מה שלא קיים באקסבוקס.
תחשוב גם מעבר לזה, אם לדוגמא כתבתי קוד לפיסי בו כתוב לדוגמא מעל הGPU -
Alloc(100) נגיד וזה אומר להקצות 100 בתים, אז Nvidia כתבו פונקצית ספרייה שיודע להקצאות 100 בתים מאיזה Pool שהם מנהלים של כלל הזיכרון הפיסי. עכשיו קח את אותו קוד ותעביר אותו לאקסבוקס, האם זה יעבוד? בוא נראה עם אילו בעיות אתה מתמודד:
מעבר לפונקציית ספרייה של Nvidia שרואה את כל הזיכרון יש מערכת הפעלה שמתחרה איתך על אותו זיכרון, איך תסנכרן בין השניים? בנוסף, אתה רוצה לעבוד מעל הזיכרון היעודי הקטן, איך תעשה זאת? תצטרך כנראה פונקצייה חדשה כדי לבקש את הזיכרון, נגיד - AllocNew(100), כלומר הקוד המקורי שלך כבר לא פורטאבולי בשל שינוי ארכיטקטוני, מתחיל להבין את שאני טוען?