




免费预览已结束,剩余76页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux下的虚拟内存管理参考2 4 10 陆瑜王琦何宗键2005 4 Linux下的虚拟内存管理 虚拟内存基础进程的内存组织页面异常页面的交换 Linux下的虚拟内存管理 虚拟内存基础进程的内存组织页面异常页面的交换 虚拟内存的作用 使应用程序可以使用比物理内存大得多的内存 PageFault Pagein Pageout 提供内存的访问权限保护 Segmentfault AccessViolation linux虚拟内存空间 对于32位地址 意味着有4G字节的虚存空间 系统空间 最高的1G字节 0 xC0000000至0 xFFFFFFFF 用于内核本身 用户空间 较低的3G字节 0 x0至0 xBFFFFFFF linux虚拟内存空间 UserModeVirtualSpace 0 x00000000 KernelModeVirtualSpace 0 xC0000000 3GB 1GB 0 xFFFFFFFF UserModeVirtualSpace UserModeVirtualSpace Process1 Process2 Processn 分页 分页是把系统内存分成很小的页面 每个页面可以独立的从磁盘调入或调出 分页单元把线性地址转换成物理地址 页内连续的线性地址被映射到连续的物理地址中 分页机制可以实现请求调页 页面换出 内存共享和内存保护等功能 使进程可以使用大于内存容量的地址空间 Linux使用的是分页机制 Linux内核不支持可变大小的页面 通常页面大小定义为4K 地址映射 进程的线性地址分为四部分 页面目录索引 PGD 页面中间目录索引 PMD 页面表索引 PT 和偏移量 线性地址到物理地址的转换采用三级转换方法 在x86体系结构中 通过将页面中间目录定义为1 页面相关的宏可以把三级分解过程完美的转换到二级分解过程上去 Linux将32位逻辑地址分成三部分 高10位是页目录索引 中间10位是页表索引 剩下的12位用作偏移量 这样就构成了4K大小的页面 三层地址映射示意图 与内存相关的数据结构 Linux中页目录 PGD 页面中间目录 PMD 页表 PT 分别由数据结构pgd t pmd t pte t来表示 typedefstruct unsignedlongpmd pmd t typedefstruct unsignedlongpte pte t typedefstruct unsignedlongpgd pgd t typedefstruct unsignedlongpgprot pgprot t pgprot t记录了页面的保护信息 基本结构的定义 定义PGD PMD PTE等信息的代码如下 definePGDIR SHIFT22 线性地址中PGD下标位段的起始位置 即bit22 第23位 definePTRS PER PGD1024 每个PGD表中指针的个数为1024 definePMD SHIFT22 PMD下标的起始位置也为22 与PGD相同 表示PMD位段的长度为0 所以PMD表的大小自然是20 1 从三层映射落实到二层映射 definePTRS PER PMD1 definePAGE SHIFT12 线性地址中PTE下标位段的起始位置 definePTRS PER PTE1024 每个PTE表中指针的个数为1024 Linux下的虚拟内存管理 虚拟内存基础进程的内存组织页面异常页面的交换 几个重要数据结构 structvm area struct线性区描述符每个线性区描述符表示一个线性地址区间 一个进程所需要使用的线性空间中的各个部分未必是连续的 通常形成若干离散的 区间 这就需要vm area struct数据结构来对线性区间进行抽象 structmm struct内存描述符描述了与进程地址空间有关的全部信息 也是总的控制结构 每个进程只有一个mm struct结构 structtask struct进程描述符进程控制块 包含了与一个进程相关的所有信息 structvm operations struct用于对虚存的打开 关闭和建立映射 进程的内存组织 mm task struct mm struct mmap pgd 进程内存其他相关信息 vm area struct vm mm vm start vm end vm next 内存区域其他相关信息 虚拟地址空间 下一个vm area struct 物理地址空间 线性区描述符vm area struct VMA 内核使用一个或多个VMA来跟踪进程使用的内存区间 每个VMA代表进程地址空间的一块单独连续的区间 进程的两个VMA可以不连续 区间的划分并不仅仅取决于地址的连续性 也取决于对虚存页面的访问权 如果一个地址范围内的前半页和后半页有不同的访问权或其他属性 就要分成两个区间 进程所有VMA以链表的形式存储 若VMA数目较大的话 会创建一个AVL树来存储它们 因为AVL树中的搜索速度较快 structvm area struct结构定义源代码 15113structvm area struct 15114structmm struct vm mm 指向管理该vma块的mm struct结构15115unsignedlongvm start vma块的起始地址15116unsignedlongvm end vma块的结束地址 1 vm start vm end决定了一个虚存区间 vm start包含在区间里 而vm end不包括在区间里15117 同一进程的所有区间按地址高低链接起来15118 linkedlistofVMareaspertask sortedbyaddr 15119structvm area struct vm next 链表中连接下一vma块的指针15121pgprot tvm page prot 保护位 页面的状态信息15122unsignedshortvm flags 标志位 标志访问权限 structvm area struct结构定义源代码 续 15123 AVLtreeofVMareaspertask sortedbyaddress 一个进程vma块数目不超过AVL MIN MAP COUNT时用表存储 否则用AVL树存储15124shortvm avl height AVL树的高度15125structvm area struct vm avl left AVL树的左指针15126structvm area struct vm avl right AVL树的右指针15131structvm area struct vm next share 若该vma虚存区域由多个进程的vma共享 则这些vma连接成双向链表15132structvm area struct vm pprev share 15134structvm operations struct vm ops 指向对vma块操作vm operations struct数据结构 用于虚存的打开 关闭和建立映射15135unsignedlongvm offset 若vma映射为文件或共享内存时 为文件或共享内存中的偏移地址15136structfile vm file 该vma对应文件的inode15137 进程的内存组织 mm task struct mm struct mmap pgd 进程内存其他相关信息 vm area struct vm mm vm start vm end vm next 内存区域其他相关信息 虚拟地址空间 下一个vm area struct 物理地址空间 内存描述符mm struct 结构mm struct管理一个进程所有的VMA 指向这种结构类型的指针在结构structtask struct中 即每个进程包含一个mm成员 mm成员可以用来判断两个任务是否在同一个线程组中 因为两个具有相同mm成员的任务管理着同一块全局内存区域 mm struct结构体的mmap成员指向进程的VMA链表 若进程的VMA以AVL树的形式存储 则mmap avl成员指向树的根节点 加快查找速度 structmm struct结构定义源代码 16270structmm struct 16271structvm area struct mmap 指向vma链表16272structvm area struct mmap avl 指向vma的AVL树16273 lastfind vmaresult 16274structvm area struct mmap cache 最近一次访问的vma块16275pgd t pgd 进程页目录起始地址16276atomic tcount 使用该mm struct的线程数目intmap count 管理的vma数目 unsignedlongstart code end code 代码段的起始地址和结束地址16281start data end data 数据段的起始地址和结束地址 structmm struct结构定义源代码 续 16282unsignedlongstart brk brk start stack 堆和栈的起始地址16283unsignedlongarg start arg end env start env end 参数区和环境区的地址空间16284unsignedlongrss total vm locked vm vma的总页面数 被锁定vma的数目 rss是进程内容驻留在物理页面的页面总数 进程的内存组织 mm task struct mm struct mmap pgd 进程内存其他相关信息 vm area struct vm mm vm start vm end vm next 内存区域其他相关信息 虚拟地址空间 下一个vm area struct 物理地址空间 structvm operations struct 一个VMA可能代表一个普通的内存空间 也可能是对应于一个文件 共享内存 交换设备等特别的对象而建立的一块内存区域 对象类型vm operations struct抽象了各种可能提供给被映射对象的操作 比如打开 关闭之类 一旦VMA映射为一个对象 那末它的vm ops成员就会是一个非空指针 指向一个表示被映射对象所提供操作的vm operations struct结构体 structvm operations struct结构定义源代码 15171structvm operations struct 15172void open structvm area struct area 打开15173void close structvm area struct area 关闭15174void unmap structvm area struct area 15175unsignedlong size t 取消映射15176void protect structvm area struct area 15177unsignedlong size t unsignedintnewprot 设置保护标志15178int sync structvm area struct area 15179unsignedlong size t unsignedintflags 同步内存页面与硬盘 structvm operations struct结构定义源代码 续 15180void advise structvm area struct area 15181unsignedlong size t unsignedintadvise 15182unsignedlong nopage structvm area struct area 15183unsignedlongaddress intwrite access 缺页15184unsignedlong wppage structvm area struct area 15185unsignedlongaddress unsignedlongpage 写拷贝15186int swapout structvm area struct structpage 页面换出15187pte t swapin structvm area struct unsignedlong 15188unsignedlong 页面调入15189 进程 内存 的创建 do fork copy mm dup mmap copy page range build mmap rb 创建子进程的task struct 复制父进程的mm struct 复制父进程的内存空间信息 调用多次 每次复制父进程的一个vm area struct及其对应的页目录表项和页面表项 构造子进程内存区域的红黑树 若创建的是轻量进程 clone flags CLONE VM非零 则父子进程共享mm struct 即令tsk mm current mm后直接返回 配合COW 将父子进程的私有可写页面都置为只读页面 普通进程 内存 的创建 do fork copy mm dup mmap copy page range 进度 父进程 current 子进程 tsk mm task struct mm struct vm area struct mmap vm mm vm start vm end vm next vm mm vm start vm end vm next 线性地址空间 物理地址空间 mm task struct mm struct vm area struct mmap vm mm vm start vm end vm next vm mm vm start vm end vm next 线性地址空间 pgd pgd 页目录表 页目录表 copy page range 轻量进程 内存 的创建 do fork copy mm 进度 父进程 current 子进程 tsk mm task struct mm struct vm area struct mmap vm mm vm start vm end vm next vm mm vm start vm end vm next 线性地址空间 物理地址空间 mm task struct 线性地址空间 pgd 页目录表 几个重要函数 find vma 作用 给定一个属于某个进程的虚拟地址 要求找到其所属的区间以及相应的vm area struct结构参数 进程的虚拟地址addr 指向该进程的mm struct返回 所找到的vm area structget unmapped area 作用 查找给定长度的空闲线性地址区间参数 指定区间的长度len 查找的起始地址addr返回 查找成功则返回这个区间的起始地址 否则返回0insert vm struct 作用 建立新的虚存区间结构时 将其VMA插入到mm struct中的线性队列或AVL树中去 参数 指定进程描述符的地址mm 指定要插入的VMA描述符的地址vmp find vma 该函数有两个参数 一个是地址addr 一个是指向该进程的mm struct结构指针 首先 看一下这地址是否恰好在最近一次访问过的同一个区间中 一般这个命中率有35 这也是mm struct结构中设置mmap cache指针的原因 find vma 续 如果没有命中的话 则要搜索了 如果已经建立了AVL树 就在AVL树中搜索 否则在线性队列中搜索 它确定vm end域大于addr的第一个线性区的位置 并返回这个区间描述符的地址 所选择的线性区间不一定要包含addr 1 2 3 结果为区域1 结果为区域2 结果为NULL addr addr addr find vma 续 若函数的返回值为零表示该地址所属的区间还未建立 此时通常要建立一个新的虚存区间结构 再调用insert vm struct 将其插入到mm struct中的线性队列或AVL树中 添加和删除区间 操作前 操作后 添加地址相邻且访问权限相同的线址区间 将原内存区域扩大 添加地址相邻且访问权限不同的线址区间 创建新的内存区域 删除位于内存区域一端的一段线址区间 将原内存区域缩小 删除位于内存区域内部的一段线址区间 原内存区域变为两个较小内存区域 可能会由于超过最大内存区域数目而失败 分配线性区间 函数 do mmap 作用 为当前进程创建并初始化一个新的线性区间 如果分配成功的话就可以将其与已有的线性区进行合并等操作 参数 file off 与文件映射有关addr 指定从何处开始查找一个空闲的区间len 线性地址区间的长度prot flag 这个线性区包含的页的存取权限和其他一些标志返回 新的线性区的线性地址 do mmap 分配线性区间 目标区间上已存在线址区间 get unmapped area 确定线性地址区间 后有详解 区间合法 确定新区间的FLAGS do munmap 释放已有线址空间 后有详解 成功删除 参数合法 返回值设为错误代码 Y N Y Y N N Y N 超过限制 物理内存足够 可否合并 分配并初始化vm area struct vm area struct加入链表和红黑树 修改mm struct中相关计数器 N N N Y Y Y 分配物理页面 返回值设为线址区间首地址 Y N 返回 要求锁定 get unmapped area 确定线性地址区间 addr len MAP FIXED 区间addr addr len合法 Y N addr 0 x40000000将起始地址设为1G 区间addr addr len可用 将起始地址addr设为其后第一个内存区域的结束地址 addr len 3G N N Y Y N 返回错误代码 返回addr addr 0 Y N N 区间addr addr len合法且可用 Y N 这个区间的起始地址必须是参数addr 释放线性地址区间 函数 do munmap 作用 从当前进程的地址空间中删除一个线性地址区间参数 区间的起始地址addr 程度len第一阶段 扫描进程所拥有的线性区链表 并删除与指定线性地址区间相重叠的所有区 第二阶段 更新进程的页表 并重新调整线性区链表 注意 要删除的区间并不总是对应一个线性区的 它可能是一个线性区的一部分或是跨越多个线性区 do munmap 释放线性区第一阶段 addr len 参数合法 调用find vma prev 查找第一个与其重叠的区域mpnt 返回错误代码 Y mpnt 0 返回0 mpnt vm start addr len Y N Y mpnt被从中截取且已达到最大内存区域限制 N Y 分配一vm area struct结构extra N extra 0 Y npp prev prev vm next mm mmap 对 mm page table lock加锁 将每一个与区间 addr addr len 有重叠的内存区域脱链脱树 并加入free对列首 mm mmap cache清零 对 mm page table lock解锁 步骤二 这一步也许是没有必要的 只是为了出现错误时很容易退出 建立与该线性地址区间相重叠的所有线性区链表 do munmap 释放线性区第二阶段 mpnt free 非空 extra 0 N Y 释放extra 释放页面表页面free pgtables 返回0 N free free vm next 计算实际需释放起始地址和大小 若为文件映射则加写保护 Y 如果有 从文件的映射队列中删除该内存区域 mm map count 解除页面映射zap page range 修复内存区域unmap fixup 若为文件映射则解除写保护 Linux下的虚拟内存管理 虚拟内存基础进程的内存组织页面异常页面的交换 缺页异常处理 缺页中断服务程序 do page fault 它把引起缺页的线性地址和当前进程的线性区比较 按下图的方案选择适当的方法处理这个异常 受访地址是否属于进程地址空间 访问类型是否符合所在内存区域的访问权限 此次异常是否发生在用户态 访问合法 分配新物理页面 访问非法 发送SIGSEGV 内核BUG 杀掉进程 是 是 是 否 否 否 do page fault 参数 异常发生时微处理器寄存器的值regs 一个三位的error code error code各位含义 不使用 0 1 2 0 1 页面不在内存中 页面在内存中 读操作 写操作 核心态 用户态 error code 3 31 do page fault 执行过程 regs error code addr Rcr2从cr2获得异常地址 addr TASK SIZE error code 5 vmalloc fault Y N no context bad area good area 打开irq tsk current mm tsk mm info si code SEGV MAPERR in interrupt mm Y 对mm加读锁 vma find vma vma NULL addr在vma内 VM GROWSDOWN error code 4 addr 32 regs esp expand stack N Y N Y Y Y Y Y N N N N survive out of memory do sigbus N do page fault 执行过程 regs error code addr Rcr2从cr2获得异常地址 addr TASK SIZE error code 5 vmalloc fault Y N 打开irq tsk current N 读取引起缺页的线性地址 把这个值放入cr2控制寄存器中 通过宏操作current去取得当前进程的task struct 检测其地址是否大于TASK SIZE且非用户态下 若是则转向vmalloc fault do page fault 执行过程 regs error code addr Rcr2从cr2获得异常地址 addr TASK SIZE error code 5 vmalloc fault Y N no context bad area good area 打开irq tsk current mm tsk mm info si code SEGV MAPERR in interrupt mm Y 对mm加读锁 vma find vma vma NULL addr在vma内 VM GROWSDOWN error code 4 addr 32 regs esp expand stack N Y N Y Y Y Y Y N N N N survive out of memory do sigbus N do page fault 执行过程 no context bad area mm tsk mm info si code SEGV MAPERR in interrupt mm Y 对mm加读锁 vma find vma vma NULL N Y N 检查异常发生时cpu是否正在处理中断或者执行内核线程 若是 则这两者都与当前进程无关 所以转向no context处 检查进程的线性区以决定这个错误的线性地址是否包含在进程的地址空间中 如果找不到 那么本次异常就是越界访问引起的 转向bad area do page fault 执行过程 regs error code addr Rcr2从cr2获得异常地址 addr TASK SIZE error code 5 vmalloc fault Y N no context bad area good area 打开irq tsk current mm tsk mm info si code SEGV MAPERR in interrupt mm Y 对mm加读锁 vma find vma vma NULL addr在vma内 VM GROWSDOWN error code 4 addr 32 regs esp expand stack N Y N Y Y Y Y Y N N N N survive out of memory do sigbus N 用户堆栈扩展 当用户堆栈过小 此时如果发生越界访问 则会对用户堆栈进行扩展 这就是上图中expand stack的作用 在do page fault 中是按照如下进行判断越界访问是否是合理的堆栈扩展要求的 bad area good area VM GROWSDOWN error code 4 addr 32 regs esp expand stack Y Y Y Y N N N N 该地址所在页面的映射尚未建立或已经撤销 空洞上方区间是否是堆栈区间 异常是否发生在用户空间 检查异常发生时的地址是否紧挨堆栈指针所指地方 一次压入堆栈的是32个字节 所以检查的准则是 esp 32 检查是否允许进程既扩展它的堆栈也扩展它的地址空间 若返回值为非0 说明没有存储空间可分配 堆栈扩展expand stack vma addr 按页边界对齐addr 计算需新增的页面数 对扩展后的堆栈区间进行检查 返回错误代码 ENOMEM bad area 修改堆栈区结构vma的内容 扩展后的区间大小超过了进程规定的可用堆栈大小或动态分配的页面总量超过了可用于该进程的资源限制 未超过限制 此处并未建立新扩展的页面对物理内存的映射 由下面的good area完成 页面异常的不同处理方式 good area 处于某一内存区域中或在栈的可扩展区域中bad area 不在任一内存区域中 且不在栈的可扩展区域中 no context 处于中断处理过程中或者进程为内核线程 即没有自己的进程地址空间 vmalloc fault 进程在用户态下访问核心地址空间 good area info si code SEGV ACCERR write 0 写操作 所在内存区域不允许写操作 bad area Y Y survive N write N 页面在内存中 所在内存区域有读或执行权限 N N Y Y 如果异常由写访问引起 则检查这个线性区是否可写 不可则跳到bad area 如果异常由读或执行引起 检查这一页是否已存在于RAM中 若存在 说明异常是由于进程试图访问一个有特权的页 跳到bad area survive handle mm fault 后有详解 do sigbus out of memory tsk min flt tsk maj flt 1 2 VM86模式的相关处理 对mm释放读锁 返回 0 default 返回值1 次要错误 非阻塞 返回值2 主要错误 阻塞 返回值 1 内存不足返回值0 其他错误 handle mm fault 设置当前进程状态为TASK RUNNING 计算相关目录项的地址pgd 对页面表加锁 计算 分配 相关中间目录项pmd pmd NULL 对页面表解锁 返回 1 N 计算 分配 相关页表项pte pte NULL Y N 返回handle pte fault Y handle pte fault entry pte entry在内存中 entry为空 N Y 返回do no page Y 返回do swap page N 写操作 返回do wp page entry不可写 Y entry标记为脏 Y N entry标记为年轻 N 建立新的地址映射establish pte 对页面表解锁 返回1 do sigbus 对mm释放读锁 tsk thread cr2 address tsk thread error code error code tsk thread trap no 14 info si signo SIGBUS info si errno 0 info si code BUS ADRERR info si addr void address 向进程发送SIGBUS信号force sig info SIGBUS 发生在核心态 返回 no context N Y out of memory 对mm释放读锁 tsk pid 1 do exit SIGKILL no context Y tsk policy SCHED YIELD schedule 对mm加读锁 survive Y printk VM killingprocess s n tsk comm 发生在用户态 N N bad area 对mm释放读锁 tsk thread cr2 address tsk thread error code error code tsk thread trap no 14 info si signo SIGBUS info si errno 0 info si addr void address 向进程发送SIGSEGV信号force sig info SIGSEGV 发生在用户态 返回 no context N Y boot cpu data f00f bug N nr 6 nr address idt 3 do invalid op regs 0 Y Y N 如果错误发生在用户态 则发送一个SIGSEGV信号给当前进程并结束函数 如果异常发生在核心态 仍有两种情况 一是系统调用时把某个线性地址作为参数传给了内核 二是一个真正的内核缺陷引起的 no context 查找修复代码表 ex table 返回 do exit 找到 Y regs eip置为修复代码地址 N bust spinlocks 1 打印出错信息 bust spinlocks 1 vmalloc fault 计算相关pgd项在pgd中的偏移量offset 计算进程pgd中相关目录项的地址pgd pgd k存在 返回 no context N Y 计算参考pgd中相关目录项的地址pgd k 将pgd设为pgd k的值 计算pgd中相关中间目录项的地址pmd pmd k存在 计算pgd k中相关中间目录项的地址pmd k 将pmd设为pmd k的值 pte k存在 计算pmd k中相关页面表项的地址pte k Y Y N N Linux下的虚拟内存管理 虚拟内存基础进程的内存组织页面异常页面的交换 页面交换的目的 扩展进程可以有效使用的地址空间扩充动态RAM的数量来装载进程 页面的换出 问题 哪些页面被换出 如何在交换区中分布页 怎样选择被换出的页面 什么时候换出页面 哪些页面被换出 Linux使用最近最少使用 LRU 算法来选择要抛弃的页面 交换后台进程 kswapd 依次检查系统中的每个进程以确认谁最适合交换出去 交换区 swaparea 从内存中换出的页存放在交换区中 每个交换区都由一个页插槽 pageslot 序列组成 也就是说 使用4096字节大小的块来包含一个换出页 交换区的第一个页插槽用来永久存放有关这个交换区的信息 每个活动的交换区在内存中都有自己的swap info struct描述符 交换区数据结构 MAX SWAPFILES 32 swap info swap info struct 交换区 计数向量 swap header swap file swap map swap device 1 0 2 0 1 32767 32768 1 1 空闲槽 已用槽 永久槽 缺陷槽 0 这个槽是空闲的 正数 被填充成一个换出页的内容32767 存放在此槽中的为持久页 换出页标识符 页面表项三种不同值 各位全为0 未分配页面 最低位为0 其他位不全为0 已换出页面 最低位为1 正常未换出页面 0 0 1 6 7 8 31 交换区号 页面槽号 0 换出页面标识符 0 1 31 页面表项 1 在内存中0 不在内存 交换区相关函数 sys swapon 启用交换区sys swapoff 停用交换区try to unuse 尝试将交换区上页面换入 为停用交换区做准备scan swap map 在指定交换区中查找一个空闲页面槽get swap page 在所有启用的交换区中查找一个空闲页面槽swap free 换入一个页面后 调整相应swap map计数器 交换高速缓存 提出 两个或多个进程共享一个页面时 由于内核是单独处理每个进程的 有可能共享页已经被从进程A的地址空间中删除 但却仍然留在进程B的地址空间中 解决 Linux使用交换高速缓存来处里这种情况 交换高速缓存区搜集了已经被拷贝到交换区中的所有共享页 交换高速缓存工作原理 2 进程A 进程B 交换区 交换缓存 页面P 2 进程A 进程B 交换区 交换缓存 页面P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度健身房租赁合同包含营养咨询及健身课程
- 2025年度瓷砖施工与建筑节能评估合同范本
- 2025年度欧派橱柜品牌授权与运营合同范本
- 2025版区块链技术应用开发合同范本下载
- 2025年度房产买卖定金合同(含房产交易纠纷解决机制)
- 河北省博野县2025年上半年公开招聘城市协管员试题含答案分析
- 2025翻译公司项目合作保密协议范本
- 2025年度展览馆场地租赁服务协议
- 2025版室内软装设计与施工一体化合作协议
- 2025东莞绿色住宅租赁及节能服务合同
- 第二章第二节女性生殖系统生理课件
- 宁波市慈溪市人民法院招聘审判辅助人员笔试真题2024
- 2021-2022学年人教版数学九年级下册相似三角形性质与判定 同步练习卷
- 《高尔夫基础培训》课件
- 沪教版(五四学制)(2024)六年级下册单词表+默写单
- 城市管理辅助队伍服务投标方案
- 第五课+弘扬劳动精神、劳模精神、工匠精神【中职专用】中职思想政治《职业道德与法治》高效课堂(高教版2023·基础模块)
- 储罐及输油管道拆除方案
- 手术室院感防控措施
- 地理2024-2025学年人教版七年级上册地理知识点
- 脐血流异常护理措施
评论
0/150
提交评论