资源描述
王 雷 北京航空航天大学计算机科学与工程系 王雷 内容 Linux的虚存管理 Windows2000内存管理 两者的比较 北京航空航天大学计算机科学与工程系 王雷 Linux的虚存管理 大地址空间 进程间保护 内存映射 物理内存的平等使用 共享虚存 体系结构无关性 北京航空航天大学计算机科学与工程系 王雷 MMU模型 分页机制 3级页表 pgd,页目录 pmd,页中级目录 pte,页表项 内核空间 =物理内存空间 北京航空航天大学计算机科学与工程系 王雷 虚拟地址 第 2 级第 1 级 第 3 级 页内偏移 第 1 级页表 PFN 第 2 级页表 第 3 级页表 物理页 P G D PFN PFN 北京航空航天大学计算机科学与工程系 王雷 mm_struct struct mm_struct int count; pgd_t * pgd; unsigned long context; unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack, start_mmap; unsigned long arg_start, arg_end, env_start, env_end; unsigned long rss, total_vm, locked_vm; unsigned long def_flags; struct vm_area_struct * mmap; struct vm_area_struct * mmap_avl; struct semaphore mmap_sem; ; VMA链, VMA AVL树 指向 PGD的指针 代码,数据,堆栈 段的地址范围 北京航空航天大学计算机科学与工程系 王雷 mm_struct 操作 mm_alloc,分配 mm_struct结构 mmget,引用 mm_struct结构 mmput,释放对 mm_struct结构 mm_release,释放地址空间体系结构相关部分 copy_mm,复制整个地址空间 exit_mm,释放整个地址空间 北京航空航天大学计算机科学与工程系 王雷 vm_area_struct struct vm_area_struct struct mm_struct * vm_mm; unsigned long vm_start; unsigned long vm_end; pgprot_t vm_page_prot; unsigned short vm_flags; short vm_avl_height; struct vm_area_struct * vm_avl_left; struct vm_area_struct * vm_avl_right; struct vm_area_struct *vm_next; struct vm_area_struct *vm_next_share; struct vm_area_struct *vm_pprev_share; struct vm_operations_struct * vm_ops; unsigned long vm_offset; struct file * vm_file; unsigned long vm_pte; ; VMA的地址范围 VMA链 VMA AVL树 VMA保护位和标志 共享 VMA链 VMA操作函数表 对应 file及其偏移 北京航空航天大学计算机科学与工程系 王雷 共享内存 struct shmid_ds struct ipc_perm shm_perm; int shm_segsz; time_t shm_atime; time_t shm_dtime; time_t shm_ctime; unsigned short shm_cpid; unsigned short shm_lpid; short shm_nattch; unsigned short shm_npages; unsigned long *shm_pages; struct vm_area_struct *attaches; ; 共享 VMA链 北京航空航天大学计算机科学与工程系 王雷 vm_area_struct链表 mmap-vm_next mmap_avl-vm_avl_left, vm_avl_right attaches-vm_next_share, vm_prev_share 北京航空航天大学计算机科学与工程系 王雷 整体结构 mm_struct 页表 vm_area_struct vm_area_struct vm_area_struct vm_area_struct 代码段 数据段 堆栈段 共享VMA链指针 北京航空航天大学计算机科学与工程系 王雷 vm_area_struct 操作 查询, find_vma(struct mm_struct *mm, unsigned long addr); 插入, insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma); 合并, merge_segments(struct mm_struct *mm, unsigned long vm_start, unsigned long vm_end); 北京航空航天大学计算机科学与工程系 王雷 vm_operations_struct open close unmap protect sync advise nopage wppage swapout swapin 北京航空航天大学计算机科学与工程系 王雷 shm_vm_ops VFS等 北京航空航天大学计算机科学与工程系 王雷 物理内存管理 typedef struct page struct page *next; struct page *prev; struct inode *inode; unsigned long offset; struct page *next_hash; atomic_t count; unsigned flags; unsigned dirty:16, age:8; struct wait_queue *wait; struct page *prev_hash; struct buffer_head * buffers; unsigned long swap_unlock_entry; unsigned long map_nr; mem_map_t; 空闲页面链 or inode页面链表 对应的 inode及其偏移 buffer cache头结构 贮留在内存中页面的 HASH链表 北京航空航天大学计算机科学与工程系 王雷 页面管理 mem_map page结构数组,一一对应每一个页面 空闲页面管理 Buddy系统 bitmap(缺省值为 6) 贮留页面管理 inode链 贮留页面 HASH链表 北京航空航天大学计算机科学与工程系 王雷 页面的组织 page page page page page freearea(0) freearea(1) freearea(n-1) page page page inode inode mem_map 北京航空航天大学计算机科学与工程系 王雷 内核态内存的申请与释放 kmalloc, kfree blocksize size_descriptor page_descriptor 北京航空航天大学计算机科学与工程系 王雷 用户态内存的申请与释放 vmalloc, vfree vm_struct *vmlist 北京航空航天大学计算机科学与工程系 王雷 高速缓存 缓冲区高速缓存:缓冲区高速缓存中包含了由块设备 使用的数据缓冲区 。 (kmalloc_cache) 页高速缓存:缓存某个文件的逻辑内容 , 并通过文件 的 VFS 索引节点和偏移量访问 。 当页从磁盘上读到物 理 内 存 时 , 就 缓 存 在 页 高 速 缓 存 中 。 (page_hash_table) 交换高速缓存:只有修改后 ( 脏 ) 的页才保存在交换 文件中 。 修改后的页写入交换文件后 , 如果该页再次 被交换但未被修改时 , 就没有必要写入交换文件 , 相 反 , 只需丢弃该页 。 交换高速缓存实际包含了一个页 表项链表 , 系统的每个物理页对应一个页表项 。 (swap_cache) 硬件高速缓存:常见的硬件缓存是对页表项的缓存 , 这一工作实际由处理器完成 。 北京航空航天大学计算机科学与工程系 王雷 1989年 NT的需求 32位抢占式可重入的虚拟内存操作系统 在多种硬件体系结构上运行 支持对称多处理系统 分布式计算平台 兼容 16位 DOS, Windows 3.1的应用程序 符合 POSIX1003.1 符合安全性的要求 支持 UNICODE 北京航空航天大学计算机科学与工程系 王雷 设计目标 可扩充性 可移植性 可靠性及坚固性 兼容性 性能 北京航空航天大学计算机科学与工程系 王雷 工具 Nt Nt资源包 Platform SDK NT DDK 北京航空航天大学计算机科学与工程系 王雷 调试工具 i386kd.exe windbg.exe softice() 北京航空航天大学计算机科学与工程系 王雷 Windows2000内存管理 一组执行体系统服务程序 , 用于虚拟内存的分 配 、 回收和管理 。 大多数这些服务都是通过 Win32 API 或内核态的设备驱动程序接口形式 出现 。 一个转换无效和访问错误陷阱处理程序用于解 决硬件监测到的内存管理异常 , 并代表进程将 虚拟页面装入内存 。 六个的关键组件 北京航空航天大学计算机科学与工程系 王雷 工作集管理器 ( 16优先 ) 调换器 进程 /堆栈 ( 23优先 ) 改进型页写入器 ( 17优先 ) 映射页写入器 ( 17优先 ) 延期段线程 ( 18优先 ) 零页线程 ( 0优先 ) 北京航空航天大学计算机科学与工程系 王雷 内存布局 应用程序代码 全程变量 每个线程堆栈 DLL代码 3GB用户空间 1GB系统空间 7FFFFFFF 80000000 内核和执行体 HAL 引导驱动程序 C0000000 进程页表 BFFFFFFF 超空间 C0000000 C0800000 系统高速缓存 分页缓冲池 未分页缓冲池 FFFFFFFF FFFFFFFF 北京航空航天大学计算机科学与工程系 王雷 系统代码 (Ntoskrnl,HAL) 和一些系统中 初始的未分页缓冲池 系统映射视图(例如, Win32k.sys)或者 会话空间 超空间和进程工作集列表 进程的页表和页目录 附加的系统 PTE(高速缓存可以扩展到 这) 没有使用 ,不可访问 HAL使用 故障转储信息 未分页缓冲池扩充 系统 PTE 分页缓冲池 系统高速缓存 系统工作集列表 80000000 C0800000 C0400000 C0000000 A4000000 A0000000 FFBE0000 EB000000(min) E1000000 C1000000 C0C00000 FFC00000 北京航空航天大学计算机科学与工程系 王雷 地址变换过程 核心进程 页目录索引 页表索引 字节索引 CR3 物理地址 Index PFN PDE 页目录 ( 每个进程建立一张 , 1024项 ) Index PFN PTE 页表 ( 每个进程最多有 512个 , 系统空间最多占用 512 个 , 每张表 1024项 ) Index 物理地址空间 要求的字节 要求的 页 北京航空航天大学计算机科学与工程系 王雷 进程 . . . . . . . . . 进程 1 的页表 进程 2 的页表 PTE 0 进程 1的 页目录 进程 2的 页目录 PTE 0 PDE 0 PDE 0 System PTE 0 PDE 511 PDE 512 PDE n PDE n PDE 512 PDE 511 . . . . . . . . . . . . . . . . . . System PTE n . . . 系统页表 进程仍然没有 访问系统页表 各进程私有 北京航空航天大学计算机科学与工程系 王雷 内存分配方式 以页单位的虚拟内存函数( Virtualxxx) , 保留与提交 内存映射文件函数( CreateFileMapping, MapViewOfFile) , 堆函数( Heapxxx 和早期的接口 Localxxx 和 Globalxxx)。 北京航空航天大学计算机科学与工程系 王雷 虚拟地址描述符 范围 : 20000000到 2000FFFF 保护限制:读 /写 继承:有 范围 : 00002000到 0000FFFF 保护限制:只读 继承:无 范围 : 4E000000到 4F000000 保护限制:复制可写入 继承:有 范围 : 32000000到 3300FFFF 保护限制:只读 继承:无 范围 : 7AAA0000到 7AAA00FF 保护限制:读 /写 继承:无 北京航空航天大学计算机科学与工程系 王雷 区域对象 (section object) 区域 创建区域 打开区域 扩展区域 映射 /非映射视图 查询区域 最大规模 页保护限制 页文件 /映射文件 基准的 /非基准的 对象类型 对象体属性 服务程序 北京航空航天大学计算机科学与工程系 王雷 文件对象 虚拟地址描述符 数据区控制区域 子区 段 原型 页表项 页框号数据库 项 文件对象 区域对象 页目录 页表 映像区控制区域 ( 如果 文件是一个执行的映像 ) 区域对象指针 下个子区 北京航空航天大学计算机科学与工程系 王雷 系统内存分配 未分页缓冲池 由系统虚拟地址组成,它们长 期驻留在物理内存中,在任何时候都可以被访 问到(从任何 IRQL级和任何进程上下文),而 不会发生页错误。需要未分页缓冲池的一个原 因是:页错误不能满足在 DPC/调度级或更高。 分页缓冲池 是系统可以被分页和分出系统的 空间中虚拟内存的一个区域。不必从 DPC/调度 级或更高一级访问内存的设备驱动程序可以使 用分页缓冲池。它从任何进程上下文都是可访 问的。 北京航空航天大学计算机科学与工程系 王雷 工作集 进程工作集 系统工作集 换页策略 北京航空航天大学计算机科学与工程系 王雷 物理内存管理 零初始化 当前 页框号数据库 当前 当前 . 空闲 后备 坏 修改 修改不写入 北京航空航天大学计算机科学与工程系 王雷 高速缓存 单一集中式系统高速缓存 与内存管理器结合 高速缓存的一致性 虚拟块缓存 基于流的缓存 可恢复的文件系统支持 北京航空航天大学计算机科学与工程系 王雷 视图 0 视图 1 视图 2 视图 3 视图 4 视图 5 视图 6 视图 7 视图 0 8 视图 n 系统高速缓存 节 0 节 1 文件 A(500KB) 节 0 节 1 文件 B(750KB) 节 2 节 0 文件 C(100KB) 北京航空航天大学计算机科学与工程系 王雷 文件 A(500 KB) 节 0 节 1 文件 B(750 KB) 节 0 节 1 节 2 文件 C(100 KB) 节 0 文件 A的 VACB 指针数组 入口 0 入口 1 入口 2 入口 3 文件 B的 VACB 指针数组 入口 0 入口 1 入口 2 入口 3 文件 C的 VACB 指针数组 入口 0 入口 1 入口 2 入口 3 系统 VACB数组 VACB 0 VACB 1 VACB 2 VACB 3 VACB 4 VACB 5 VACB 6 VACB 7 VACB n 系统高速缓存 视图 0 视图 1 视图 2 视图 3 视图 4 视图 5 视图 6 视图 7 视图 8 视图 n 北京航空航天大学计算机科学与工程系 王雷 共享的高速缓 存映射 VACB数组 VACB VACB VACB 0 0 0 0 0 0 127 127 127 127 127 127 北京航空航天大学计算机科学与工程系 王雷 回写缓存和延迟写 屏蔽对文件延迟写 强制写缓存到磁盘 快速 I/O 北京航空航天大学计算机科学与工程系 王雷 智能预读 虚拟地址预读 带历史信息的异步预读 CcXXX 北京航空航天大学计算机科学与工程系 王雷 访问缓存数据的方法 “拷贝读取 ” 方法在系统空间中的高速缓存数 据缓冲区和用户空间中的进程数据缓冲区之间 拷贝用户数据; “ 映射暂留 ” 方法使用虚拟地址直接读写高速 缓存的数据缓冲区 。 “ 物理内存访问 ” 方法使用物理地址直接读写 高速缓存的数据缓冲区 。 北京航空航天大学计算机科学与工程系 王雷 地址窗口扩充 (address windowing extension) 物理内存 AWE 窗口 4GB 0 2GB 64GB 服务器程序地址 空间 系统 地址 空间 用户 地址 空间 AWE内存 北京航空航天大学计算机科学与工程系 王雷 两者的比较 内存管理 页式内存管理 vma=section object vm_struct=虚地址描述符 页管理页框号数据库 linux体系结构无关性与灵活性 北京航空航天大学计算机科学与工程系 王雷 高速缓存 linux 多、杂 基于磁盘逻辑块? 基于物理内存? Windows 2000 统一 基于文件偏移 基于虚拟内存 北京航空航天大学计算机科学与工程系 王雷 殊途同归 代码庞大问题 组装技术 可视化技术 北京航空航天大学计算机科学与工程系 王雷 参考文献 David A Rusling, The Linux Kernel BlueOcean, Linux的虚存管理 D. A. Solomon, Inside Windows 2000 qMVEUk!tMzN 6ATN5TGoZ*u9!ySC J#42HGW6i7yd4%DWAwyt3gTydO#yrqj%7M4jLrKHvpz5igbhKEaI8Z+Pf Kf6vxogoX!N uir-f kpIe18lsgIqmj4ztI&cc RO#58Lv% iLkm*oN b*fb(U JefxU+%pb85Ygum81dV38cs)qD X30CvEPO9-B*t8g*uG09RN UYNqzqd8o24!MjA c7qvV H2lDxN qnsrr5sAHZ0%8vOTba$I- V8TEc KA(ac%qnKr *NW(C dR1Kx8S!O- D kOrA fMa13G Xzm$3$9mWb0c1SPquQ udiWuqkzbs6de FnPC m&oKM ZY*L0lb#jvmrE0zG -aoLyx6XxA m%&sj16d+x4s7Q - (2cmonZBPzk7Gw+*t)BeM1qN Xr5C qVb4TgbUAf Few kzUJ*Jz3RTaf m8gRUEfw6#R NYRe dFAcqxuk*Vw Tc+Yt 40pUaEn6GUQ mb$!t)tl8vO9D-aj- cx#Q wNZPF1G9amf rKNw yG3M(oP2xxf dsO3P OTGlkQ pB7rJF75)xM mLapDf5M kbQ 9-1Gj8n8IbHVOHq82% m) m*+ )$yH& LQ #7uh(NDzTRN1#PI7fbG4v+p#Gd#)3Q Xp2J- ZAa6HQ lsFIwDd#Aa CnJkZU+)Q BAJQ pH-qPXtcs89KwxdctF6STcp6- VCJD(9!%cMlFwN90BO*X(fbw kJa!Q 1DW5jBmOm ZmweRgEDtIOXlCb1CSlnw$lzl&w& zqVV)85MOw 4UTe kc 38)1pUbi*+iC MxRn2N66z8U mChkxID52gz#1L*5fEkE #*$GWtcD(P 13yyfBetATq) bwOVf guMTDL4nXmrI!62te-Ggsn7IrYyTR+ge A7Cv+ Kr+N7jtp(YdMKx#f VKxv( FtLKQ IYDPl0V9gQ A9qD*#sFf m!jvQ noyxEB -AbgsMJtlxMxXAg1vw1gBWAIC7c O)#z1lI*6+$+ w-iqZ9rNr)5yw#VVl-5YWoV0HH52!FOy8EjY Z8$v!tjuCBH7#kry8J0YQ x1&do(f-TndFcLdv4xuvWb$GFOptV 9Kq0mZxzmGCdss171HkhMQ $1- EI(rRI(%MtmDlS6z8c XiLd3sunitypw ILsLiyRf3xHTHagM eFa5%Q JwypZk0D R45yAe Y5qrhOLbLsb8pL9Q X37xC 5GVBjoe$mhnGgvoi9cEbhgxw8!% mbTR &oeCj R331w I)eP1N !po8-w nT)Cw co8dY DR+btB8q5iOS+7M Rao%W$W%+nVjlGi$vV5xUIY44L) ksClff*aogr wf !nfpJi4d3$+(V ZBH1D& u#rFr) 0no#RSW5Q -)HDer%GiQ Xpb2XnrUr-sx- UNB6fQ 3mRAUTJ%Sc+3quVMgWqW!CAaMHZT&anN HdHF C zu) ZB6r5T6pPPGs7NAuy( VYFpIiiOII&i% kiecQ ZdFyKWh$X kYBOd#XU0#kGfqqKl#E) UCc XD 57JvU 3zTZSe fp%LtTn6KqAsFVF rqzu$( &otJE- zaIuVI9o3!w ZnFWmHrxTHMafw LQ zTq8H7+w LV3HIlV m28S8tU1&cJ6qlN9oJcaPn- 2!hlfg09qq81$VrJa28LhH5Hp2U&) ZP6*F)%PHHz$(vK) XP2aye !cGCC*a*!8nw3jnhQ XW0q%h$TAqn)G !Os& vQ 3*4VEB34hKHqxl2qeshT*HNWet Z2AleBrTfs6n9)056pRAD 4f mnbJDR2eiT$XSY jg$v4&f7Uvf 7xb)R k5BR%eKEWk&S+M 9LukXY2klTZl#&0#T) zWUjQ f4irPkw6LD5eV ACadF ah- !gsnoOjWT5q)J$anvM5s!A ZQ Whj#34-dj1SF U- $d)55XxmT(NPAb7VW%eqe V4ph*duskf)h!R%i(eb0EqR zwviRO)pNUxCYn8hZbmA CQ ndtI88NeNAHhWAs6huWl6fBsPoN%WlOq5( dbBBNi)P2S!Q xfkG&lATGxSWCiAhgdhE8UuaU !(v181gXH52ms9k5hM)(HBpjIaXFT1*s-Jif93c WQ %acm*el6Va*+af 0p5+%L4*7r FC4-7j gDr$lP 2( kL4G2OOKBIpl0R ZPsLOGf !o7- Af%gsBJBOZvbw0kcpgVIe Oonr kUa1x(N TTvOC*!Djr $iQ Kqkt#62#xsBGoB!Pa0yR zq8qbnvbOZU XWxJ7P9TVtU6Bhwn2SM-Yw-G z#T*FMw - GwNS2c3jw1VcLHC(7FT9ks3hM)FP StKj% !5eQ C5bXL4#b(BAO(iRTbPqK*)spd)iIP ZqTU& j#Vq0Q 9raNGB1m0hh9c zf UBhLz# -t3gU C k#8XIAxMa% !#Q hiF15$a)FnKLmxx(O5JG-VE-gB)Mllm2YM mw Pl+97n8J9LSJ6WS*dFYjaHD7z92FObB9x(OdoQ dYjmGiwO6vaXlZ% zN zhUSaSs!vW!XY tSzwxn!&lWlDtOfV jv9ba- 0tqqS1y*2zFxz zhIFC AyYKZDUaQ gArZ5HA0*st864bndqPInBDB-3aCI0ChSdw7Rr oVcox- (G&3ia-EPb8&GBNDhyyqo6UHTb!SIiBeab5OZp2Pec HSX- sdNssZMwtx2kzeqtY mf *& k56f&(glJ36kzlv1svNHt qVcuxZS#ccU 1aJNuaakzh!Q #oQ #N7p5y1i%S&%FrkQ D(rk5FH-Au7aS6pOntnUiEz%G8s*%(EdXN4nqqq2b9pyB&Cv& m0lMrKxN T!u0IY&dE& 2D+t)- zRpt22xmq56hSlWqBfTiHKjtt3UoGH(#zWnN5L#n4#E-*hQ fBxZCl-trQ fKhdVJF2td#ND gZzNydnBwmMGVgy$N+T-y(-a9!#mJ+#z0pzpM4bQ -LWTV!(NWLzwxoTl97jVp3w)WLN*FPS#F Xt kC)Uahh8R*yf )DQ 23)AjHchk-w6X1q1ngEE94+g9yJH$z+pD2+ 6PpbY rdEq7Rc ZfgQ )7cSY mxSk(ihp2eUBEV ZgsZw07bUdAD VFO- hm+9B+q2ssf323bCy4&hnHFvX8V60t6RpA wJdj6- oMMN (2O3XtnNJvj j2$Lr U mQ Wmp1W71(YcY 1UYU OwU*02lVV8!xkEq*w73yFB zMgqguAnLpjtQ 2VXC zQ 4Q YBiYyJG 40)tDVM9zB$91qUhJn-clbw7%Hto) sU& zr p1j8-F qO2ai+ qg6Y MSh9folBs)t%JTAw+ sz727oA5hpC $9Xj5I1LngedLwEcuILz2( AgCi7xSl5dIG&V rhs54HZdmF PG 8MV8#tahEaJ4T*SaBPE#w9R60lUlKLa(KUc -4!R3LS%i*YltRnt7HNV Xt NGWJ!X(#w d*h-x9l(dz$LF - G5p#HcnbCH8!cZ(DCs4TqV+ ZElgDv5JlhLQ IAG21O5qsCFvcbOGjVh3dpS7rc Owc7U Wti6KhkwHj 1h0*xF 3RS&p8Q MaEEAGFPD(HQ mUop8jJ2cj #cnD+ ZmCP1KN$iGO5&C rRV8dpvcKS+dyuFQ TMLmnsQ 1uKZVy3P)06Kz$hToM(E*KO%y!+ kgyl& R-tf& WVN kvAW8Hw X*Bw7o*S%h%7xO#Nce n+(fvBYhY X4Sv39ac HF-U YhPqeJXxmaOZeW3aL#682euB!c AtShN kl!TWV E&OP UQ qB0KjNUmGVoSNA2#a44uS6ONA0)c cS)qmP Z76IxPCHL+Cy2!XCR1W2ePEA ofu&H+Dp01%Iu9ED%w1tv(RKy5gT-e Ed-5e26$Y zjixd#aXE0gsVhd- 2O#*&hJculOosjXl2Rba(rOahIPOSyVB+0bIGfPh-9Y mQ i558nB-qlx!dkONVF Xt3Rc-F ggxTU *Se&) #N8VjSZx4A%7WWQ $%YHxeD2%b+$SgbRaD 9u*Q JvBt&hD0Wmkq7n)hf jtDGD4YuH6*3x*asbh6%yY !w#f 0DLCF PUAu!ex)&SmtlI#F 02K#*N&ybV eeIj)C V&WD nbU Zn*KVnliht*wY D7wyo8sfTP14Q Nu2M%wWsYoy5uJ0cP zSW2ghLKsvLF2XV SA$R Y29(n4AF Xu$4c+4$U IA%(Y2&vjr mOdKUgq8q#g23n9K3Fc0zZe1CQ lqV3u- Ga)$O7*tL$l1jg3*4HOU%$(UlUqSV3M9!bDum%Ie4TiEZgkn0vv6sJdd*m6xi4&Cq3cI8VtnSIKJr RBBGCcnWx5+)zSzdH*JlTvAn-TpSU+-vr 6#XC8&sI6c Lq&umz+41gBL-K-n8RD& wpeRY jF)EA 1isXnr Vtx0%8+)J)OnpzM wG2b$F mc5M LV1T- kH4VC 0eVIgW7SPaIYoROu%rww%LA kW%s5UoEklv-8NY NVP3!4OdLKuNtxlacJC4M -3)5Df nDM#!Q fOgye3Wdt bUrb$s-AV4xcsk2XYhg-L- !lvBJBY$!LL8Zf zSq#leopsqw$OzZS#npmIV(nf& mTr122ICiY9Br6WR4*E7SN5nxGCro1Y bkMT( omXA 3- 0LzT8$!Hpo4CGJ+qb9IX0zzh8uyZbr ai%JCWKlY kxdl%HxNu!hXcu8ZsUKpf koXqVQ TDt70+0RY* -9X!HT-fd-7) ysBjh2NRvZsYp8n9Rn48O- 98NYsnzK2%qvSJ& Lw0U NnidmnI(NC6( 6cn8$9huSE#qe8zw4l$q%MJYjS67Jyx6p2kkfbOD34OplL5h(5r RfUp7*isWcnQ q- 1Gks8sN6TUY3&$dYwkCaE2rv0%)0Lfnc zIwN(3l19nf70j Yqnd4) uY(igKWxhmtnF$hLVqTys8c kEWH(#B7WUhoidmV XZdusF M#)H1zYeJT0DKlpkB m*WbgQ 1jZk2d)V Z& X1vRObgloeN XIn9eQ !ZWA20kLCyHHXvo#sY k%eg!c XaA jf6A3*#um1lK8i6PvTSXL)P rc)FH!#SQ *H#AxiPLGf%Ikb!$6Cb*Q B7eZVEaUN8#58h$mY4UCR ryK-Op1G%Ls*xacUDtjN D+ftO3$v9!Hhe%$rwwj82S2OTIX(S97Y4JciiiFaR%64qag2%1EU Z) &DM8Vi(4Ri#o-lcp04(*nwL&- OQ VvJNM1n04eao)t8G%kkOT(lgzjTv3vuWu7K#!WGs2JKFgwr KXIG8R !S& w#g+C $W6zc vXInuc mbA8EmYEW6G9$Vdhb8kY)GTYHG(a7
展开阅读全文