免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5590 | 回复: 26

[内核入门] 3-4G虚拟空间? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2017-05-19 16:43 |显示全部楼层
1. 3-4G虚拟页面与0-1G物理页面建立映射的过程(先不考虑物理内存<1G的情况),是系统启动阶段就完成了吧?这样,内核从ZONE_NORMAL管理区分配到物理页面后,直接+3G就成为程序可以访问的虚拟地址了,省去了动态运行时建立映射的过程。

2. 创建新进程的时候,目录表的尾部256个目录项,是直接从父进程复制过来吧?那么父进程又得从父进程的父进程复制。。源头在哪呢?

3. 既然每个进程的目录表里,都有3-4G虚拟页面的映射信息,特别是物理内存超过1G时,访问3-4G范围的任何地址,都不会导致缺页异常,而目录项、页表项的低12位,又没有类似段描述符中用于权限控制的DPL,即没有硬件级的保护,那用户态不就可以直接用3-4G的虚拟地址,访问可能已经被内核或其它进程使用的物理页面了吗?


想好几天了,我内心中好急,求解脱



论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2017-05-19 17:02 |显示全部楼层
本帖最后由 amarant 于 2017-05-19 17:04 编辑

直接看代码是最好的

1. 3-4G虚拟页面与0-1G物理页面建立映射的过程(先不考虑物理内存<1G的情况),是系统启动阶段就完成了吧?这样,内核从ZONE_NORMAL管理区分配到物理页面后,直接+3G就成为程序可以访问的虚拟地址了,省去了动态运行时建立映射的过程。
是的。start_kernel 里面做的

2. 创建新进程的时候,目录表的尾部256个目录项,是直接从父进程复制过来吧?那么父进程又得从父进程的父进程复制。。源头在哪呢?
最早的一个就是 swapper,0号进程。

3. 既然每个进程的目录表里,都有3-4G虚拟页面的映射信息,特别是物理内存超过1G时,访问3-4G范围的任何地址,都不会导致缺页异常,而目录项、页表项的低12位,又没有类似段描述符中用于权限控制的DPL,即没有硬件级的保护,那用户态不就可以直接用3-4G的虚拟地址,访问可能已经被内核或其它进程使用的物理页面了吗?
x86有ring的概念,MMU里面可以配置内存页访问权限,不同体系架构不一样。道理就是有的页只能kernel访问。user space 的访问不了。

给你推荐一个学习的 环境 ,你可以写一个用户程序,访问kernel地址,然后用gdb一步一步看看到底发生了什么。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2017-05-19 17:18 |显示全部楼层
回复 2# amarant

好方法!但还是希望知道答案的,继续跟帖回复,因为我现在内心中很急,而且我还不会用gdb跟踪内核的代码~



论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2017-05-19 17:38 |显示全部楼层
DS/CS的xPL吧?类似KERNEL_DS/CS, USER_DS/CS啥的?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2017-05-19 18:14 |显示全部楼层
回复 4# nswcfd

__KERNEL_DS、__USER_DS的高13位指向的段描述符,都是指向0-4G整个段,用户态虽然没有权限访问__KERNEL_DS对应的段描述符,但通过__USER_DS对应的描述符,仍然能完成段式映射,得到与逻辑地址相同的线性地址,但线性地址通过页式管理往物理地址映射的过程,硬件上就没有看到有权限检查了。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2017-05-19 18:17 |显示全部楼层
那可不可以先教教我问题1、问题2

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2017-05-19 21:46 |显示全部楼层
回复 4# nswcfd

我的疑问是这样,只不过有些地方不确定是不是我误解了:__USER_DS,RPL为3,对应段描述符的DPL也为3,指向以0为起点、长度为4G的段。
步骤1:在用户态访问3.5G这个逻辑地址;
步骤2:段式映射过程中权限、长度检查都是可以通过的,从而得到3.5G的线性地址;

步骤3:3.5G虚拟地址对应的目录项,肯定在目录表的尾部1/4范围,而尾部1/4范围,各个进程都一样,因为这部分用于内核空间的映射,在系统启动时就已经与0-1G物理页面建立好映射了,所以肯定能映射到相应的物理地址。一方面,目录项、页表项低12位页属性中,没有DPL,映射过程不会被硬件阻挡;另一方面,由于映射关系存在,所以也不会进入缺页异常,而被软件层的保护阻挡。这样,用户态不就可以直接访问内核空间了吗?虽然明知道这样明显不安全,但我不理解如果不能,是哪个环节保证不能的?

论坛徽章:
0
发表于 2017-05-22 19:44 |显示全部楼层
问题1:strart_kernel --> paging_init,你可以看一下陈莉君的 《深入分析 Linux 源代码》

问题2:http://blog.chinaunix.net/uid-26772137-id-3357318.html

问题三:用户想访问 3G ~ 4G 的虚拟空间,是直接将想访问的一部分内核页表复制到进程的页表中,就可以访问了,进程有内核态和用户态,在内核态的时候,只能执行内核的固定代码,应该不会有安全性的问题吧。

论坛徽章:
0
发表于 2017-05-23 17:39 |显示全部楼层
....没必要 理解32位 的了
直接64位。  足够大 不需要 重复利用。简单l明了。 直接够用了。
看32位的反而 难理解

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2017-05-23 18:37 |显示全部楼层
回复 9# nuclearxin

但我还是想搞明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP