Форум программистов CodeGuru
16 Июль 2018, 16:45:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с таблицами IDTR и GDTR защищенного режима проца  (Прочитано 9073 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Lexus
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« : 02 Май 2006, 01:48:27 »

Я сейчас нахожусь в защищенном режиме и хочу перепрограммировать таблицы IDTR и GDTR. Вроде все правильно пишу, но прога не работает и тупо комп на этом месте перезагружается. Может кто поможет, в чем может быть ошибка? Код привожу ниже. Программа выполняется с функции begin.
Код:
#define gdt_adr 0x700
#define idt_adr 0x10700
#define video_memory 0xB8000
#define MemPosCursor 0x10F00#define u_8 unsigned char
#define s_8 signed char
#define u_16 unsigned short
#define s_16 signed short
#define u_32 unsigned long
#define s_32 signed long
#define s_64 signed long long
#define u_64 unsigned long long
#define f_32 float
#define f_64 double
#define f_80 long double
#define null 0x0
#define NULL 0x0
typedef struct
{
u_16 size;
u_32 address;
}gdt_t;

typedef struct
{
u_16 size;
u_32 address;
}idt_t;

typedef struct
{
u_16 limit;
u_16 base_1;
u_8 base_2;
u_8 atr;
u_8 lim_atr;
u_8 base_3;
}gdt_descr;

typedef struct
{
u_16 offset_1;
u_16 selector;
u_8 temp;
u_8 type_atr;
u_16 offset_2;
}idt_descr;
void NullHandler()
{
printh(0x7656546);
for(;;);
asm("movw $20h,%ax \n outw %ax,$20h");
asm("iret\n");
};
void NullHandlerError()
{
printh(0x7656546);
for(;;);
asm("movw $20h,%ax \n outw %ax,$20h");
asm("addl %esp,$4");
};
gdt_t sgdt(gdt_t gdt_p)
{
asm ("sgdt %0\n"::"m"(gdt_p));
return gdt_p;
};

idt_t sidt(idt_t idt_p)
{
asm ("sidt %0\n"::"m"(idt_p));
return idt_p;
};

void lgdt(gdt_t gdt_p)
{
asm ("lgdt %0\n"::"m"(gdt_p));
};

void lidt(idt_t idt_p)
{
asm ("lidt %0\n"::"m"(idt_p));
};

void printh(u_32 value)
{
u_8 table[16]="0123456789ABCDEF";
u_8 i;
u_32 temp;
u_16 offset=*((u_16*)MemPosCursor);
for(i=0;i<8;i++)
{
temp=value<<(i*4);
temp=temp>>28;
*((u_8*)video_memory+i*2+offset*2)=table[temp];
}
offset=offset+i;
*((u_16*)MemPosCursor)=offset;
};

void SetDescrGdt(u_32 offset,u_16 limit,u_16 base_1,u_8 base_2,u_8 atr,u_8 lim_atr,u_8 base_3)
{
gdt_descr descr;
descr.limit=limit;
descr.base_1=base_1;
descr.base_2=base_2;
descr.atr=atr;
descr.lim_atr=lim_atr;
descr.base_3=base_3;
*((gdt_descr*)gdt_adr+offset*8)=descr;
};

void SetDescrIdt(u_8 offset,u_32 offset_code,u_16 selector,u_8 temp,u_8 type_atr)
{
idt_descr descr;
descr.offset_1=offset_code;
descr.selector=selector;
descr.temp=temp;
descr.type_atr=type_atr;
offset_code=offset_code>>16;
descr.offset_2=offset_code;
*((idt_descr*)idt_adr+offset*8)=descr;
};
void begin()
{
gdt_t gdt_p;
idt_t idt_p;
gdt_descr descr;
u_16 i;
u_32 temp=(u_32)&NullHandler-0x100000,temp1=(u_32)&NullHandlerError-0x100000;

*((u_16*)MemPosCursor)=0;
gdt_p=sgdt(gdt_p);
idt_p=sidt(idt_p);
// descr=*((gdt_descr*)gdt_p.gdt_address+8);
// printh(gdt_p.size);
gdt_p.address=gdt_adr;
idt_p.address=idt_adr;

SetDescrGdt(0,0,0,0,0,0,0);
SetDescrGdt(1,0xFFFF,0,0x20,0x9A,0xCF,0);
SetDescrGdt(2,0xFFFF,0,0,0x92,0xCF,0);
for(i=0;i<9;i++)
SetDescrIdt(i,temp,0x8,0,0x8E);
for(i=9;i<16;i++)
SetDescrIdt(i,temp1,0x8,0,0x8E);
SetDescrIdt(16,temp,0x8,0,0x8E);
SetDescrIdt(17,temp1,0x8,0,0x8E);
for(i=18;i<32;i++)
SetDescrIdt(i,temp,0x8,0,0x8E);
for(i=32;i<=255;i++)
SetDescrIdt(i,temp,0x8,0,0x8E);

lgdt(gdt_p);
lidt(idt_p);
asm("sti\n");

               // Переход на главную функцию после перепрограммирования таблиц
start();
}
« Последнее редактирование: 05 Май 2006, 02:09:49 от lexus » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!