在实模式下,可通过13号BIOS中断读取磁盘扇区。
但保护模式下,中断方式发生改变。中断处理程序的段基址通过IDT表中的描述符得到,而非实模式下的中断向量表。
故保护模式下,已无法使用实模式下的中断处理程序。
磁盘读写属于I/O,可通过直接的IO读写来完成,实际上BIOS的中断处理程序也是这样完成的。
以下是读取磁盘扇区的DEMO代码:
#include
"
../plib.h
"
#define Cs 0
#define Hs 0
#define Ss 1
#define READSECTOR_TIMEOUT 10000;
unsigned int readSector(unsigned long partitionOffset, unsigned long driveNumber, unsigned long lba, unsigned char * data, int limit)
{
// print("readSector start=%x ",data);
lba += partitionOffset;
/*
unsigned short c = lba / (getMaxHead () * getMaxSector ()) + Cs;
unsigned char h = (lba / getMaxSector ()) % getMaxHead () + Hs;
unsigned char s = lba % getMaxSector () + Ss;
print("lba=%lu,c=%u,h=%u,s=%u ",lba,c,h,s);
return readSector (driverNumber, c, h, s, data, limit);
*/
// print("limit=%d, numberOfSector=%d ",limit, numberOfSector);
unsigned in
#define Cs 0
#define Hs 0
#define Ss 1
#define READSECTOR_TIMEOUT 10000;
unsigned int readSector(unsigned long partitionOffset, unsigned long driveNumber, unsigned long lba, unsigned char * data, int limit)
{
// print("readSector start=%x ",data);
lba += partitionOffset;
/*
unsigned short c = lba / (getMaxHead () * getMaxSector ()) + Cs;
unsigned char h = (lba / getMaxSector ()) % getMaxHead () + Hs;
unsigned char s = lba % getMaxSector () + Ss;
print("lba=%lu,c=%u,h=%u,s=%u ",lba,c,h,s);
return readSector (driverNumber, c, h, s, data, limit);
*/
// print("limit=%d, numberOfSector=%d ",limit, numberOfSector);
unsigned in