Męczę sie od jakiegoś czasu z jednym problemem, z detekcją kanału ide do ktorego podłączony jest dysk z ktorego został wystartowany system. pod dosem zeby było śmieszniej (właściwie pod dosem win98, ale na jedno wychodzi). wpadlem na pomysl aby skorzystać z przerwania 13h, ale idea umarła w momencie, w ktorym zobaczyłem, że dysk secondary master został pramapowany z numeru 82h do 80h, czyli do primary master (numer dysku przy wywołaniu funkcji przerwania 13h). Jak odczytać mapowanie pierwotne, mapowanie jakie jest w biosie przed odpaleniem systemu ?

Nie mam żadnych przeciwskazań, aby wykonać detekcję w inny sposób, np. poprzez bezposrednie odwołanie się do portów i kontrolera dysków.

Detekcja dysku nie musi się też koniecznie opierać na grzebaniu głębokim w strukturach dosu. Detekcja, z ktorego fizycznego urzadzenia został odpalony system nie jest koneczna. Istnieje możliwość rozpoznania dysku po numerze seryjnym, w sensie podajminumerseryjny(primarysecondary,master/slave), czy jakkolwiek po kolejnych numerach.

Trzecia możliwośc to odczyt konkretnego sektora na kolejnych dyskach i rozpoznanie po sygnaturze. wlasciwie sam tak chcialem zrobic, z tym, ze to przemapowanie mnie ogłupiło (kod ponizej, czyta 2-gi sektor dysku).

Po co mi to ? Do livehd. Mam linuksa na dysku, ktory to chcialbym brać ze sobą. O ile fstab można tak łądnie skonfigurować, że partycja / mozna znaleźć (choćby montowanie po labelu), o tyle opcja 'root' przy ładowaniu kernela tak w lilo jak i w grubie jest ustawiona na sztywno. Uzywam loadlina spod windowsowego dosa. Wiem, ze można z dosa wklepac z palca odpowiednia linijke, ale bardzo zalezy mi na tym, aby pracę wykonał automat.

Tak więc następna możliwość bootloader ktory sam odgadnie co podać do parametru root, nie czytajacy jak grub z partycji ktora nie wiadomo na jakim dysku sie znajduje.

int getdrive(){
  signed char i=8;  // powiedzmy ze beda 2 kontrolery po 4 kanaly = 8 dyskow
  char far* buf=(char far*)malloc(512);
  while(i--){
    asm{
      push es                   // a cholera wie, lepiej wrzucic na stos, niz pozniej szukac buga
      mov  dx,0x0080
      or   dl,[i]
      mov  bx,word ptr [buf]
      mov  ax,word ptr [buf+2]
      mov  es,ax
      mov  ax,0x0201
      mov  cx,0x0002
      int  0x13
      pop  es
    }
    if(!strncmp(buf,"szlaczeklivehd",14))break;
  }
  free(buf);
  return i; // tu jest zawsze 0, nie -1, gdy brak, ale 0, mimo ze to nie primary master
}