shijiaoan
驱动牛犊
驱动牛犊
  • 注册日期2005-11-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分232分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:1236回复:1

想问一下关于内存的一些问题

楼主#
更多 发布于:2008-05-12 13:30
当调用系统函数时,会在kisystemservice函数里进入内核 其中会把参数从用户空间堆栈复制到系统空间堆栈,这里想问一下,在kisystemservice函数里已经是内核状态了吗,每个进程都会有个Page Directory 它的值保存在cr3里 ,当进入内核时,cr3的值是系统的还是进程的?如果是系统的,为什么可以从用户空间复制出数据?不同的cr3计算出来的物理地址是不同的,如果是进程的,为什么不同的进程却可以共享一个内核空间 ?
albert21st
驱动牛犊
驱动牛犊
  • 注册日期2006-09-27
  • 最后登录2009-09-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望97点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-05-30 21:40
     首先,别把模式切换和线程切换弄混淆了。
    然后,对于不同的进程,它们的页目录里的指向系统空间的页表基本相同,这就是你说的:“不同的进程为什么可以共享系统空间”。至于为什么,说一句很常用的话,它就是这么设计的。一种设计总是会考虑到很多的因素,如果不这样设计,那么会遇到很多问题,我说一个,然后你再想想,举一反三:内核模式下的代码某个时刻在进程A的上下文申请了一块系统内存,得到地址pAddr = 0x80f00000,然后它返回到用户模式中,过一会进程B运行了,不过这时CPU发生中断,这时应该把设备中的数据读到刚才的pAddr = 0x80f00000中(这是假设的,实际上这太常见了),但这时0x80f00000在进程B的CR3下就可能是映射到别的物理内存中了。
    另外,哪些进程的页目录中的哪些页表项是相同的这完全是根据内核开发人员的需求设计的,灵活性很大。但可以肯定的是必须要有相同的,因为内核代码在很多情况下都是在随意的线程上下文中执行的。
游客

返回顶部