操作系统真相还原_第5章第2节:内存分页机制

news/2024/11/19 20:32:37/

文章目录

  • 分段机制
  • 分页机制
    • 一级页表
    • 二级页表
    • 启用分页机制的过程
  • 启用分页机制(二级页表)
    • 详解
    • 程序
      • include.inc
      • mbr.s
      • loader.s
    • 写入硬盘
    • 启动bochs执行

分段机制


分页机制

一级页表

二级页表

启用分页机制的过程

1、准备好页目录项及页表
2、将页表地址写入控制寄存器cr3
3、寄存器cr0的PG位置1

1、

P:存在位,1表示存在于内存中,0表示不在内存中
RW:读写位,1表示可读可写,0表示可读不可写
US:访问权限位,1表示任意特权级都能访问该页,0表示特权级别为3不能访问该页
PWT:页级通写位,1表示通写方式(可提高访问效率),与高速缓存有关
PCD:页级高速缓存禁止位,1为启用高速缓存,0表示禁止高速缓存
A:访问位,1表示被CPU访问过,0表示未被CPU访问过
D:脏页位,1表示被修改过,0表示为被修改过,仅对页表项有效
PAT:页属性表位,能够在页面一级上设置内存属性,较为复杂,置0即可
G:全局位,1表示全局页,会在TLB中常驻,0表示不是全局页
AVL:操作系统可自行规定其用途

2、
cr3控制寄存器用于存储页表物理地址,所以cr3寄存器又称为页目录基址寄存器PDBR
使用mov指令在控制寄存器与通用寄存器互传数据:
mov cr[0~7], r32
mov r32, cr[0~7]

3、
将控制寄存器cr0的Page位置1,开启分页

启用分页机制(二级页表)

详解

低端3GB分配给用户空间,高端1GB分配给内核空间
第1个页目录项指向用户空间的起始位置
第769个页目录项指向内核空间的起始位置
页目录表在内存地址0x100000~0x100FFF处
第1个页表在内存地址0x101000~0x101FFF处,写入256个页表项指向低端1MB内存
第1、769个页目录项指向第1个页表
第1024个目录项指向页目录表
第770~1023个页目录项指向以内存地址0x102000为起始地址的254个页表

程序

include.inc

;--------- mbr & loader ---------
LBA_START_SECTOR equ 0x1
SECTOR_COUNT equ 0x4
LOADER_BASE_ADDR equ 0x7E0
LOADER_OFF_ADDR equ 0x0
LOADER_ADDR equ 0x7E00
ARDS_ADDR equ 0x1000;--------- gdt ---------
DESC_G_4K   equ	  1_00000000000000000000000b   
DESC_D_32   equ	   1_0000000000000000000000b
DESC_L	    equ	    0_000000000000000000000b
DESC_AVL    equ	     0_00000000000000000000b
DESC_LIMIT_CODE2  equ 1111_0000000000000000b
DESC_LIMIT_DATA2  equ DESC_LIMIT_CODE2
DESC_LIMIT_VIDEO2  equ 0000_000000000000000b
DESC_P	    equ		  1_000000000000000b
DESC_DPL_0  equ		   00_0000000000000b
DESC_DPL_1  equ		   01_0000000000000b
DESC_DPL_2  equ		   10_0000000000000b
DESC_DPL_3  equ		   11_0000000000000b
DESC_S_CODE equ		     1_000000000000b
DESC_S_DATA equ	  DESC_S_CODE
DESC_S_sys  equ		     0_000000000000b
DESC_TYPE_CODE  equ	      1000_00000000b	;x=1,c=0,r=0,a=0 代码段是可执行的,非依从的,不可读的,已访问位a清0.  
DESC_TYPE_DATA  equ	      0010_00000000b	;x=0,e=0,w=1,a=0 数据段是不可执行的,向上扩展的,可写的,已访问位a清0.;code section
DESC_CODE_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_CODE + DESC_TYPE_CODE + 0x00;data section
DESC_DATA_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_DATA2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00;video section
DESC_VIDEO_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x0b;--------------   paragraph selection  ---------------
RPL0  equ   00b
RPL1  equ   01b
RPL2  equ   10b
RPL3  equ   11b
TI_GDT	 equ   000b
TI_LDT	 equ   100b;--------------   loader & kernel   --------------
PAGE_DIR_TABLE_POS equ 0x100000;--------------   page tab   --------------
PG_P equ 1b
PG_RW_R equ 00b
PG_RW_W equ 10b
PG_US_S equ 000b
PG_US_U equ 100b

