📄 gdt.cpp
字号:
/*
* Copyright (C) 2004, Thejesh AP. All rights reserved.
*/
#include <sys\types.h>
#include <stdlib.h>
#include <jazmyn\i386.h>
#include <jazmyn\desc.h>
#include <jazmyn\gdt.h>
#include <drivers\console.h>
#include <drivers\keyboard.h>
GDT::GDT()
{
SGDT(&limit,&base);
next_free_index = (limit + 1) / 8;
}
GDT::~GDT()
{
}
ushort GDT::set_ldt(uint base,uint limit)
{
seg_desc *desc = (seg_desc*)(this->base + next_free_index*8);
desc -> lim_low = limit&0xFFFF;
desc -> lim_flags = ((limit>>16)&0xF)|D_BIG;
desc -> base_low = base&0xFFFF;
desc -> base_mid = (base>>16)&0xFF;
desc -> base_high = (base>>24)&0xFF;
desc -> access = D_PRESENT|D_DPL_0|D_LDT;
this -> limit = next_free_index*8 + 7;
LGDT(this->limit,this->base);
ushort __ret = (next_free_index << 3);
next_free_index++;
return __ret;
}
ushort GDT::set_tss(uint base,uint limit)
{
seg_desc *desc = (seg_desc*)(this->base + next_free_index*8);
desc -> lim_low = limit&0xFFFF;
desc -> lim_flags = ((limit>>16)&0xF)|D_BIG;
desc -> base_low = base&0xFFFF;
desc -> base_mid = (base>>16)&0xFF;
desc -> base_high = (base>>24)&0xFF;
desc -> access = D_PRESENT|D_DPL_0|D_AVAIL_TSS;
this -> limit = next_free_index*8 + 7;
LGDT(this->limit,this->base);
ushort __ret = (next_free_index << 3);
next_free_index++;
return __ret;
}
void GDT::change_to_avail(ushort tss_sel)
{
seg_desc *desc = (seg_desc*)(this->base + tss_sel);
desc->access = 0;
desc->access = D_PRESENT|D_DPL_0|D_AVAIL_TSS;
}
void GDT::disp(ushort sel)
{
seg_desc *d = (seg_desc*)(this->base + sel);
uint _b = (d->base_high<<24 | d->base_mid<<16 | d->base_low);
cout<<"base :"<<_b<<endl;
cout<<"limit:"<<d->lim_low<<endl;
cout<<"access:"<<d->access<<endl;
}
ushort GDT::set_task_gate(ushort sel)
{
seg_desc *desc = (seg_desc*)(this->base + next_free_index*8);
desc->base_low = sel;
desc->access = D_PRESENT|D_DPL_0|5;
this -> limit = next_free_index*8 + 7;
LGDT(this->limit,this->base);
ushort __ret = (next_free_index << 3);
next_free_index++;
return __ret;
}
GDT _gdt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -