复杂度3/5
机密度3/5
最后更新2021/04/25
前面介绍过内存分配以段为组织进行分配,也就是不同特性的内存申请会从不同的segmeng中分配,每个segment都维护着sbrk和max_stack两个值,用于验证页面是否合法。如果不合法,当前进程会直接被core dump掉,而如果是内核进程,则可能会导致整个系统dump。
另一个检验是DMA,此处的DMA不是跨体系的(server内存和io设备内存之间的映射),而是跨驱动或者跨进程的异步操作,当前进程把访问请求交给接手的进程后,两者之间数据通信可以通过DMA映射完成,而无需数据通过cpu在两者地址空间挪来挪去。DMA映射导致在数据没有被调用程序彻底释放之前是不能被访问的。如果发生这种情况,当前进程就会被置于等待CPU队列中,等待下次被唤醒。
程序访问内存页面时可能会遇到如下异常状态:
Page Faults Not Allowed
当中断发生,正在中断处理例程中,或者部分中断被禁止,通常只有kernel代码会执行禁止操作,当这种情况发生,vmm产生kernel exception,视情况不同,可能core进程,也可能crash操作系统
Page Does Not Exist,可能原因:
Page number超限(前面提到的segment上下两个限制位置sbrk和max_stack),Segment ID非法
Segment Faults
请求的segment地址不在当前segment地址表中,VMM将开始查找全部(分配的)segment number,如果找到,则被load进segment table,并且重新执行刚才导致exception的指令。有可能需要把当前的一个segment id清掉才能给新segment id空出空间。如果找不到segment number,与非法访问地址处理方式相同。
Memory Exceptions
如果在内核处理部分,所有exception处理例程被执行,根据预先定义处理;如果在用户处理部分,process/thread接收到SIGSEGV信号,被core
Fatal Memory Exceptions
以下情况发生,系统不进行任何处理,直接halt
中断处理时发生page fault;访问内核处理部分数据发生protection fault;paging space满,内核数据io错误;
在内核处理部分发生指令/数据存储意外(exception,要访问的页面不在内存,如果是数据意外没有定义handler)
在hardware segment registers中保留了4位用于对当前segment进行属性标记:
SID bit 0 (bit 8 in a segment register)表示该页正在或即将进行I/O,用来“隐藏”页面
SID bits 1-3 (bits 9-11 in a segment register) 用于允许文件系统访问大到2Gb的文件而不用使用其它8位segment IDs
(注:AIX限制使用48-bit internal virtual addresses即256 Terabytes of virtual space,并不是64bit)
Memory Protection
通过 page-protect (PP) bits可以对某个页面进行保护,保护通过硬件机制完成
在硬件进行数据访问(读或写)之前,先查看几个重要的保护位
Current execution state (User or Kernel mode) in MSR
Corresponding key bit in segment register (Kp or Ks)
PP bits in page table entry for this page, PP位组合可能有下面几种情况:
——————-
1 00 Read/Write
1 01 Write
x 10 None
x 11 Write
——————