📄 system.cpp
字号:
#include "system.h"
#include "video.h"
#include "interrupt.h"
struct_pyos_Gdtr class_pyos_System::m_gdtr ;
struct_pyos_Gdt class_pyos_System::m_gdt ;
/* 系统初始化 */
void class_pyos_System::Init()
{
/* 初始化Gdt表 */
InitGdt() ;
/* 初始化段寄存器 */
InitSegRegister() ;
/* 初始化中段 */
class_pyos_Interrupt::Init() ;
}
/* 初始化段寄存器 */
void class_pyos_System::InitSegRegister()
{
__asm__( "mov $0x10 , %ax" ) ; //使用第gdt表中的第3项 gdtSystemDate
__asm__( "mov %ax , %ds" ) ;
__asm__( "mov %ax , %ss" ) ;
__asm__( "mov %ax , %es" ) ;
__asm__( "mov %ax , %fs" ) ;
__asm__( "mov %ax , %gs" ) ;
__asm__( "mov $0x9ffff , %esp" ) ; //重新设置堆栈,从0xA0000开始,就是显示内存区了
}
/* 读端口 */
unsigned char class_pyos_System::FromPort( unsigned short port )
{
/*
% 表示此是寄存器
=a(result) 表示让 result = eax
d(port) 表示让 edx = port
*/
unsigned char result ;
__asm__( "in %%dx , %%al" : "=a"( result ) : "d"( port ) ) ;
return result ;
}
/* 写端口 */
void class_pyos_System::ToPort( unsigned short port , unsigned char data )
{
__asm__( "out %%al , %%dx" : : "a"( data ) , "d"( port ) ) ;
}
/* 初始化GDT表 */
void class_pyos_System::InitGdt()
{
m_gdtr.GdtLengthLimit = sizeof( m_gdt ) - 1 ;
m_gdtr.GdtAddr = &m_gdt ;
m_gdt.gdtSystemCode.DorB = 1 ;
m_gdt.gdtSystemCode.DPL = 0 ;
m_gdt.gdtSystemCode.G = 1 ;
m_gdt.gdtSystemCode.P = 1 ;
m_gdt.gdtSystemCode.S = 1 ;
m_gdt.gdtSystemCode.Saved = 0 ;
m_gdt.gdtSystemCode.SegBaseAddr_0_15 = 0 ;
m_gdt.gdtSystemCode.SegBaseAddr_16_23 = 0 ;
m_gdt.gdtSystemCode.SegBaseAddr_24_31 = 0 ;
m_gdt.gdtSystemCode.SegLengthLimit_0_15 = 0xffff ;
m_gdt.gdtSystemCode.SegLengthLimit_16_19 = 0xff ;
m_gdt.gdtSystemCode.Type = 0xa ;
m_gdt.gdtSystemDate = m_gdt.gdtSystemCode ;
m_gdt.gdtSystemDate.Type = 0x2 ;
m_gdt.gdtUserCode = m_gdt.gdtSystemCode ;
m_gdt.gdtUserCode.DPL = 3 ;
m_gdt.gdtUserDate = m_gdt.gdtUserCode ;
m_gdt.gdtUserDate.Type = 0x2 ;
// 内嵌汇编载入gdt
__asm__( "lgdt %0" : "=m"( m_gdtr ) ) ; //载入GDT表
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -