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 中真实进程数目;