[062][x86汇编语言]第16章 源码分析 过程[alloc_inst_a_page]

学习笔记

《x86汇编语言:从实模式到保护模式》
//www.greatytc.com/p/d481cb547e9f

详细调用关系以及过程在整个内核程序中的作用

参见 //www.greatytc.com/p/2dba8674e8fd

内核程序:过程[alloc_inst_a_page]

过程[alloc_inst_a_page]

代码流程

  • 1、根据传入的线性地址EBX,计算对应的页目录表表项的线性地址,存入ESI
  • 2、视页表存在与否,尚未存在则,创建页表,登记页表;
  • 3、根据传入的线性地址EBX,计算对应的页表的线性地址,存入ESI
  • 4、根据传入的线性地址EBX + 页表的线性地址,计算页表表项的线性地址,存入ESI
  • 5、为用户程序,申请一个空闲的物理页,物理页的物理地址通过EAX传回,配置页属性,将EAX存入页表([ESI])

取自源码文件 c16_core.asm

alloc_inst_a_page:                          ;分配一个页,并安装在当前活动的
                                            ;层级分页结构中
                                            ;输入:EBX=页的线性地址
         push eax
         push ebx
         push esi
         push ds
         
         mov eax,mem_0_4_gb_seg_sel
         mov ds,eax
         
         ;检查该线性地址所对应的页表是否存在
         mov esi,ebx
         and esi,0xffc00000
         shr esi,20                         ;得到页目录索引,并乘以4 
         or esi,0xfffff000                  ;页目录自身的线性地址+表内偏移 
                                            ;ESI = 页目录表表项的线性地址

         test dword [esi],0x00000001        ;P位是否为“1”。检查该线性地址是 
         jnz .b1                            ;否已经有对应的页表
          
         ;创建该线性地址所对应的页表 
         call allocate_a_4k_page            ;分配一个页做为页表 
         or eax,0x00000007
         mov [esi],eax                      ;在页目录中登记该页表
          
  .b1:
         ;开始访问该线性地址所对应的页表 
         mov esi,ebx
         shr esi,10
         and esi,0x003ff000                 ;或者0xfffff000,因高10位是零 
         or esi,0xffc00000                  ;得到该页表的线性地址
                                            ;ESI=页表的线性地址
         
         ;得到该线性地址在页表内的对应条目(页表项) 
         and ebx,0x003ff000
         shr ebx,10                         ;相当于右移12位,再乘以4
         or esi,ebx                         ;页表项的线性地址 
                                            ;ESI=页表表项的线性地址
         call allocate_a_4k_page            ;分配一个页,这才是要安装的页
         or eax,0x00000007
         mov [esi],eax 
          
         pop ds
         pop esi
         pop ebx
         pop eax
         
         retf  

注意:下列图解中可能的存在一个容易混淆的部分

  • 有关移位操作的代码,比如右移12位再左移2位,往往直接写成右移动10位,本质上,左移两2位就是乘以4
  • 处理器进行地址转换时,对于线性地址是按照高10位 中10位 低12位的格式去解读的,要做的运算是
页目录表物理地址 + 高10位x4 = 页目录表项的线性地址
页表物理地址 + 中10位x4 = 页表表项的线性地址
物理页物理地址 + 低12位 = 真正的物理地址
  • 可知,低12位本来是不需要乘以4的,但是下面的代码要么是访问页目录的表项,要么是访问页表的表项,这里面暗含着一个逻辑,那就是新的低12位其实是从旧的线性地址的要么高10位、要么中10位通过移位操作而来的,并且需要与页目录表的物理地址或者页表的物理地址结合,在移位的过程中往往就隐藏地进行了X4的操作,表现在代码的汇编指令上就是左移2位,然后又由于汇编语法的规则,先右移22位再左移2位等价于直接右移20位,表现在图解里就是,结果的线性地址里,最右端的两位的两个0永远都不是来自最初的线性地址,而是过程中的补0,我往往使用空白底色标识出来了

一、检查该线性地址所对应的页表是否存在

         mov esi,ebx
         and esi,0xffc00000
         shr esi,20                         ;得到页目录索引,并乘以4 
         or esi,0xfffff000                  ;页目录自身的线性地址+表内偏移 

         test dword [esi],0x00000001        ;P位是否为“1”。检查该线性地址是 
         jnz .b1                            ;否已经有对应的页表
