M1330 GRUB2 Media Direct Button Patch
Nachdem ich meinen Dell XPS M1330 mit 4 GB RAM (vorher: 2GB RAM), einer SuperTalent UltraDrive GX 128 GB SSD (vorher: 160GB HDD) und einer neuen Intel WiFi Link 5300AGN 802.11 Draft-N WLAN MIniPCIe Karte (vorher Broadcom BCM4328 802.11a/b/g/n MiniPCIe Karte, damit WLAN endlich auch nun unter Linux einwandfrei tut) aufgerüstet habe, wollte ich näturlich es wieder so haben, dass ich mit der Dell MediaDirect Taste zum einschalten Linux booten kann und mit der normalen Einschalttaste Windows.
Vorher auf der 160 GB HD war es über einen entsprechenden boot.ini Eintrag auf der versteckten Dell Media Direct Windows XP Embedded Partition gelöst, der dann darauf hin den GRUB Bootsektor lud.
Aber nun hatte ich eine neue leere SSD mit nichts drauf. Ich partitionierte von daher aller erstmal die SSD mit der UBCD in 6 Partitionen. Und zwar so:
| /dev/sda1 | 29.81 GB | NTFS | Windows 7 System |
| /dev/sda2 | 14.85 GB | NTFS | Daten |
| /dev/sda3 | 54.93 MB | Hidden FAT16 | Für OSDev Zeugs ausser QEMU unter Realbedingungen |
| /dev/sda4 | 73.53 GB | Erweiterte Partition | |
| /dev/sda5 | 7.63 GB | Linux Swap | Nur für den Hibernate Kram, ich will ja meine SSD schonen |
| /dev/sda6 | 30.52 GB | EXT4 | / |
| /dev/sda7 | 36.36 GB | EXT4 | /home (mit ecryptfs Private User Verzeichnissen) |
Dann installierte ich Ubuntu 9.10 und danach 64-bit Windows 7, und stellte mithilfe LiveCD den GRUB2 MBR wieder her.
Und dann machte ich schliesslich mich ans Werk. Ich lud mir die GRUB2 1.97 Beta 4 Sourcen samt Ubuntu 9.10 Patches herrunter und dann modifizierte ich die /boot/i386/pc/boot.S so, so dass wenn ich "nicht" die MediaDirect Taste zum einschalten drücke, dass dann der MBR den Bootsektor der ersten Partition (/dev/sda1) lädt und ausführt, und das bevor noch der restliche GRUB2 Kram vom MBR nachgeladen wird, sprich nämlich fast ganz am Anfang des MBR Codes. Undwenn ich jetzt die MediaDirect Taste zum einschalten bestätige, wird mein eingepatchter Code per einen Condition Jump übersprungen und der GRUB2 Maincode dann nachgeladen und ausführt. GRUB2 lädt entsprechend näturlich dann den Linux Kernel.
Die Abfrage, ob man die MediaDirect Taste bestätigt hat, ist recht simpel. Also je nachdem, wenn man die MediaDirect Taste bestätigt hat oder nicht, dann setzt das BIOS im CMOS an der Stelle 0x79 das Bit 3 (BItmaske 0x08) oder auch nicht. Das kann man im MBR dann zum Beispiel über folgendem Code recht leicht abfragen (Intel x86 16bit Realmode Syntax):
cli
mov al,0x79
out 0x70,al
nop
nop
nop
in al,0x71
sti
and al,0x08
jnz MediaDirectButtonPressed
MediaDirectButtonNotPressed:
.....
MediaDirectButtonPressed:
Und hier ist auch endlich nun der Link zum Patch: http://vserver.rosseaux.net/stuff/m1330boot.diff.txt
Viel Spass damit! 















