ウォンツテック

そでやまのーと

bootmiddle.SのBIOS命令e801で取得したメモリサイズをkernelから読む。
bootmiddle.Sにheaderファイルをincludeしてそのファイル上の変数にメモリサイズを格納したけど、それをkernel上から読み込むのに苦労した。。
bootacient, bootmiddle読み込み時はメモリ上の0x90000上をCPUは読み込んでおり実際headerファイル上の変数は0x9yyyyの領域に保存される。しかしメモリ0x1000に配置されているkernelにjmpした時にこの変数をシンボルを使用してu_int16_t memsize = MEMORY_SIZE;のようには取得出来ない。何故ならばこのMEMORY_SIZEのシンボルのアドレスは0x9yyyyの「0xyyyy」になっているので(セグメントのアドレスが0x9000なのでオフセットのアドレスのみが保存されている)、u_int16_t memsize = MEMORY_SIZE;とやると0xyyyy上の2バイトの文字を取得してきてしまう。これを0x9yyyy上の2バイトから取得してくるには

u_int16_t memsize = ((u_int16_t*)(&MEMORY_SIZE))[0x90000/2];

のようにする必要がある。
※0x90000を2で割ったのは(u_int16_t*)でキャストしているので、+1ポインタをずらすと2バイト増えるから。