[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[b-free: 1377] Re: HDからのブート (Re: Re^2: FD で bootする方法を教えてください)
隆一です。
From: Takanori Hayashi <takanori@ohsaki.meidensha.co.jp>
Subject: [b-free: 1376] Re: HDからのブート (Re: Re^2: FD で bootする方法を教えてください)
Date: Fri, 17 Apr 98 08:59:57 +0900
> 林です。
>
...[snip]...
> naitoh_r> 具体的には、BIOS で変換後の CHS と変換前の CHS を求めて、この値がどう
> naitoh_r> いう計算で変換しているかが分かればいいわけです。
> naitoh_r>
> naitoh_r> つまり、
> naitoh_r>
> naitoh_r> 変換前: C/H/S = (2000/16/63)
> naitoh_r> 変換後: C/H/S = (1000/32/63)
> naitoh_r>
> naitoh_r> となっていた場合、
> naitoh_r>
> naitoh_r> ヘッド数を実際の値の 2 倍にして、シリンダ数を 1024 以下にしているわけ
> naitoh_r> ですから、HD へのアクセスは、N = 2 と定義して、
> naitoh_r>
> naitoh_r> eCyl = (Cyl * N) + (Head / dHead); /* head DIV dHead */
> naitoh_r> eHead = (Head % dHead); /* head MOD dHead */
> naitoh_r> eSector = Sector; /* used as is */
> naitoh_r>
> naitoh_r> Cyl/Head/Sector は、BIOS ベースでのアクセスする位置を示したもの。
> naitoh_r> eCyl/eHead/eSector は、ハードウェアベースのアクセスする位置を
> naitoh_r> 示したもの。
> naitoh_r> dHead は、ハードウェアのヘッド数を示したもの。
> naitoh_r>
> naitoh_r> にすればいいようです。
> naitoh_r> あとは、OS (2nd boot) が BIOS の変換後のジオメトリを知る手続きさえ
> naitoh_r> わかれば、ジオメトリを BIOS で変換している HD でもアクセスするように
> naitoh_r> 変換することができそうです。
>
> BIOSのジオメトリの方が取得が難しいのでしょうか。
> INT13に何かなかったでしょうか?
> # INT13が使えない?
INT 13 は、16 bit mode 動作時しか使えないので、32bit mode で動いている
2nd boot では使えないんです。
1st boot は INT 13 を使って 2nd boot を HD からロードしているので、
INT 13 は使えるんですがこちらは 512 bytes しかないし。。。
> まあハードウェア・インタフェースでのジオメトリが分かっていれば
> シリンダ数が1024以下になるようにヘッダ数をN倍してやれば良いだけ
> の簡単な計算で済むはずですけど。
> # FAQにそうやる方法が書いてあったような・・・。
> # そうすると値を取得する方法はない?
>
とりあえず、2nd boot が IDE にアクセスする時に BIOS のジオメトリをベー
スにした DHS から HD のジオメトリをベースにした CHS の値にに変換する関
数を作ってみました。
引数として、cylinder, head, sector がありますが、これが読み取りたいブ
ロックの CHS です。ide_info に HD のジオメトリの値が入っています。
計算した結果は、引数 ecylinder, ehead, esector に入ります。
p----------------------------------------------------------------------q
| FROM R.Night |
| E-mail: |
| rnaitoh@st.rim.or.jp |
| Key fingerprint = 89 EB 77 95 40 C0 3C CC 37 A1 A7 FA 1C 66 FF D0 |
b----------------------------------------------------------------------d
/* 512MB 以上の HD のとき、ジオメトリ変換の値を計算する
*
*/
int
calculate_translate_geometry (struct ide_id *ide_info,
int cylinder, int head, int sector,
int *ecylinder, int *ehead, int *esector)
{
int dhead;
int N = 0;
/* シリンダ数が 1024 よりも大きい値のときには、BIOS が
* ジオメトリ変換をしているとみなす
*/
if (ide_info->n_cylinder > 1024)
{
N = calc_N (ide_info->n_cylinder);
dhead = ide_info->n_head;
*ecylinder = (cylinder * N) + (head / dhead); /* head DIV dHead */
*ehead = (head % dhead); /* head MOD dHead */
*esector = sector; /* used as is */
}
return (N);
}
calc_N (int cylinder)
{
int N, N2;
cylinder = ROUNDUP (cylinder, 1024);
N = (cylinder - 1) / 1024;
for (N2 = 1; N2 < N; N2 = N2 * 2)
{
;
}
return (N + 1);
}