[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);
}