שיתוף | בניתי "מערכת הפעלה" זעירה שיודעת להציג תמונות (טוב, בערך...)
-
קראתי אתמול על וירוס מחשבים ישן בשם MEMZ שבין היתר היה משכתב את ה MBR למיני תוכנה שהייתה מציגה אנימציה על המסך כשהמשתמש היה מפעיל את המחשב
כלומר כותבת שם קוד שלא צריך מערכת הפעלה שתטפל בו אלא יודע לרוץ עצמאית ולהשתמש בפסיקות תוכנה ישירות מהביוס כדי לגשת לחומרה ישירות
הנושא סקרן אותי ולכן ניסיתי לכתוב משהו כזה בעצמי
תוכנה שבהפעלת המחשב תציג תמונה על המסך
זה מצריך שהמחשב יהיה בתצורת BIOS או לפחות יתמוך ב CSM
הרעיון הוא שמהרגע שנטען ה MBR לזיכרון במקום שזה יעבור לחפש את ה loader של המערכת הפעלה מחליפים את זה בקוד שעושה פעולות אחרות - במקרה שלנו מציגים תמונה
הקוד נכתב באסמבלי 16bits ורץ על המעבד עוד כשהוא במצב real mode!
הקוד עצמו שוקל רק 81 בתים בזיכרון והוא יושב בסקטור הראשון של הדיסק
הוא טוען לזיכרון את התמונה עצמה שיושבת ב 126 הסקטורים שאחריו
את התמונה עצמה המרתי ל bmp בלי דחיסה בגודל המירבי שאפשרי במצב VGA mode 13h (שזה 320x200 פיקסלים בעומק צבע של 8 ביטים) וממנו הורדתי את ה headers כך שנשארו לי רק נתוני התמונה
הצבעים יצאו לא כמו במקור בגלל חוסר התאמה במפת הצבעים בין המקודד ש ffmpeg השתמש בו למפה שאיתה קורא הביוס את התמונה
הרצתי את זה אצלי ב VB ועוד לא ניסיתי על מחשב ממש - מוזמנים לנסות ולעדכןמצורף הקוד בסינטקס של NASM (וסליחה שאין תיעוד פשוט אין לי סבלנות לכתוב אותו)
[ORG 0x7C00] [BITS 16] start: JMP SHORT main NOP main: CLI XOR ax, ax MOV ds, ax MOV es, ax MOV fs, ax MOV gs, ax MOV ss, ax MOV sp, 0x7C00 STI MOV [BOOT_DRIVE], dl MOV ah, 0x42 MOV dl, [BOOT_DRIVE] MOV si, DAP INT 0x13 JC disk_error MOV ah, 0x00 MOV al, 0x13 INT 0x10 MOV ax, 0x1000 MOV ds, ax XOR si, si MOV ax, 0xA000 MOV es, ax XOR di, di MOV cx, 32000 CLD REP MOVSW hung: CLI HLT JMP hung disk_error: CLI HLT JMP disk_error BOOT_DRIVE db 0 align 4 DAP: db 0x10 db 0 dw 126 dw 0x0000 dw 0x1000 dq 1 times 510-($-$$) db 0 dw 0xAA55ככה זה נראה בפועל

והנה הקובץ עצמו
יש גרסת bin שאפשר לפרוס על אונקי ולהעלות באתחול ויש גרסת vdi שאפשר להעלות ב virtualbox
myos.vdi
myos.imgעריכה: התמונה המקורית היא כמובן תמונת הפרופיל שלי...
)שאתה עושה