当前位置: 技术问答>linux和unix
[给今天还在奋斗的大虾散分]用户空间的代码能否直接访问内核空间的数据????
来源: 互联网 发布时间:2016-05-18
本文导语: 有下面2段文字: 1. 某大侠在自己的Blog中写到: 32位MIPS CPU中,程序的内存地址分为四大区域,用传统命名来说,分别是:kuseg,kseg0,kseg1和kseg2。 除了kuseg只能在核心态下使用,其它三个都可以在用户态模式中存...
有下面2段文字:
1. 某大侠在自己的Blog中写到:
32位MIPS CPU中,程序的内存地址分为四大区域,用传统命名来说,分别是:kuseg,kseg0,kseg1和kseg2。 除了kuseg只能在核心态下使用,其它三个都可以在用户态模式中存取。
2. 在MIPSR440的手册中看到:
All valid User mode virtual addresses have their most-significant bit
cleared to 0; any attempt to reference an address with the most-significant
bit set while in User mode causes an Address Error exception.
觉得这两个人的观点是相互矛盾的:到底在用户态下能否直接访问内核空间(kseg0,kseg1),就是说能在用户模式下直接否访问0x1xxxxxxx的virtual address??难道这内核模式下不能访问内核空间???非常怀疑那位大侠的话。还是说,我对别人的话理解错误。
个人理解:
1. 在内核模式下,,能访问所有的空间,甚至能直接去运行用户空间的代码(MIPS中CPU产生的地址都是虚地址,根据高3位的不同,会做不同的转换,如果最高3位都是0,就去查TLB,否则除了kseg3和kuseg外都是高3位置接清0做物理地址),不过直接去运行用户空间的代码没必要,也没意义;但是访问用户空间的数据就有意义,没看过copy_to_user的代码,,猜测这个代码就是在内核模式下,内核代码把数据从内核空间搬到用户空间的。
2. 在用户模式下,用户空间的代码只能老老实实的访问自己那块空间,,有事通过系统调用陷入内核模式,,让内核代码帮忙。用户模式下,,是不能直接访问内核空间的。
也和一个老同事讨论过,,,他说我理解的恰恰相反。应该是:在用户模式下可以访问内核空间,反之不能。。似乎他和前面那大侠理解相同。 个人觉得这中说法完全没有道理,系统也完全不应该这样设计。。
一个简单的问题,,让我有点怀疑自己这些年的理解是否都是完全错的,,严重怀疑! 期望那位大侠指点下,如果我理解错误,最好能说明下Linux或别的系统为什么要设计成“除了kuseg只能在核心态下使用,其它三个都可以在用户态模式中存取”!
1. 某大侠在自己的Blog中写到:
32位MIPS CPU中,程序的内存地址分为四大区域,用传统命名来说,分别是:kuseg,kseg0,kseg1和kseg2。 除了kuseg只能在核心态下使用,其它三个都可以在用户态模式中存取。
2. 在MIPSR440的手册中看到:
All valid User mode virtual addresses have their most-significant bit
cleared to 0; any attempt to reference an address with the most-significant
bit set while in User mode causes an Address Error exception.
觉得这两个人的观点是相互矛盾的:到底在用户态下能否直接访问内核空间(kseg0,kseg1),就是说能在用户模式下直接否访问0x1xxxxxxx的virtual address??难道这内核模式下不能访问内核空间???非常怀疑那位大侠的话。还是说,我对别人的话理解错误。
个人理解:
1. 在内核模式下,,能访问所有的空间,甚至能直接去运行用户空间的代码(MIPS中CPU产生的地址都是虚地址,根据高3位的不同,会做不同的转换,如果最高3位都是0,就去查TLB,否则除了kseg3和kuseg外都是高3位置接清0做物理地址),不过直接去运行用户空间的代码没必要,也没意义;但是访问用户空间的数据就有意义,没看过copy_to_user的代码,,猜测这个代码就是在内核模式下,内核代码把数据从内核空间搬到用户空间的。
2. 在用户模式下,用户空间的代码只能老老实实的访问自己那块空间,,有事通过系统调用陷入内核模式,,让内核代码帮忙。用户模式下,,是不能直接访问内核空间的。
也和一个老同事讨论过,,,他说我理解的恰恰相反。应该是:在用户模式下可以访问内核空间,反之不能。。似乎他和前面那大侠理解相同。 个人觉得这中说法完全没有道理,系统也完全不应该这样设计。。
一个简单的问题,,让我有点怀疑自己这些年的理解是否都是完全错的,,严重怀疑! 期望那位大侠指点下,如果我理解错误,最好能说明下Linux或别的系统为什么要设计成“除了kuseg只能在核心态下使用,其它三个都可以在用户态模式中存取”!
|
你理解的基本正确。在mips下,内核态可以访问ku k0 k1 k2所有这四个区域的地址空间。用户态只能访问ku区域的地址空间。
你最上面引用的blog正好相反,非常荒谬,怀疑你是引用错了,或是写blog的人引用错了。
你最上面引用的blog正好相反,非常荒谬,怀疑你是引用错了,或是写blog的人引用错了。
|
觉得老兄似乎概念不清:
1、用户态下代码是没有权限直接修改CPU执行等级的。
2、用户态下因为系统调用或其它方式导致CPU执行等级改变之后,就已经运行在内核态了,当系统调用执行完之后,CPU执行等级会再次改变,回到用户态执行。
|
用户态代码是可以访问内核态空间的。
通过修改用户态代码的CPU执行等级那么用户态线程将拥有内核态程序的执行权限,那么也就能访问内核空间了。
内核态程序的CPU执行等级是0级,应用态是3级。
另外内核程序访问用户态空间一点问题都没有,正常的寻址能到的地方,内核程序都能访问到。
通过修改用户态代码的CPU执行等级那么用户态线程将拥有内核态程序的执行权限,那么也就能访问内核空间了。
内核态程序的CPU执行等级是0级,应用态是3级。
另外内核程序访问用户态空间一点问题都没有,正常的寻址能到的地方,内核程序都能访问到。
|
支持4楼见解
|
有点不一样的,X86专门为用户态和内核态做了切换的指令,而mips没有。
我同意8楼的观点,既然是要保护内核空间的就不可能用户态空间能够修改,这样CPU的设计上就自相矛盾了。
我同意8楼的观点,既然是要保护内核空间的就不可能用户态空间能够修改,这样CPU的设计上就自相矛盾了。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。