1、传入的参数 EBX=页的线性地址,有何独特之处?
  • 物理页的大小是4KB,即0x1000 Byte
  • 第一个可以分配的物理页的线性起始基地址EBX = 0x 0000 0000
  • 那么,第二个可以分配的物理页的线性起始基地址就是EBX = 0x0000 0000 +0x1000 = 0x 0000 1000
  • 同理,第三个可以分配的物理页的线性起始基地址就是EBX = 0x0000 1000+ 0x1000 = 0x 0000 2000
  • 可以很清楚地看见,作为传入参数的线性起始基地址,一定是EBX = 0x ?????000低12位必然全是0
2、图解假设传入参数为 EBX =0x11122000 进行移位操作
寄存器ESI各比特值的变化.png
  • 假设的EBX要满足作为物理页的线性起始基地址的基本要求,即低12位全是0,表现在十六进制0x的写法上就是0x?????000

  • and 指令是为了保留,为了保留传入的线性地址的高10位,以后叫原来的高10位

  • or 指令是为了强制置为1,就是要把新的高10位以及新的中10位霸道地全部设置为1,因为0xFFFFF???页目录表自己的线性基地址

  • 这一小段代码, 就是为了计算出一个,可以访问页目录表自己表项的线性地址

  • 如果访问页目录表自己的表项,具体原理

参见 //www.greatytc.com/p/d6b534560669

  • 这里只需要记住,一个线性地址,只要是以0xFFFFF...开头的那么一定是访问页目录表自己

  • 那么,原来的高10位到哪里去了?到低12位去了。现在,我们要访问的是页目录表自己的表项,这等于就是说,现在我们要访问一个物理页,页目录表就是这个物理页

高10位 要乘以4 作为页目录表偏移量
低12位 直接作为 页的偏移量

原来的高10位变成了 现在的低12位
页目录表 不仅做页目录表 还做页表 现在更要作为 页

现在的低12位 与 现在的页 正好结合
  • 现在,ESI = 可以访问 页目录表自己表项的线性地址
3、从页目录表表项中取出页表的物理地址,查看对应的页表是否已经存在
 test dword [esi],0x00000001
 jnz .b1  
  • P = 1 表示存在,则跳转到.b1去继续执行;
  • P= 0表示还不存在,需要先申请一个物理页当做页表,然后再继续执行;

二、为页表申请一个物理页

 ;创建该线性地址所对应的页表 
         call allocate_a_4k_page            ;分配一个页做为页表 
         or eax,0x00000007
         mov [esi],eax                      ;在页目录中登记该页表
  • 调用过程 allocate_a_4k_page

参见 //www.greatytc.com/p/49cbaccd38c5

  • 传回EAX = 分配的空闲物理页的物理地址
  • 配置页的属性or eax,0x00000007US=1,RW=1,P=1
  • 完成登记 mov [esi],eax ;在页目录中登记该页表

三、计算要访问的页表的线性地址

  .b1:
         ;开始访问该线性地址所对应的页表 
         mov esi,ebx
         shr esi,10
         and esi,0x003ff000                 ;或者0xfffff000,因高10位是零 
         or esi,0xffc00000                  ;得到该页表的线性地址
图解假设传入参数为 EBX =0x11122000 进行移位操作 计算要访问的页表的线性地址
  • 可见,要访问页表,线性地址必然是以0xFFC..... 开头;
  • 访问页表表项,具体原理

参见 //www.greatytc.com/p/d6b534560669

  • 现在,ESI = 页表的线性地址

四、访问页表表项

 ;得到该线性地址在页表内的对应条目(页表项) 
         and ebx,0x003ff000
         shr ebx,10                         ;相当于右移12位,再乘以4
         or esi,ebx                         ;页表项的线性地址 
         call allocate_a_4k_page            ;分配一个页,这才是要安装的页
         or eax,0x00000007
         mov [esi],eax 
计算 要访问的 页表表项的线性地址
  • 步骤三,ESI = 页表的线性地址
  • 过程 call allocate_a_4k_page 申请了一个物理页作为安装用户程序的物理页
  • EAX = 分配的空闲的物理页的物理地址
  • 配置页属性之后,填入页表表项mov [esi],eax
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351