Osamu Tomita
tomit****@cinet*****
2003年 3月 30日 (日) 14:19:57 JST
富田です。 現状のPC-98用grubの仕様では、1024KB以上のサイズの大きなカーネルをブートする ことが出来ません。 カーネルヘッダーに書き込まれるサイズが桁溢れを起こしてしまうためだそうですが これを逆手に取って無理矢理、大きなサイズのカーネルをブートするパッチを作って 見ました。 サイズを示す数値が、512KB未満であれば、桁溢れを起こしたと見なして繰り上がり 分(1024KB)を足してしまうパッチです。これで、ブート可能なカーネルサイズは シフトして、512KB以上1536KB未満になるはずです。 取り敢えず問題無くブートしているように見えますが、何か問題点が有るでしょうか。 識者の方の御意見をうかがえればと思っています。 カーネルサイズも、バージョンが上がる度に大きくなっていますし、それに加えて PC-98用のものでは、フロッピーディスクドライバーやリアルタイムクロックなど モジュール化するとトラブルの発生するものがあるので、余計にサイズが大きくなり ます。必要に迫られての修整と思っていますが、いかがでしょうか? diff -Nru grub-0.5-20020706/shared_src/asm.S grub-0.5-20030330/shared_src/asm.S --- grub-0.5-20020706/shared_src/asm.S 2002-06-26 03:37:42.000000000 +0900 +++ grub-0.5-20030330/shared_src/asm.S 2003-03-30 12:28:01.000000000 +0900 @@ -72,7 +72,7 @@ .long _edata - _start VARIABLE(version_string) #ifdef PC9800 - .string "0.5.98.2" + .string "0.5.98.3" #else .string "0.5" #endif diff -Nru grub-0.5-20020706/shared_src/boot.c grub-0.5-20030330/shared_src/boot.c --- grub-0.5-20020706/shared_src/boot.c 1999-03-21 22:30:05.000000000 +0900 +++ grub-0.5-20030330/shared_src/boot.c 2003-03-30 11:43:36.000000000 +0900 @@ -187,7 +187,11 @@ <= LINUX_SETUP_MAXLEN) && 512 + data_len < len /* added by K.Takai */ && ((text_len - = (((long)*((unsigned short *) + = (!(*((unsigned short *) + (buffer+LINUX_KERNEL_LEN_OFFSET)) & 0x8000) ? + (((long)*((unsigned short *) + (buffer+LINUX_KERNEL_LEN_OFFSET))) << 4) | 0x100000 + : ((long)*((unsigned short *) (buffer+LINUX_KERNEL_LEN_OFFSET))) << 4)), (512 + data_len + text_len) <= ((filemax+15)&0xFFFFFFF0))) {