Logo

רד-בורד: ארכיון

ראשי > תיכנות > רמה נמוכה של כרטיסי מסך

16/12/2007 02:24:46 T4uSBaZ
המורה שלי אמר שכיום כרטיסי המסך הם משוכללים כל כך עד כדי כך
שהם פשוט מעבדים בפני עצמם.
זאת אמרת, במקום שהמעבד יעשה את כל החישובים בוא נניח שאנחנו מדברים על כרטיס מסך מתקדם בטכנולוגיית Geforce, פשוט מעבירים לו איזה תמונה כלשהי בזיכרון ( מערך מספרים? ) ואיזה פקודה,לדוגמא " לסובב אותו" ( פסיקה? ) והוא פשוט מבצע את הסיבוב במקום שהמעבד יצטרך לעשות את זה.

אז השאלה שלי היא, איך?
נכנסתי לאתר של nvidia developers, וחיפשתי שמה מידע..
כל מה שמצאתי זה כמה דברים של directx.
שזה מביא אותי להשערה הבאה שלי: אולי בעצם מה שקורה הוא שdirectx ו opengl הם ספריןת DLL שכוללות פונקציות, אבל בעצם במקורם הן אסמבלי? פשוט אסמבלי?

אז אני , לא רוצה שום ספריות ושום בטיח.. אני רוצה לדעת איך כל זה פועל מבפנים ולכן השאלה שלי אליכם אנשים, (HLL יא חולה low-level זה בשבילך )

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

אז זה פשוט הולך גם כן אסמבלי מיוחד של כל כרטיס מסך? תענו לי! אני רוצה לתכנת פה איזה ספרייה גרפית קטנה XD

ועוד דברים.. ( למרות שאני יותר רוצה את התשובה לקודם )
שמעתי שיש המון מצבים שיכולים להיות במעבדים החדשים בפסיקת המסך.. (10h) .. בקיצור כל זה שייך למעבד.
כל מה שראיתי בינתיים באסמבלי של 386 זה מצבי גרפיקה עד ל 640*480.. וכל זה לא ברור לי.. מה בעצם קורה? ברגע הזה בעצם כל הb800 מוגדר אחרת ובמקום שיהיה 4000 בתים ( במצב רגיל של 80*25 תווים * 2 ( תכונה ) ) יש (640*480 * עוד משהו? )..
אז איך לעזעזל אני עכשיו ברזולוציה של 1024*768?
וכיצד זה שמערכת ההפעלה מטפלת בכמה וכמה תוכניות כאשר כל אחד מהם משתמשת ברזולוציה שונה? האם מערכת ההפעלה מפעילה אלגוריתמים מיוחדים כדי להתאים את כולם לפי גודל התוכנית במסך וככה מכניסה אותם לb800 או לכתובת האחרת? ( --> שאחר כך מועברת לכרטיס מסך? )
ועוד שמעתי על טבלת אסקיי כלשהי שיש בכרטיסי מסך.. אז איך לעזעזל כותבים גם בעברית וגם באנגלית וגם ברוסית וגם בצ’כית באותה תוכנה.. אם זה טבלת אסקיי? מה משנים אותה כל פעם??

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


מצטער על ההפצצה.. שוונג של 3 בבוקר

אה ושאלה אחרונה.. האם כל זה קיים גם בכרטיסי רשת? כרטיסי קול?
ומה אם אני ארצה ליצור איזה כרטיס חדש.. לדוגמא שהמטרה שלו היא להתחבר לרשת החשמל בבית ולשלוח כל מני אותות חשמל ( סתם המצאתי ) אז אני גם אצטרך ליצור לוח אם משלי, ומעבד משלי, וכו’ וכו’?
Oh crap.


אנה ענו לי, אני נואש! :)

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

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

האם יש איזה ספר " האסמבלי של כרטיס המסך" או " המדריך השלם לבניית מעבד בעצמך "[ההודעה נערכה על-ידי T4uSBaZ ב-16/12/2007 02:37:05]
16/12/2007 23:13:49 HLL
GOOOD
YOU HAVE REALLY OUTDONE URSELF THIS TIME DUDE!!
I’LL TRY TO ANSWER MOST OF THESE THINGS IN A FEW MINUTES.



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

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

