QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 754|回复: 5

hedian同志请进,其他同志也请批评

[复制链接]
发表于 2005-2-21 22:20:25 | 显示全部楼层 |阅读模式
今天终于有空在家里的机器装上linux,换成内核2.6.10,稍微看了下源码,得出个很遗憾的结论,如果想让进程使用4MB的页,不改内核是不行的。

启动程序时是按照以下顺序执行的
arch/i386/kernel/process.c:sys_execve()
该函数是系统调用execve的入口
它调用fs/exec:do_exec函数

do_exec函数遍历一个struct linux_binfmt结构的单链,依次调用一个
loader函数指针,这个结构定义在include/linux/binfmts.h

对于elf文件,它实际上调用的是fs/binfmt_elf.c:load_elf_binary()函数。

这个函数就是真正的装载函数了,它分析elf文件的信息,把相应的elf段映射
入内存,除了bss段外,其他段都留待系统的缺页调用来装载。

你曾经提到你已经让堆栈段使用4MB页,这没错,因为应用程序是可以自由
更改自己的esp ebp寄存器的,但是,注意,由于真正的物理页的分配是在
发生缺页调用时由内核进行的,所以,除了内核,你是没有办法为数据段分配
内存的。

最后再提一下,elf文件是一种具体CPU不相关的格式,所以它里面的代码段,
数据段这些东西和i386的段式内存管理,也就是CS,DS那些段寄存器是没有
任何关系的,想象一下各种其它类型的CPU是不使用段式内存管理的事实你
就明白了。
发表于 2005-2-22 11:40:57 | 显示全部楼层
我还在调查。因为这些功能都在solaris下实现,由于商业的限制。不能参考源代码(郁闷中...)
我开始想通过shmat(shmid, data_address, flag)将4M页贴到data段。但是一直不能成功。(data_address是通过解析ELF文件得到的。)
我又想,是否能够将进程的指向数据段的指针寄存器通通指到4M页。当然,data段的所有数据都copy到了4M页。目前正在对此调查。(还没有取得进展)

对于缺页:
首先,我想如果使用Huge TLB的4M页,缺页可能性应该很低(对于4k/page)。
其次,如果发生缺页,是否可以捕获缺页中断,系统调用我的缺页处理程序。
回复

使用道具 举报

发表于 2005-2-22 12:25:16 | 显示全部楼层
总之看不懂
回复

使用道具 举报

发表于 2005-2-23 09:28:09 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2005-2-23 14:26:33 | 显示全部楼层
你的要求,我今天突然想出了一个方案,说实话,很麻烦,可不可行也不知道,仅供参考。

你首先要写一个装载程序,它要完成下面的功能。
  1。完整的elf文件分析,包括动态库的。
   2。根据elf文件,用mmap调用把相应的域映射入内存。为什么不能用shmget调用,因为shmget调用无法创建有执行权限的页。

在你那个需要使用大页的程序里,你要实现自己的mallloc和free函数,因为libc里的这几个函数可能会向内核要求页。
回复

使用道具 举报

发表于 2005-2-23 16:54:37 | 显示全部楼层
目前已经实现了自己的malloc和free (也是使用lLarge Page)
我的解决方案:
1 在kernel创建一个模块lpg.ko
2 liblpg.so和lpg.ko通信,传递pid和data域的large page address到lpg.ko
3 lpg.ko通过pid获取task_struct
4 lpg.ko修改task_struct的数据成员来实现large page 化

目前还在讨论和调查中......
欢迎大家多多指点。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-6 16:54 , Processed in 0.038614 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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