标签:x86 linux system-calls
我们使用’int’或新的’syscall / sysenter’指令从ring3转到ring0.这是否意味着需要为内核修改的页表和其他内容是由’int’指令自动完成的,或者’int 0x80’的中断处理程序将执行所需的操作并跳转到相应的系统调用.
此外,当从系统调用返回时,我们再次需要转到用户空间.为此,我们需要知道用户空间中的指令地址以继续用户应用程序.存储的地址在哪里. ‘ret’指令是否会自动将响铃从ring3更改为ring0或此环更换机制在何处/如何进行?
然后,我读到从ring3变为ring0并不像从ring0变为ring3那样昂贵.为什么会这样?
谢谢,
巴拉
解决方法:
切换到内核模式时页面表不会更改 – 虚拟地址空间的内核部分只是标记为只能在ring0中访问,因此它只是可以访问.内核在更改当前进程时会更改页表.
int 0x80指令由陷阱门提供,该陷阱门为处理器提供跳转到CS:EIP对的地址.新的CS(代码段选择器)包括0的CPL(当前权限级别),其实现向ring0的转换.
由于从ring3到ring0的转换,处理器还从TSS(任务分段选择器)中获取SS:ESP的新值,并将旧值保存在TSS中.这从用户模式堆栈切换到内核堆栈.
然后将先前的CS:EIP推送到内核堆栈(这是用户空间中的返回地址).所有这些都是由处理器完成的,因为int 0x80指令本身.
IRET指令可用于返回用户空间 – 它从内核堆栈弹出CS:EIP.由于CS包括3的CPL,处理器切换回ring3,这使得它也切换回ring3堆栈.
标签:x86,linux,system-calls 来源: https://codeday.me/bug/20190827/1740754.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。