mbr.s

;主引导程序
;------------------------------------------------------------
%include "boot.inc"
SECTION MBR vstart=0x7c00         mov ax,cs      mov ds,axmov es,axmov ss,axmov fs,axmov ax, 0xB800mov gs, axmov sp,0x7c00; 清屏 利用0x06号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10   功能号:0x06	   功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:mov     ax, 0x600mov     bx, 0x700mov     cx, 0           ; 左上角: (0, 0)mov     dx, 0x184f	   ; 右下角: (80,25),; VGA文本模式中,一行只能容纳80个字符,共25行。; 下标从0开始,所以0x18=24,0x4f=79int     0x10            ; int 0x10;;;;;;;;;     打印字符串    ;;;;;;;;;;;mov cx, sx - msgmov si, msgmov di, 0
show_str:mov byte al, [si]mov byte ah, [sx]mov word [gs:di], axinc siadd di, 2loop show_strjmp L0msg db "enter mbr"sx db 0x24;;;;;;;;;      打字字符串结束	 ;;;;;;;;;;;;;;;
L0:push dspush dimov eax, LBA_START_SECTORpush eaxmov ax, SECTOR_COUNTpush axmov ax, LOADER_BASE_ADDRpush axmov ax, LOADER_OFF_ADDRpush axcall read_diskadd sp, 10pop dipop dsjmp LOADER_ADDR;;;;;;;;;      read disk      ;;;;;;;;;; LBA: [bp+10]
; sector count: [bp+8]
; destination: sec=[bp+6], off=[bp+4]
read_disk:push bpmov bp, sp;sector_countmov dx,0x1f2mov ax, [bp+8]out dx, al;sector_addrmov dx, 0x1f3mov ax, [bp+10]out dx, almov dx, 0x1f4mov al, ahout dx, almov dx, 0x1f5mov ax, [bp+12]out dx, almov dx, 0x1f6mov al, ahand al, 0x0for al, 0xe0out dx, al;command_writemov dx, 0x1f7mov al, 0x20out dx, aldisk_test:nop          ;give disk a momentin al, dxand al, 0x88 ;7: BUSY, 3: READYcmp al, 0x08 ; (BUSY=0 & READY=1) or not?jnz disk_test;data_read:   mov ax, [bp+8]mov dx, 256mul dxmov cx, axmov bx, [bp+4]mov ax, [bp+6]mov ds, axmov dx, 0x1f0
go_on_read:in ax, dxmov [bx], axadd bx,2loop go_on_readmov sp, bppop bpret
;;;;;;;;;      read disk      ;;;;;;;;;times 510-($-$$) db 0db 0x55,0xaa

loader.s

%include "boot.inc"
section loader vstart=LOADER_ADDR
;;;;;;;;;     打印字符串    ;;;;;;;;;;;mov cx, sx-msg1mov si, msg1mov di, 160
show_str:mov byte al, [si]mov byte ah, [sx]mov word [gs:di], axinc siadd di, 2loop show_strjmp get_memoinfomsg1 db "enter loader"sx db 0x24;;;;;;;;;      打字字符串结束    ;;;;;;;;;;;;;;;;----- get memory information -----
get_memoinfo:
;----- get all: 0xE820
jmp_e820:xor ebx, ebxmov edx, 0x534d4150mov di, ARDS_ADDR+2
ards_e820:mov eax, 0x0000e820mov ecx, 20int 0x15jc Erroradd di, cxinc word [ARDS_ADDR]cmp ebx, 0jnz ards_e820show_memoinfo:mov ax, 0xb800mov gs, axmov cx, [ARDS_ADDR]mov si, ARDS_ADDR+0x2mov di, 320
loop_print:push di
addr_info:mov edx, [si]mov di, memo_addr+22call BtHshr edx, 16mov di, memo_addr+18call BtHmov edx, [si+4]mov di, memo_addr+14call BtHshr edx, 16mov di, memo_addr+10call BtHsize_info:mov edx, [si+8]mov di, memo_size+22call BtHshr edx, 16mov di, memo_size+18call BtHmov edx, [si+12]mov di, memo_size+14call BtHshr edx, 16mov di, memo_size+10call BtHtype_info:mov edx, [si+16]mov di, memo_type+14call BtHshr edx, 16mov di, memo_type+10call BtHpop dipush cxpush sipush dimov cx, BtH_Table-memo_addrmov ah, 0x24mov si, memo_addr
info_print:mov al, [si]mov [gs:di], axinc siadd di, 0x2loop info_printpop diadd di, 160pop siadd si, 20pop cxdec cxcmp cx, 0jne loop_printjmp Jmp_therememo_addr db "ADDR:0xxxxxxxxxxxxxxxxx. "
memo_size db "SIZE:0xxxxxxxxxxxxxxxxx. "
memo_type db "TYPE:0xxxxxxxxx."
BtH_Table db "0123456789ABCDEF";params: dx, di
BtH:push axpush bxpush edxpush dimov bh, 0mov bl, dland bl, 00001111bmov al, [BtH_Table+bx]mov [di], aldec dimov bl, dlshr bl, 4mov al, [BtH_Table+bx]mov [di], aldec dimov bl, dhand bl, 00001111bmov al, [BtH_Table+bx]mov [di], aldec dimov bl, dhshr bl, 4mov al, [BtH_Table+bx]mov [di], alpop dipop edxpop bxpop axretError:;----- open A20 -----
Jmp_there:in al, 0x92or al, 00000010bout 0x92, al;----- load gdtr-----lgdt [gdt_ptr];----- cr0 set -----mov eax, cr0or eax, 0x00000001mov cr0, eax;----- clear instruction pipeline -----jmp dword SELECTOR_CODE:p_m_start[bits 32]
p_m_start:mov ax, SELECTOR_DATAmov ds, axmov es, axmov ss, axmov esp, LOADER_ADDRmov ax, SELECTOR_VIDEOmov gs, axmov ecx, msg3-msg2mov si, msg2mov di, 1280
show_str2:mov byte al, [si]mov byte [gs:di], alinc siadd di, 2loop show_str2pagination_mode:call setup_pagesgdt [gdt_ptr]mov eax, [gdt_ptr + 2]or dword [eax + 0x18 + 4], 0xc0000000add dword [gdt_ptr + 2], 0xc0000000set_cr3:mov eax, PAGE_DIR_TABLE_POSmov cr3, eaxset_cr0_page:mov eax, cr0or eax, 0x80000000mov cr0, eaxreload_gdt:lgdt [gdt_ptr]mov ecx, GDT_BASE-msg3mov si, msg3mov di, 1440
show_str3:mov byte al, [si]mov byte [gs:di], alinc siadd di, 2loop show_str3jmp $;string
msg2 db "enter protect mode"msg3 db "enable pagination mode";GDT_CREATE
GDT_BASE:dd 0x00000000, 0x00000000CODE_DESC:dd 0x0000FFFF, DESC_CODE_HIGH4DATA_DESC:dd 0x0000FFFF, DESC_DATA_HIGH4VIDEO_DESC:dd 0x80000007, DESC_VIDEO_HIGH4GDT_SIZE equ $ - GDT_BASE
GDT_LIMIT equ GDT_SIZE - 1
times 30 dq 0;SELECTOR_SET
SELECTOR_CODE equ 0000000000001_000b + TI_GDT + RPL0
SELECTOR_DATA equ 0000000000010_000b + TI_GDT + RPL0
SELECTOR_VIDEO equ 0000000000011_000b + TI_GDT + RPL0;GDT_pointer
gdt_ptr dw GDT_LIMITdd GDT_BASEsetup_page:mov ecx, 1024mov esi, 0
clear_page_dir:mov dword [PAGE_DIR_TABLE_POS + 4*esi], 0inc esiloop clear_page_dircreate_pde:mov eax, PAGE_DIR_TABLE_POSadd eax, 0x1000mov ebx, eax
set_1_769_1024_PDE:or eax, PG_US_U | PG_RW_W | PG_Pmov [PAGE_DIR_TABLE_POS + 0x0], eaxmov [PAGE_DIR_TABLE_POS + 0xc00], eaxsub eax, 0x1000mov [PAGE_DIR_TABLE_POS + 0xffc], eaxmov ecx, 254mov edx, PAGE_DIR_TABLE_POSmov edi, 769add eax, 0x2000
set_kernel_769~1022_PDE:mov [edx + 4*edi], eaxinc ediadd eax, 0x1000loop set_kernel_769~1022_PDEset_0_PTE:mov ecx, 256mov edx, PAGE_DIR_TABLE_POSadd edx, 0x1000mov edi, 0and eax, 0x00000111
create_pte:mov [edx + 4*edi], eaxinc ediadd eax, 0x1000loop create_pteret

写入硬盘

nasm -I OS/include/ -o OS/boot/mbr.bin OS/boot/mbr.s
nasm -I OS/include/ -o OS/boot/loader.bin OS/boot/loader.s
dd if=OS/boot/mbr.bin of=bochs/hd60M.img bs=512 count=1 seek=0 conv=notrunc
dd if=OS/boot/loader.bin of=bochs/hd60M.img bs=512 count=4 seek=1 conv=notrunc

启动bochs执行

./bochs/bin/bochs -f bochs/boot.disk

页目录表详细信息:


http://www.ppmy.cn/news/18821.html

相关文章

Elasticsearch7.8.0版本高级查询—— 聚合查询文档

目录一、初始化文档数据二、聚合查询文档2.1、概述2.2、对某个字段取最大值 max 示例2.3、对某个字段取最小值 min 示例2.4、对某个字段求和sum 示例2.5、对某个字段取平均值 avg 示例2.6、对某个字段的值进行去重之后再取总数 示例三、State 聚合查询文档3.1、概述3.2、示例一…

Spark RDD算子

文章目录Spark RDD算子一、RDD 转换算子1、Value 类型(1) map(2) mapPartitions1&#xff09;函数说明2&#xff09;小案例获取每个分区的最大值(3) map 和 mapParitions 的区别(4) mapParitionsWithIndex1&#xff09;小案例只获取第二个分区的最大值2&#xff09;小案例获取每…

CPU缓存架构缓存一致性协议详解

一、CPU高速缓存&#xff08;Cache Memory&#xff09;1.1 CPU高速缓存CPU缓存即高速缓冲存储器&#xff0c;是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存&#xff0c;CPU直接从内存中存取数据要等待一定时间周期&#xff0c;Cache中保存着…

2023122日记

新年伊始&#xff0c;却又是无聊的一天。话说送完姐姐去相亲&#xff0c;回来逛了一圈&#xff0c;终究很困&#xff0c;回来睡了。相亲太残酷了&#xff0c;这里只有没有感情的索取者&#xff0c;评价者。 按照惯例&#xff0c;农村的各种价值观的膨胀&#xff0c;指挥的碰撞…

二分查找——“C”

各位CSDN的uu们你们好呀&#xff0c;欢迎来到小雅兰的课堂&#xff0c;今天我们的内容是复习之前的内容&#xff0c;并把之前的内容的一些习题一起来做一做&#xff0c;现在&#xff0c;就让我们进入二分查找的世界吧 首先&#xff0c;我们介绍的题目就是二分查找&#xff0c;也…

【学习笔记】[AGC030F] Permutation and Minimum

套路题。然而思维太混乱了没有做出来 我是丝薄 显然有(−1,xi),(−1,−1)(-1,x_i),(-1,-1)(−1,xi​),(−1,−1)两种情况。那么定义vxi1v_{x_i}1vxi​​1&#xff0c;限制等价于对于vi1v_i1vi​1的两个元素不能在同一组中。 先不考虑算重。显然需要记录(−1,xi),(−1,yi)(-1,…

【算法】素数筛

目录1.概述2.代码实现2.1.试除法2.2.埃拉托斯特尼筛法2.3.欧拉筛法1.概述 &#xff08;1&#xff09;在了解素数筛之前&#xff0c;我们先复习一下素数的定义&#xff1a;素数 (Prime number) 又称质数&#xff0c;一个大于 1 的自然数&#xff0c;除了 1 和它自身外&#xff…

20230122英语学习

If Flying Is Giving You More Anxiety Than Ever, Here’s How to Cope 害怕坐飞机&#xff1f;教你几招&#xff0c;克服飞行焦虑 In college, I grew a tumor that meant I hung out quite frequently in MRI machines.Though I’d never had a problem before, I found my…