GDLWXStream::GDLWXStream( int width, int height ) : GDLGStream( width, height, "wxwidgets") , m_dc(NULL) , m_bitmap(NULL) , m_width(width), m_height(height) , gdlWindow(NULL) { m_dc = new wxMemoryDC(); m_bitmap = new wxBitmap( width, height, -1 ); m_dc->SelectObject( *m_bitmap); if( !m_dc->IsOk()) { m_dc->SelectObject( wxNullBitmap ); delete m_bitmap; delete m_dc; throw GDLException("GDLWXStream: Failed to create DC."); } //::plstream(); // sdev( "wxwidgets" ); spage( 0.0, 0.0, m_width, m_height, 0, 0 ); // SETOPT( "text", "1" ); // use freetype? // SETOPT( "smooth", "1" ); // antialiased text? this->plstream::init(); plP_esc( PLESC_DEVINIT, (void*)m_dc ); plstream::set_stream(); // plgpls( &thePls); // in GDLGStream }
setup_paging() { int i; //设置页表的初始地址 pg_dir = (int *)((((int)&pg_mem) + 4095) & -4096); //分四页,每页1024*4个字节,即4KB pg0 = pg_dir + 1024; pg1 = pg0 + 1024; pg2 = pg1 + 1024; pg3 = pg2 + 1024; pg_dir[0] = (int)pg0 | PTE_P | PTE_W | PTE_U; // identity map 16M pg_dir[1] = (int)pg1 | PTE_P | PTE_W | PTE_U; pg_dir[2] = (int)pg2 | PTE_P | PTE_W | PTE_U; pg_dir[3] = (int)pg3 | PTE_P | PTE_W | PTE_U; //这一步是用来对齐的吗?一个物理内存块是4KB,页表初始地址管理四个页块,而pg0是从pg_dir+1024开始的,因此把4~1024这部分赋值为0 for (i=4;i<1024;i++) pg_dir[i] = 0; //初始化四个页面。每个页起初都是可用的,又因为一个4KB页为2^12,因此页块的物理地址低12位都是0,用于存储页的状态(PTE_P | PTE_W | PTE_U)。 for (i=0;i<4096;i++) pg0[i] = (i<<12) | PTE_P | PTE_W | PTE_U; // trick to write all 4 contiguous pages //页起始地址设置 pdir(pg_dir); //设置页机制(使能) spage(1); }