[C] CD Rom Sektoren auslesen via BIOS Interrupt

jkallup

Erfahrenes Mitglied
Hallo,

wie kann man unter einen non-OS - also ein eigenes OS (kein win, lin ...) via BIOS Sectoren auslesen?

Ich komme da nicht klar,mit der ganzen ATAPi Driver sachen.
habe bis jetzt einen kernel, der in den protect mode schalten kann, ein paar strings ausgeben kann und nun oll halt ein dateisystem implementiert werden.
dazu ist es aber notwendig, erstmal sektoren einzulesen .....

danke für infos
jkallup
 
hab ich schon, ich weiss auch schon, das ectoren 2048 bytes groß sind,
aber ich weiss nicht wie man mit int386(0x13,&regs,&regs);
sektoren einlesen kann.

Hallo,

ich habe folgendes gefunden:

http://en.wikipedia.org/wiki/INT_13H#INT_13h_AH.3D02h:_Read_Sectors_From_Drive

aber wie ich das verstanden habe, hat ein cdrom laufwerk nur eine Spur (Spirale) und keine
Heads und Cylinders ....

wie kommt man dann an die gewünschte Sector Struktur?
danke
Jens
 
Zuletzt bearbeitet von einem Moderator:
habe folgendes:
klappt aber nicht so recht ... :-(


Code:
#define FP_SEG(fptr) ((unsigned)((unsigned long)(fptr) >> 16))
#define FP_OFF(fptr) ((unsigned)(fptr))

#define MK_FP(seg,off) ((void*) (((unsigned long)(seg) << 16) | (unsigned)(off)))


typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

typedef struct {
  unsigned long low;
  unsigned long high;
} QDWORD;

void PrintSector ( void * );
void LBASectorRead(void *, double );
int check_ext_present();

QDWORD double2qd( double x )
{
  QDWORD qdw;
  qdw.high = (unsigned long)(x/4294967296.0);
  qdw.low = (unsigned long) x;
  return qdw;
}

#pragma pack(1)
typedef struct disk_packet
{
  BYTE size_pack;	//size of packet must be 16 or 16+
  BYTE reserved1;	//reserved
  BYTE no_of_blocks;	//nof blocks for transfer
  BYTE reserved2;	//reserved
  DWORD TransAddr;	//address in segff format
  QDWORD lba;		//quad word sector to read
};
struct disk_packet disk_pack;

void LBASectorRead(void *buffer, double lba )
{
  REGS uRegs;

  disk_pack.TransAddr = 0;
  disk_pack.size_pack = sizeof(disk_pack); //set size to 16
  disk_pack.no_of_blocks = 1; //1 block
  disk_pack.reserved1 = 0x0; 
  disk_pack.reserved2 = 0x0;
  disk_pack.TransAddr = (unsigned long) MK_FP( FP_SEG(buffer),FP_OFF(buffer));
  disk_pack.lba=double2qd( lba );

  uRegs.x.ds  = FP_SEG( &disk_pack );
  uRegs.x.esi = FP_OFF( &disk_pack );

  uRegs.b.dl = 0x80;
  uRegs.b.ah = 0x42;

  int386(0x13,&uRegs,&uRegs);

  printf("\n\nError: %x ", uRegs.b.ah );
}


int testfat ( void )
{
  static unsigned char currentMBR[2048] = {0};
  int i;

  LBASectorRead(currentMBR, 17 );
  printk("%c", currentMBR );
}
 
Zurück