LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: westroom

内核页表的建立

[复制链接]
发表于 2004-12-30 16:07:52 | 显示全部楼层
Post by westroom
很想弄明白在用户程序中,突然执行到一句系统调用的时候,为什么就可以访问页表目录的高项了呢?是不是在段式映射那里进行的这种转换,我想了想页映射没有这种控制吧?


"突然执行到一句系统调用"

系统调用是在用户态设置好调用参数后,执行指令 int $0x80,进入内核事先设置好的0x80号中断的中断处理程序。这里利用了i386的陷阱硬件机制,实现运行级别从ring3到ring0的提升。
 楼主| 发表于 2004-12-31 09:15:37 | 显示全部楼层
然后呢?是什么机制允许它使用页表高项的?
发表于 2004-12-31 12:28:19 | 显示全部楼层
Post by westroom
然后呢?是什么机制允许它使用页表高项的?

IDTR指向的中断描述表中的第0x80项(对应于中断0x80),中间内核会设置一个中断处理地址的cs:eip,cs即为内核的代码段。当前特权级就变成了cs的【2:1】位00。于是就进入了ring 0。

这只是个大略的描述。i386保护模式的中断项其实还有很多的格式(中断,陷阱……)以及相应的跳转策略和权限检查。
发表于 2005-1-12 14:09:40 | 显示全部楼层
[QUOTE=threeseconds]每个进程都是拥有4G地址空间,只是用户态下面无法访问高1G空间;内核空间是被所有进程共享的,那么该进程的页目录表的高项部分就应该是内核页表的内容,只是USER/SUPERVISOR位是0,用户态无法访问而已;CR3寄存器就是该进程的页目录地址,进程从用户态切换到内核态,CR3没变,但是却拥有可以访问高项的内核空间的权限了,这样发生系统调用的时候,内核也直接访问当前进程的用户空间,使用的虚拟地址也和当前进程处于用户空间时候使用的虚拟地址是一样的。
下面这段代码是get_pgd_slow(pgd_alloc调用)中的:
memcpy(pgd + USER_PTRS_PER_PGD,
        swapper_pg_dir + USER_PTRS_PER_PGD,
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
pgd_alloc可以为新进程建立一个页全局目录,swapper_pg_dir是内核页全局目录地址,USER_PTRS_PER_PGD是页全局目录中用户空间所占的表项数目,这里应该可以看到把内核页目录复制到进程的页目录的高项部分了。
由此看进程应该是不会直接使用内核页表,都是用的复制品。



如果在系统运行的过程中有ioremap类似的函数被驱动程序调用.内核的虚存空间会被扩展.新扩展的部分是怎样和其它进程的3G以上的地址空间的映射同步的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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