LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 606|回复: 1

请教kernel0.11中核心态对主内存区空间的访问,谢谢!

[复制链接]
发表于 2005-4-18 19:06:41 | 显示全部楼层 |阅读模式
kernel0.11在copy_process()中,task数组中放的是get_free_page返回值,是物理地址,那么内核在访问task数组中对应进程的核心态堆栈时,应该设置pe项,请教在那个地方设置了pe项。
另外,内核态应该有权限访问所有进程空间,如果使用保护模式,访问一个进程数据时必须把对应进程的段描述符调入到ds中(这样理解对吗?),那么访问完进程数据后要重新把内核数据段描述符调入到ds中,然而,好像这样行不通,因为无法在被调进程中设置对应的调入内核数据段描述符的操作。请问内核态究竟是怎么样访问其它进程空间的?(难道是直接设置pe,使用物理地址,看起来不大可能,呵呵,有点晕),请指教!
谢谢!!
 楼主| 发表于 2005-4-25 21:14:50 | 显示全部楼层
呵呵,搞明白了,
内核在head.s中对自己的页表和物理地址作了一一映射,使在内核态时,对内核来说线性地址与物理地址是一致的,直接访问物理地址相时通过页表映射到该物理地址,从而实现对该物理地址的访问。因为内核对所有16M物理内存都作了映射,从而内核可以访问所有主内存区空间。
内核访问主内存区空间可以通过借助其他段寄存器来实现,比如借助fs来实现,在fs中load向要访问进程的数据段选择符(当然load之前要修改lgdtr,load后恢复lgdtr),从而fs隐藏部分含有要访问进程数据段描述符,结合偏移地址即可访问该进程数据空间!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表