免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2988 | 回复: 9
打印 上一主题 下一主题

linux内核线性地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-16 20:23 |只看该作者 |倒序浏览
/*
* Enable paging
*/
movl $swapper_pg_dir-__PAGE_OFFSET,%eax
movl %eax,%cr3                /* set the page table pointer.. */
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0                /* ..and set paging (PG) bit */
ljmp $__BOOT_CS,$1f        /* Clear prefetch and normalize %eip */
如上是head.s中启用分页的代码。

其中第一句应该是取swapper_pg_dir变量的物理地址。__PAGE_OFFSET为0xc0000000,是内核线性地址的开始位置。
我的问题是怎么保证swapper_pg_dir的线性地址是0xc0000000之后的?
因为内核代码段和数据段的基址都是从0地址开始的,因此swapper_pg_dir的逻辑地址要大于0xc0000000.
是编译器把内核的起始逻辑地址放到0xc0000000位置?另外刚起机的一些初始化代码运行在实模式,逻辑地址不会超过0xc0000000,那么内核分为两个部分编译吗?
请各位高手指点一下,谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-07-16 22:07 |只看该作者
原帖由 biger410 于 2008-7-16 20:23 发表
/*
* Enable paging
*/
movl $swapper_pg_dir-__PAGE_OFFSET,%eax
movl %eax,%cr3                /* set the page table pointer.. */
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0                /* ..and set paging ( ...

swapper_pg_dir有链接器保证到3G之后,大概在3G+1M+_end(链接器指定,由内核代码段、数据段、未初始化数据长度决定),取值在3G+8M之内。

bootloader会把实模式的启动部分代码拷贝到1M以下执行,在此期间不会访问高端地址,在启动到startup_32之前,已经从实模式切换到保护模式了,只是paging没有打开而已

论坛徽章:
0
3 [报告]
发表于 2008-07-16 22:37 |只看该作者
非常感谢楼上这位朋友,大部分的疑惑都明白了,还有个小问题。如下:
实模式下物理地址是(seg << 4) + off,而off被链接器定位到3G之后,然后(seg << 4) + off产生的地址又在1M之下,是因为实模式下用到20根地址线,高12位被屏蔽掉了吗?

论坛徽章:
0
4 [报告]
发表于 2008-07-16 22:58 |只看该作者
原帖由 biger410 于 2008-7-16 22:37 发表
非常感谢楼上这位朋友,大部分的疑惑都明白了,还有个小问题。如下:
实模式下物理地址是(seg  

实模式下不会用到swapper_pg_dir,这个是在第一阶段建页表时使用的。此时已经是保护模式了。

论坛徽章:
0
5 [报告]
发表于 2008-07-16 23:03 |只看该作者
swapper_pg_dir不会用到。但会用到其他的变量,除非链接器对这些变量链接的地址不在3G之后,否则不就有我上面说的问题

论坛徽章:
0
6 [报告]
发表于 2008-07-16 23:19 |只看该作者
原帖由 biger410 于 2008-7-16 23:03 发表
swapper_pg_dir不会用到。但会用到其他的变量,除非链接器对这些变量链接的地址不在3G之后,否则不就有我上面说的问题

linux的实模式执行只有非常短的一个阶段,主要是初始化一些外设,例如显卡、磁盘控制器、键盘等等等,这些工作都不要使用内核其它数据结构,只需要读写一些leagcy的端口就可以了。
并且这段代码是被拷贝到1M以下执行,由此可见此段代码应该是self-contain的,不需要对全局变量访问。唯一一个可能需要访问到全局变量的地方我觉得可能是早期设置IDT、GDT表处,不过这在汇编中完全可以通过当前EIP加减偏移的方式访问,防止使用绝对地址的情况。

[ 本帖最后由 zx_wing 于 2008-7-16 23:22 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-07-16 23:21 |只看该作者
我现在在2.6.25里找不到实模式那部分代码了,晕,明天换个低版本的再看看

论坛徽章:
0
8 [报告]
发表于 2008-09-09 17:25 |只看该作者

1

也在看这部分呵。

[ 本帖最后由 hb12112 于 2008-9-9 17:26 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-09-09 22:02 |只看该作者
刚好学习这部分!!!

论坛徽章:
0
10 [报告]
发表于 2012-10-12 15:08 |只看该作者
临时页全局目录是在内核编译过程中静态地初始化的,而临时页表是由startup_32()汇编语言函数初始化的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP