Page 330 - 《软件学报》2021年第10期
P. 330

3302                                 Journal of Software  软件学报 Vol.32, No.10, October 2021

                 用于遍历进程页表实现地址转换功能.pgd 的值与 CR3 寄存器的值相差 page_offset,32 位下,page_offset 为
                 0xc0000000;64 位下,则为 0xffffffff80000000.因此,其约束条件可由公式(9)描述:
                                                   i
                               PGF cn    {pgf Con Addr   |  i  (  ms  pgf  ) Vcpu cr  . 3   page _offset , i UserPro    }  (9)
                                   adi
                                                                                    i
                                        i
                 其中,i 为某个用户进程; Addr 为该用户进程 mm_struct 结构体的起始地址,可由 Addr 与 mm  offset 得到;Vcpu.
                                       ms
                                                                                    ts
                 cr3 为 TVM 陷入 VMM 时,其 CR3 寄存器的值.
                    6)  成员 start_code 及 end_code.
                    进程代码段在内存中的起始地址与结束地址分别存储在 mm_struct 结构体的 start_code 及 end_code 域中.
                 IA-32 体系下,用户进程虚拟地址空间布局如图 7 所示.
                                    Kernel                           0xFFFFFFFF
                                    space           Kernel space
                                    1GB                              0xC0000000=TASK_SIZE
                                                                      Random stack offset
                                                      Stack

                                                                      Random mmap offset
                                                     MMAP

                                    User
                                    space                            brk
                                    3GB               Heap           start_brk
                                                                      Random brk offset
                                                   BSS segment
                                                                     end_data
                                                   Data segment
                                                                     start_data
                                                                     end_code
                                                   Text segment
                                                                     0x08048000
                                                     Reserved        0
                                    Fig.7    Process virtual address space layout of IA-32 architecture
                                              图 7   IA-32 进程虚拟地址空间布局
                    进程代码段为图 7 中所示的 text segment,每个体系结构为 text 段制定了一个特定的起始地址:x86 架构下
                 始于 0x08048000,x86_64 下则为 0x400000.基于此,可得到成员 start_code 的偏移量.一般而言,内核源码中成员
                 start_code 与 end_code 处于相邻位置.同样地,为保证所得偏移量的可靠性,VMOffset 以 end_code 成员属性为依
                 据获取对应偏移量,其约束条件可由公式(10)描述:
                               MinLimit ≤ Con  (Addr   i  ecf  )   MaxLimit PageAccess (Con Addr   i  ec f  ))   RO & X  
                            
                                                                              (
                                                                ,
                     ECF candi    ecf     i    ms    i                     i    ms                (10)
                                                                                   
                                    MinLimit  Con i  (Addr ≥  m s  scf  ),MaxLimit   TASK  _ SIZE   , i UserPro   
                                    i
                 其中,i、UserPro 及 Addr 的含义同公式(9);scf 为 start_code  offset;TASK_SIZE 为一常数,用于将进程虚拟地址
                                    ms
                 空间划分为内核空间和用户空间.由图 7 可知,进程代码段位于用户空间.
                                               i
                                           (
                    公式(10)中, PageAccess (Con Addr   ecf  )) 为 ecf 偏移处内容所在页面的权限,进程代码段所在页面的权限
                                          i
                                               ms
                 为只读与可执行.基于此,可进一步更新公式(10)中的 MinLimit 与 MaxLimit,对 ecf 进行筛选.此处以 IA-32 体系
                 结构为例,给出筛选 1 次 ecf 的伪代码,如图 8 所示.
                    图 8 中:第 1 行~第 9 行基于进程虚拟地址空间布局及代码段所在页面权限更新 MinLimit 和 MaxLimit,选
                 取具有可读写或不可执行权限的最小 offset_content 作为 MaxLimit,同时选取具有只读且可执行权限的最大
                 offset_content 作为 MinLimit;第 10 行~第 14 行则基于已更新的 MinLimit 与 MaxLimit,删除 offset_content 不在
                 此范围内的 ecf.图 8 为筛选 1 次 ecf 的过程,多次迭代可得到最终 ecf.
                    由上述基于成员属性制定约束条件,依照约束条件筛选各个成员偏移量候选项的过程可知,不同成员自身
                 的约束条件与其所依赖条件均存在差异.如筛选 tasks 成员偏移量候选项的过程仅依赖 TVM 中真实进程数目;
   325   326   327   328   329   330   331   332   333   334   335