linux那些事之page fault(AMD64架构)(user space)(2)

do_user_addr_fault

用户空间地址处理是page fault主要处理流程,x86 64位系统主要是do_user_addr_fault()函数 该处理部分是x86架构特有部分 即与架构有关处理,整个函数处理逻辑过程可以总结为如下图所示:

 do_user_addr_fault源码


/* Handle faults in the user portion of the address space */
static inline
void do_user_addr_fault(struct pt_regs *regs,
			unsigned long hw_error_code,
			unsigned long address)
{
	struct vm_area_struct *vma;
	struct task_struct *tsk;
	struct mm_struct *mm;
	vm_fault_t fault, major = 0;
	unsigned int flags = FAULT_FLAG_DEFAULT;

	tsk = current;
	mm = tsk->mm;//获取当前进程mm,发生的addr 属于当前进程

	/* 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux在ARMv8-A架构下使用长描述符格式处理页面错误(page fault)。 ARMv8-A架构引入了长描述符格式,这是一种改进的内存管理单元(MMU)设计,它提供了更灵活、更高效的地址转换和页面错误处理能力。 当发生页面错误时,例如访问一个没有映射的地址或试图访问一个只读内存区域进行写操作时,ARMv8-A的MMU会捕获这个错误并触发一个页面错误异常。 在长描述符格式下,页面错误有两种类型:同步页面错误和异步页面错误。同步页面错误是指对当前指令引起的页面错误,异常处理程序会被同步地执行。异步页面错误是指对其他指令引起的页面错误,异常处理程序可能会在以后的时间点执行。 对于页面错误的处理,Linux内核会在异常处理程序中根据错误类型采取相应的措施。通常,处理程序会检查错误类型和描述符类型,然后根据情况更新页表项或者触发进一步的异常处理流程。 ARMv8-A的长描述符格式提供了更多的页表项信息,例如权限设置、虚拟地址映射等,这使得页面错误的处理更加灵活和细粒度。此外,ARMv8-A还支持虚拟化技术,可以在虚拟机监视器和虚拟机之间进行页面错误的处理和隔离。 总的来说,Linux在ARMv8-A架构下使用长描述符格式处理页面错误,通过异常处理程序和改进的页表项结构,可以更加有效地处理和隔离页面错误,提升系统的可靠性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huo的藏经阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值