TAKAI Kousuke
tak****@kmc*****
2003年 3月 31日 (月) 00:48:57 JST
高井@京大マイコンクラブ です。 <3E868****@cinet*****>の記事において Osamu Tomita <tomit****@cinet*****>さんは書きました: >> お送りしたのは、grub-0.5用のパッチです。現在の仕様では、カーネルサイズ >> 1024KB以上の大きなものをブートすることが出来ないのですが、無理矢理ブート >> 出来るようにしてみました。 >> カーネルヘッダーのサイズを示す数値が桁溢れを起こしてしまうのを逆手に取って、 >> この数値が512KB未満であれば桁溢れがあったと見なして繰り上がり分を加算して >> います。これでブート可能なカーネルのサイズはシフトして、512KB以上1536KB >> 未満となるという目論見です。 >> とりあえず問題無くブートしているように見えますが、何か他に問題点はありません >> でしょうか。識者の方に、御意見を伺いたいと思います。 このままだと512KB未満のカーネルがロードできなくなるように 見えます (特定のマシン用に不要なドライバを徹底的に削ぎ落とすと 今でも512KBは切れそうな気はするのですが…) というわけで、 zImage のときはオーバーフローの処理をしないように してみましたがいかがでしょうか。 bzImage で、サイズが 448KB 未満に なってしまうときはオーバーフローを仮定して 1024KB を加算します。 1つの式で書くと長くなってしまうのでインライン関数に分けました。 カーネルのサイズが 512KB より少し小さい程度だと (zImage で収まるか、 とか面倒なことを考えずに) 最初から bzImage を作る人が多いような 気がしますので、少しマージンを見込んで 448KB までにしています。 448 という数字は 512 の 7/8 ですが特に意味はありません。 ただ、このマージンのためロードできるカーネルは 1472KB 未満に なってしまいます。これではやはり不足気味でしょうか? # オーバーフローしたときは特定の値 (0 とか) が入っているように # なっていればまだよかったんですが… --- grub-0.5/shared_src/boot.c.orig Sun Mar 21 22:30:05 1999 +++ grub-0.5/shared_src/boot.c Mon Mar 31 00:20:17 2003 @@ -31,6 +31,18 @@ entry_func entry_addr; static struct mod_list mll[99]; +static inline unsigned int +linux_text_len (const char *const buffer) +{ + const unsigned short kernel_len + = *(unsigned short *) (buffer + LINUX_KERNEL_LEN_OFFSET); + unsigned int text_len = (unsigned int) kernel_len << 4; + + if ((buffer[LINUX_SETUP_LOAD_FLAGS] & LINUX_FLAG_BIG_KERNEL) + && text_len < (448 << 10)) /* 448K = 512K * 7/8 */ + text_len += 0x10000 << 4; + return text_len; +} /* * The next two functions, 'load_image' and 'load_module', are the building @@ -186,9 +198,7 @@ (buffer+LINUX_SETUP_LEN_OFFSET))) << 9)) <= LINUX_SETUP_MAXLEN) && 512 + data_len < len /* added by K.Takai */ - && ((text_len - = (((long)*((unsigned short *) - (buffer+LINUX_KERNEL_LEN_OFFSET))) << 4)), + && (text_len = linux_text_len(buffer), (512 + data_len + text_len) <= ((filemax+15)&0xFFFFFFF0))) { int big_linux = buffer[LINUX_SETUP_LOAD_FLAGS] & LINUX_FLAG_BIG_KERNEL; -- 京大マイコンクラブ 高井 幸輔 <tak****@kmc*****>