在实模式下,可通过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 int numberOfSector;
if
#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 int numberOfSector;
if

本文介绍了在保护模式下,如何通过直接I/O操作而非使用BIOS中断读取磁盘绝对扇区的方法。保护模式下,中断处理机制与实模式不同,无法直接使用13号BIOS中断。示例代码展示了实现这一操作的DEMO。
最低0.47元/天 解锁文章
1515

被折叠的 条评论
为什么被折叠?



