⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdt.cpp

📁 Jazmyn is a 32-bit, protected mode, multitasking OS which runs on i386 & above CPU`s. Its complete
💻 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 + -