בסביבות 20-80 MHZ) היה עושה המווון עבודה גרפית ולא היה מסוגל לתפעל דברים אחרים,
כאן נכנסו לפעולה ה’מאיצים הגרפיים’ , המאיצים הגרפיים (Graphic accelorators) הכילו שני ממשקים, האחד - ל ISA (או

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

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

הסתעפויות לוגיות (IF) - אזי מתכננים אותם שלמען המטרה הזו הם יהיו הכי יעילים.
בנוסף המעבדים הנ"ל לרוב מטפלים אך ורק במספרים שלמים, כאשר הבקשה לטפל בערכי נקודה צפה (float) כמות ה Cycles פר

Opcode גודלת באופן מופרז.
לעומת זו, לשם ביצוע חישובים גרפיים , ומידול צורות דו, ותלת מימדיות פעולות גרפיות מורכבות כאלה, דורשות עיבודים לא

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

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

"וירא הגיימר כי טוב,
ויהי ערב, ויהי בוקר Voodo 3"

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

טקסטורת ומודלים תלת מימדיים (מפורט בהמשך).

*Context switch* באפרים ניהולים ובלאגנים:

כתובת הזיכרון 0xb8000 היא מיקום ה Textual video buffer הבסיסי, עכשיו מכיוון שמחשב הוא לא מערכת משובצת (Embedded)

אין זה אומר שכאשר אתה כותב לאזור הזיכרון הנ"ל אתה כותב לכרטיס מסך - בהחלט לא.
מה שקורה, שה BIOS נכנס לפעולה בשלב הזה, ודואג לסנכרן בין אותו סיגמנט זיכרון, לבין הבאפרים שמצויים על כרטיס המסך.
לגבי mode 10h - Mode 10h אם אני זוכר נכון זה ה VESA? (Video something something somethingelse)
VESA הוא תקן שיצא ע"מ להגדיר API ברמה נמוכה לכרטיסי מסך, הAPI נעשה באמצעות פסיקות תוכנה - ביוס - RealMode שנצרבו

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

הוא תומך, ולעבוד בהתאם (ע"ע SVGA - אם אני לא טועה רוב הדברים שהיו כתובים בעבר למסכי ’סופר VGA’ [נכון נשמע

מגניב?] נכתבו עם VESA)
(וכן , אתה להשתמש בפסיקות BIOS VESA עד היום - זה אמור לעבוד - אבל לא מובטח - מערכת ההפעלה שלי היתה / תהייה אמורה

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

ביצועים) - אל תתפוס אותי במילה, אבל ה Native Win32 GUI הוא DirectDraw.
(טיפ: לניסוי אתה יכול ללחוץ F8 בזמן עליית WINDOWS, אתה יכול להפעיל את XP תחת VGA MODE - הנ"ל הוא בעצם VESA

MODE.)


לגבי טבלאות אסקי שונות
אם אתה זוכר את Windows 95/98 - באחד השורות של Autoexec.bat היה משהוא כזה
קוד: mode con codepage=xxx
אני לא יכול להגיד לך ב 100% אבל מה שאני מעריך הוא שיש יכולת כנראה לטעון לכרטיס המסך את הפונטים של 255 (254 ,

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

*Context switch*
קצת על סטנדרטים:

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

כלמיני דברים כמו Sprites, לפעמים גם Pixel shaders ועוד כלמיני דברים שאני לא מבין בהם יותר מידי ^_^
שכולם היום נתמכים בכל/רוב כרטיסי המסך (ע"פ יכולתיהם) במקום שנצטרך לטפל (האפליקציה/משחק) בכל כרטיס לגופו.
כאשר יצרן רוצה לפתח כרטיס, הוא דואג לפתח את הכרטיס, ואת הדריוור ככה שביחד יתמכו ב OpenGL ו/או Direct3D, ככה כאשר

האפליקציה פונה למנוע ה OpenGL לדוגמא, הוא יבקש מהדריוור לבצע פעולה מסויימת (טען טקסטורה m לזיכרון, סובב אובייקט

ב n מעלות על ציר Z)

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

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

(wiki: DSP), בין אם זה אפקטים או הדמייה של תלת מימד ושאר ירקות (ע"ע ESX [או שזה היה EAX] - נדמה לי)
כרטיסי רשת שאלת? כן, גם להם יש מעבד. האם זה החכרי - לרוב - אבל בעיקר בגלל צורך בניהול קלט-פלט מול ה BUS של ה

PC. מה שכן בנוסף היום לכל כרטיסי הרשת פיצ’ר (שאפשר לכבות או להדליק) שנקרא Checksum offlad - הוא מאפשר לחסוך

מהדריוור (תוכנה) את חישוב ה Checksum בחבילות שיוצאות מכרטיס הרשת ולעשות את זה בעצמו (חומרה)
אילו עוד כרטיסים יש? תתפלא - אבל יצא כבר ’כרטיס בינה מלאכותית’ (אל תשאל אותי מה תומך בו ^_^).
ישנם גם כרטיסי דגימה ועריכת ווידאו, וגם בהם מבוצעים דברים שונים.
אה מה שמזכיר לי - היה לי פעם גרסא מנוונת של DVD במחשב שלי (בין הראשונים) הערכה הגיע עם כונן DVD, ונחש מה

RealMagic MPEG-2 Decoder Card, משעשע ,אה? היום כל מחשב יכול לעשות את זה עם רק 16% עיבוד - היה בעבר כרטיסים

Dedicated לזה בלבד.

ולסיכום - שתדע - כרטיס המסך באמת לא משנה , מה שמשנה זה המעבד שנמצא עליו (שמת לב שאתה מחפש דריוורים לפי צ’יפ ולא

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

פעם בודדת, אה? :)

אני מקווה ששפכתי קצת אור על השאלות שלך,
יום מצויין שיהיה לך,
ושבוע טוב. 8)

הלל.

[ההודעה נערכה על-ידי HLL ב-16/12/2007 23:54:00]

[ההודעה נערכה על-ידי HLL ב-16/12/2007 23:55:20][ההודעה נערכה על-ידי HLL ב-17/12/2007 00:02:34]
17/12/2007 16:13:36 T4uSBaZ
פיי כמה מידע :)
אני אתעמק בזה אחר כך ..
ונדבר כבר HLL, תודה!! (שובב.. =] )
=]]
09/01/2008 21:17:27 bla27
לפני איזה שנתיים כתבתי ספרייה גרפית קטנה באסמבלי של 80286 ב mode 10h.

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

באותה מידה אפשר גם להעביר למצבים אחרים בעזרת פסיקות bios.

אה ובנוגע לעוד כרטיסים נראה לי שיצא עוד מעט כרטיס לחישובי פיזיקה(או אולי כבר יצא).
11/01/2008 13:48:41 T4uSBaZ
תוכל להביא איזה אתר או מקור ללמידה של איך אני מתכנת במצבים האלו..?
(כתובות של 640*480, )
איך בכלל אני משתמש בפסיקות / פונקציות של כרטיס המסך שלי ( GEFORCE 7300 נניח )

ואיך בכלל עושים מצב של 1024*768 ( האם זה כרטיס מסך? )
12/01/2008 03:49:47 bla27
על רוב השאלות שלך אני לא יכול לענות.. אני לא יודע איך להשתמש במצבים ספציפיים לכרטיס המסך. אני לא מבין בתחום הזה.. מה שאני כתבתי זו ספרייה גרפית פשוטה מאוד שאפשר להשתמש בה בכל מחשב תואם 8086, לא משהו ספציפי לכרטיס מסך כלשהו אז אולי זה לא מה שאתה מחפש.

אז אני לא יודע בקשר למצבים שונים.. כתבתי שאת הספריה כתבתי ל Mode 10h אבל כרגע נזכרתי שזה בעצם היה mode 13h.. שזה 320X200.

בעיקרון בעזרת פסיקה של ה bios מעבירים את המסך למצב זה..

xor ah. ah
mov al, 13h
int 10h

ולאחר מכן פשוט תכתוב ישירות לבאפר שמשמש לזיכרון המסך (בגודל 320*600) שמתחיל ב a000h.

חיפוש קטן בגוגל הביא אותי לכאן:
http://www.faqs.org/faqs/assembly-language/x86/general/part1/section-12.html

זה נראה סבבה.

[ההודעה נערכה על-ידי bla27 ב-12/01/2008 03:51:13][ההודעה נערכה על-ידי bla27 ב-12/01/2008 03:52:45]
12/01/2008 15:06:28 T4uSBaZ
אחי, שמע אני יודע את זה. תודה רבה בכל אופן =]
אני רק מחפש יותר מזה, מה קורה בפנים הפסיקה, מה היא לעזעזל עושה במחשב?

ופסיקות של כרטיס מסך =][ההודעה נערכה על-ידי T4uSBaZ ב-12/01/2008 15:06:43]
13/01/2008 19:38:10 HLL
הפסיקה לצורך העניין היא בידיוק כמו API של חלונות כשאתה עושה
CreateWindow לדוגמא (סתם זרקתי)

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

עיין ערך VESA VBE Standart 3.0
עמודים: 1