网站建设法规,英德住房和城乡建设部网站,广东宏福建设有限公司网站,怎么做网站投放广告的代理商当物理内存不够时就把不常用的内存暂时存入磁盘#xff0c;并且描述符的P位置0#xff0c;把要使用的段放入内存#xff0c;描述符P位置1
但是这种方式会产生大量内存碎片#xff0c;影响内存分配效率
设想一个虚拟内存#xff0c;每隔任务都有他独立的虚拟内存#xf…
当物理内存不够时就把不常用的内存暂时存入磁盘并且描述符的P位置0把要使用的段放入内存描述符P位置1
但是这种方式会产生大量内存碎片影响内存分配效率
设想一个虚拟内存每隔任务都有他独立的虚拟内存虚拟内存和实际物理内存大小相等 因为创建系统内核的页目录时内核程序已经加载到内存了为了方便起见本书设定在内核的页部件输出的物理地址应与段部件输出的地址相同
页目录项和页表项的组成格式 P存在位为1时表示页表或页存在在内存中RW读写位为1时可读可写US用户/管理位为1时允许所有访问0时只允许0、1、2特权级访问PWT和高速缓存有关间接决定改善页面访问效率PCD决定是否采用高速缓存A已访问位显示使用频率D脏位表示次页表或页已写入数据PAT固定为0G全局位表示是否为全局性质的放入高速缓存访问速度加快 ;准备打开分页机制;创建系统内核的页目录表PDT;页目录表清零 mov ecx,1024 ;1024个目录项mov ebx,0x00020000 ;页目录的物理地址xor esi,esi.b1:mov dword [es:ebxesi],0x00000000 ;页目录表项清零 add esi,4loop .b1;在页目录内创建指向页目录自己的目录项mov dword [es:ebx4092],0x00020003 ;在页目录内创建与线性地址0x00000000对应的目录项mov dword [es:ebx0],0x00021003 ;写入目录项页表的物理地址和属性 ;创建与表目录项相对应的页表初始化页表项 mov ebx,0x00021000 ;页表的物理地址xor eax,eax ;起始页的物理地址 xor esi,esi.b2: mov edx,eaxor edx,0x00000003 mov [es:ebxesi*4],edx ;登记页的物理地址add eax,0x1000 ;下一个相邻页的物理地址 inc esicmp esi,256 ;仅低端1MB内存对应的页才是有效的 jl .b2 .b3: ;其余的页表项置为无效mov dword [es:ebxesi*4],0x00000000 inc esicmp esi,1024jl .b3 ;令控制寄存器CR3指向页目录并正式开启页功能 mov eax,0x00020000 ;PCDPWT0mov cr3,eaxmov eax,cr0or eax,0x80000000mov cr0,eax ;在PE1的情况下保护模式PG置1开启分页机制;在页目录内创建与线性地址0x80000000对应的目录项mov ebx,0xfffff000 ;页目录自己的线性地址 mov esi,0x80000000 ;映射的起始地址shr esi,22 ;线性地址的高10位是目录索引shl esi,2mov dword [es:ebxesi],0x00021003 ;写入目录项页表的物理地址和属性;目标单元的线性地址为0xFFFFF200;将GDT中的段描述符映射到线性地址0x80000000sgdt [pgdt]mov ebx,[pgdt2]or dword [es:ebx0x104],0x80000000 ;保护模式下初始代码段描述符or dword [es:ebx0x184],0x80000000 ;内核栈段描述符or dword [es:ebx0x204],0x80000000 ;显示缓冲区描述符or dword [es:ebx0x284],0x80000000 ;公共例程段描述符or dword [es:ebx0x304],0x80000000 ;内核数据段描述符or dword [es:ebx0x384],0x80000000 ;内核代码段描述符add dword [pgdt2],0x80000000 ;GDTR也用的是线性地址 lgdt [pgdt];为程序管理器的TSS分配内存空间mov ebx,[core_next_laddr]call sys_routine_seg_sel:alloc_inst_a_pageadd dword [core_next_laddr],4096alloc_inst_a_page: ;分配一个页并安装在当前活动的;层级分页结构中;输入EBX页的线性地址push eaxpush ebxpush esipush dsmov eax,mem_0_4_gb_seg_selmov ds,eax;检查该线性地址所对应的页表是否存在mov esi,ebxand esi,0xffc00000shr esi,20 ;得到页目录索引并乘以4 or esi,0xfffff000 ;页目录自身的线性地址表内偏移 test dword [esi],0x00000001 ;P位是否为“1”。检查该线性地址是 jnz .b1 ;否已经有对应的页表;创建该线性地址所对应的页表 call allocate_a_4k_page ;分配一个页做为页表 or eax,0x00000007mov [esi],eax ;在页目录中登记该页表.b1:;开始访问该线性地址所对应的页表 mov esi,ebxshr esi,10and esi,0x003ff000 ;或者0xfffff000因高10位是零 or esi,0xffc00000 ;得到该页表的线性地址;得到该线性地址在页表内的对应条目页表项 and ebx,0x003ff000shr ebx,10 ;相当于右移12位再乘以4or esi,ebx ;页表项的线性地址 call allocate_a_4k_page ;分配一个页这才是要安装的页or eax,0x00000007mov [esi],eax pop dspop esipop ebxpop eaxretf
allocate_a_4k_page: ;分配一个4KB的页;输入无;输出EAX页的物理地址push ebxpush ecxpush edxpush dsmov eax,core_data_seg_selmov ds,eaxxor eax,eax.b1:bts [page_bit_map],eaxjnc .b2inc eaxcmp eax,page_map_len*8jl .b1mov ebx,message_3call sys_routine_seg_sel:put_stringhlt ;没有可以分配的页停机 .b2:shl eax,12 ;乘以40960x1000 pop dspop edxpop ecxpop ebxret