无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8764|回复: 24
打印 上一主题 下一主题

[讨论] 关于 RAM DISk 方式启动 IMG/VHD 的延时加载优化(混合mem map)

[复制链接]
跳转到指定楼层
1#
发表于 2011-9-28 14:00:29 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
我想象中理想的 RAM OS 启动方式应该是, mem 和 img 混合的模式:

1. map --mem --top 一个 IMG,但增加一个参数,--delayRead,即不要立即把所有的文件装载到内存中;但分配好内存空间。

2. 分配好一个专有的标识区域,大小为(mem_drive_sector_size /8 个字节),标识区域清零。
  (1G的内存盘,共0x200000个扇区,即需要0x200000个位来保存读取状态,换成换字节为0x40000,即1G的内存盘,只有256K内存就能报保存这些是否读取的标志了)

3. 增加一个内存磁盘读取的 hook,在读取内存磁盘的时候,如果在专有的标识区域中发现某个sector没有装载过,则先从 img 中读取相应的数据。
(这里只hook mem drive read,write不hook,完全按照传统的memdrive即可)

4. boot 的时候从memdrive启动,基于2+3的功能,IMG文件不会全部装载,而是按需读取并缓存到了RAM DISK中。这时候需要读取的文件实际上是一部分的,不会读取整个 IMG 的所有内容,所以相对于完整装载img会快很多。

chenlall 和 不点 能否八一八这个方案有没有可行性?或者有没有现成的能达到目的的、类似的方案(RAM OS+按需装载)?

[ 本帖最后由 Yonsm 于 2011-9-29 20:42 编辑 ]
2#
 楼主| 发表于 2011-9-28 14:00:44 | 显示全部楼层
提前到一楼了啊哈a

[ 本帖最后由 Yonsm 于 2011-9-29 20:42 编辑 ]
回复

使用道具 举报

3#
 楼主| 发表于 2011-9-28 14:25:01 | 显示全部楼层
原帖由 chenall 于 2011-9-28 14:21 发表
首先关于FIND命令
这是正常的,第一个是当前的分区.

2.从(hd0)+1的内容可以看得出来,你的RAM.IMG只是一个分区镜像.因为没有分区表,所以映射到(hd0)之后你无法使用(hd0,0)来访问里面的文件,但是可以使用ls (h ...


明白了,多谢从密密麻麻的文字丛中回答问题:)

VDM似乎不能创建带分区表的映像文件,郁闷的这个。VHD似乎就带有分区表,我试试看VHD如何。

我再问一下二楼中文过的问题,直接从 IMG、VHD读取,是不是所有修改都被保存啦?(因为此时完全没有用到内存盘)。
回复

使用道具 举报

4#
 楼主| 发表于 2011-9-28 20:55:19 | 显示全部楼层
原帖由 <i>不点</i> 于 2011-9-28 19:06 发表 <a href="http://bbs.wuyou.net/redirect.php?goto=findpost&pid=2311502&ptid=200597" target="_blank"><img src="http://bbs.wuyou.net/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />
逻辑过于复杂,实现起来并不简单。<br />
<br />
keep is simple stupid。
<br />

但是获益非常大。这才是最完美的RAMOS方案——虽然我理解G4D并非专门为RAMOS而作。
回复

使用道具 举报

5#
 楼主| 发表于 2011-9-28 21:20:28 | 显示全部楼层
如果确认方案可行,希望能考虑这个功能,或者指点一二,我去看看。
回复

使用道具 举报

6#
 楼主| 发表于 2011-9-29 10:25:09 | 显示全部楼层
原帖由 thttht 于 2011-9-29 09:22 发表


这个方案很诱人啊!不过既然是在内存中预留镜像的全部空间,但并不完全载入这样启动时加载镜像的时间会很快!这对象Win7这样的大系统会很明显,但这样也同样带来一定的问题,就是第一:系统启动后这个镜像文 ...



我说的方法是“按需加载”,你说的方法是“延时加载“,其实不需要驱动支持的,很简单:

-delayLoad后面加一个参数=xxxx,表示xxxx秒钟过后,自动读取所有没有读取过的sector。

(但不知道GRUB在系统启动后是不是还有代码活着?定时器可否实现)。

功能可以这样设计,但我觉得我作为G4D用户,不会这样用,因为用不到的东西实在没有必要Preload到内存,用到的时候再加载不是更好(虽然第一次用到相对会慢一些)。


纸上谈兵了,呵呵……
回复

使用道具 举报

7#
 楼主| 发表于 2011-9-29 20:34:28 | 显示全部楼层
原帖由 <i>pseudo</i> 于 2011-9-29 10:34 发表 <a href="http://bbs.wuyou.net/redirect.php?goto=findpost&pid=2311827&ptid=200597" target="_blank"><img src="http://bbs.wuyou.net/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />
第3点,“write不hook,完全按照传统的memdrive即可”<br />
write是向内存写还是向img写?<br />
如果是向内存写,那么写后好像也要修改标志为已读,以便下次读出的是新写的内容,避免丢失修改。<br />
这意味着write也得hook了。
<br />

嗯,这个说的是。
回复

使用道具 举报

8#
 楼主| 发表于 2011-9-29 20:40:41 | 显示全部楼层
原帖由 <i>不点</i> 于 2011-9-29 13:50 发表 <a href="http://bbs.wuyou.net/redirect.php?goto=findpost&pid=2311917&ptid=200597" target="_blank"><img src="http://bbs.wuyou.net/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />
Yonsm 的想法,太过于超前了。具体实现时,你就知道难度有多大了。<br />
<br />
举个例子就可以说明问题。很多人希望 grub4dos 的仿真支持 “不连续” 的映像。我拒绝这么做。理由也向大家说清楚了。<br />
<br />
后来,karyonix  ...
<br />


我只是理一下想法,具体的难度好像就在hook。

我想问一下现有的 map hook是有g4d代码模拟实现的?还是说只是修改了某个数据(比如某个什么系统的表什么的),由bios自动实现map的?
如果是前者,则我说的方案并没有太多可见的难度,只是普通的工程量吧?如果是后者,那和现有的map完全不是一个实现方案了。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-22 11:18

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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