为什么内核不能调用用户态代码???
2018-03-16 17:25
260 查看
我们知道内核和用户共用4GB空间(32位),共用一套32位地址,此外内核的权限是0,那么内核理论上可以访问4GB空间的任意地方,但是为什么你重没有见过内核调用用户态的代码,或读写用户态的数据?
哈哈!
因为你忽略了两个细节:
(1)这里用的是虚拟地址。
(2)内核态和用户态是异步的。
由于这两个原因,内核永远不知道究竟是哪个进程了他处于同一时空。
比如:
4点钟,进程A的fun()在物理空间上。
5点钟,进程A的fun()被移到了块设备上。这时,内核如果想要调用进程A的fun(),但是即使他按照A的虚拟地址去调用,也不可能找到fun()。
所以内核访问用户态是不可预知的,无意义的。
哈哈!
因为你忽略了两个细节:
(1)这里用的是虚拟地址。
(2)内核态和用户态是异步的。
由于这两个原因,内核永远不知道究竟是哪个进程了他处于同一时空。
比如:
4点钟,进程A的fun()在物理空间上。
5点钟,进程A的fun()被移到了块设备上。这时,内核如果想要调用进程A的fun(),但是即使他按照A的虚拟地址去调用,也不可能找到fun()。
所以内核访问用户态是不可预知的,无意义的。
相关文章推荐
- spinlock与linux内核调度的关系,那么为什么信号量保护的代码可以睡眠而自旋锁就不能呢?
- Pycharm里面使用PIL库之后,为什么调用Image的方法不能弹出代码提示,怎样能让代码提示弹出?
- 从用户态代码调用到内核态调用单步调试之旅01
- ◎Vbs调用MsAgent组件的新代码,可是问题是,为什么双击单击不能同时支持?
- 12、为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- 在内核中添加一个可以在用户态调用的函数
- 为什么线程不能调用fork
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- 用代码告诉你为什么努力工作却不能涨薪水
- static方法可以直接从普通方法(regular method)中调用,但是普通方法不能直接从static方法中调用,为什么?
- 不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment
- 42.Linux应用调试-初步制作系统调用(用户态->内核态)
- java中静态方法为什么不能调用非静态方法或者变量
- visual c#被Invoke调用的函数内部发生异常时,IDE不能定位到被Invoke函数内部的代码行