无忧启动论坛

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

grub4dos FAT分区创建文件命令(02-09 )

[复制链接]
121#
发表于 2010-2-3 09:16:13 | 只看该作者
C大,移位命令(<<、>>)举例说明一下,比如说0x475内存地址值是0x14000003,想得到0x0003(0x3)。

哦,两次移位搞定
write 0x60000 0
calc *0x60000=*0x475 << 16
calc *0x60000=*0x60000 >> 16

[ 本帖最后由 zhaohj 于 2010-2-3 10:34 编辑 ]
回复

使用道具 举报

122#
 楼主| 发表于 2010-2-3 10:24:40 | 只看该作者
这个就不要用移位了。应该用
*0x475&0xff
回复

使用道具 举报

123#
发表于 2010-2-3 10:38:02 | 只看该作者
原帖由 chenall 于 2010-2-3 10:24 发表
这个就不要用移位了。应该用
*0x475&0xff


呵呵,数学没过关^_^
回复

使用道具 举报

124#
 楼主| 发表于 2010-2-3 17:57:27 | 只看该作者
呵呵,这些都是位操作(二进制的)...

有时候用位操作可以代替乘法和除法/求余等操作.速度快多了...

像计算2的n次方一般都是直接移位

比如
2的9次方 = 512
移位直接一次就可以搞定.如果用数学的要2*2*2*2*2*2*2*2*2
1 << 9

2 << 8(n-1)

另外像KB,MB,GB,TB
1KB = 1 << 10
1MB = 1 << 20
1GB = 1 << 30
1TB = 1 << 40

反之,计算一个数值共几MB就向反方向移位
比如1M的十六进制是0x100000.

0x100000 >> 20
可以得到1MB

[ 本帖最后由 chenall 于 2010-2-3 18:01 编辑 ]
回复

使用道具 举报

125#
发表于 2010-2-4 12:06:50 | 只看该作者
要求那么多,基本上等于写一个类似BASIC的解释器了:)
回复

使用道具 举报

126#
 楼主| 发表于 2010-2-6 00:06:50 | 只看该作者
找到一个严重的BUG.
已经修复重新上传..

http://grub4dos-chenall.googlecode.com/files/fat.zip
回复

使用道具 举报

127#
发表于 2010-2-6 03:37:07 | 只看该作者
这个还不太会用哦,学习一下
回复

使用道具 举报

128#
发表于 2010-2-6 13:52:26 | 只看该作者
又是一个好命令,支持grub...
回复

使用道具 举报

129#
发表于 2010-2-6 15:08:11 | 只看该作者
原帖由 chenall 于 2010-2-6 00:06 发表
找到一个严重的BUG.
已经修复重新上传..

http://grub4dos-chenall.googlecode.com/files/fat.zip
bufxp.gz的映像原来51M,须使用defrag)。
使用fat copy取代getdd后,映像要加大才行。
试过51M、63M不行,加到67M可以本地启动(pxe未试)。
这时倒可省略defrag。

新fat,51M省略defrag(pxe未试)
回复

使用道具 举报

130#
发表于 2010-2-7 11:03:59 | 只看该作者
发生了一件很恐怖的事情
我把飙王2G的u盘格式化 usb-fdd格式(windows下变成2个u盘,一个2.5M的usb-fdd启动u盘,和一个2G的普通盘)
2.5M的作成grub启动盘,进入grub环境后
执行命令

fat file copy ()/grldr ()/test.ldr

显示
buf_size=0x10000, loops=0x4. in_pos=0x0, out_pos+0x0
000000000 过了一会继续显示 00000001 再过一会显示 00000002
Bytes read/writetten = 0x20000 / 0x20000

Error 17: Cannot mount selected partition

好了,这下u盘连dbr都没了,变成未格式化的

重新格式化,再试,结果还是一样

u盘为fat16,簇512

fat用的是最新版本
基本上可以确定u盘没有物理损坏,我尝试在windows下复制了一个2m多的文件进去
然后对比复制前后的文件的md5,结果一致

再次格式化为簇1024,还是一样的结果,看样子貌似 fat还是有bug,而且后果很严重
回复

使用道具 举报

131#
发表于 2010-2-7 11:10:53 | 只看该作者
我的u盘是在win7下格式化的,我查看了他的扇区
按道理如果dos下格式化为fat16的,fat表应该就在1扇区开始了
而我这个win7格式化的,fat1表是从8扇区开始的,其中8,9,10和11的一部分,共三个多扇区有数据
fat2表从28扇区开始
而1-7扇区是空的,看样子应该是预留扇区
然后48-79扇区为根目录
貌似这个格式和dos下格式化的有很多区别
不知道跟这个有没有关系

跟diskgenius的数据对比了一下
总簇数有区别
diskgenius显示5040,而fat info显示5042
但是空闲簇数又是一致的 4225

root_cluster:4294967295
cur_cluster_num:同上
这两个不知道干什么的

[ 本帖最后由 NicTense 于 2010-2-7 11:59 编辑 ]
回复

使用道具 举报

132#
 楼主| 发表于 2010-2-7 11:48:32 | 只看该作者
先看下fat info的信息。还有fat dir是否正常
回复

使用道具 举报

133#
发表于 2010-2-7 12:02:56 | 只看该作者
fat info了一下,显示正常,参数见131楼

(刚才的信息作废,如果没看到就以下面为准)

fat dir 正常

fat file create size=1 ()/test

没有提示信息,正常创建文件

fat file copy ()/t1 ()/t2
正常复制文件

但是复制grldr文件就会崩溃
尝试用(rd)来中转

map ()/grldr (rd)
fat file copy (rd)+1 ()/t2

结果还是崩溃,又得重新格式化了
当map为(rd)时
Bytes read/writetten = 0x30000 / 0x20000

read多了0x10000,写入一样

我尝试连续 fat file create了4个跟grldr一样大的文件,240多k
运行结果都正常

然后我再 fat file copy ()/t4 ()/t5

结果还是跟复制grldr一样,崩溃了, bytes read/written =0x20000 / 0x20000

由于创建文件的时候已经占了之前复制grldr分配到的空间,这意味着前后两次copy分配到的完全不同的空间
那么应该可以进一步排除u盘物理损坏的可能

问题应该出在 copy 命令上,当文件大于 0x20000时就可能触发某种错误

ps: 把文件映射为(rd),为什么整个文件就变成以一个扇区了,而不是512的扇区了

[ 本帖最后由 NicTense 于 2010-2-7 12:30 编辑 ]
回复

使用道具 举报

134#
 楼主| 发表于 2010-2-7 12:41:12 | 只看该作者
有可能是dd的问题,你直接用create创建文件再用dd复制。
回复

使用道具 举报

135#
发表于 2010-2-7 12:49:13 | 只看该作者

回复 #134 chenall 的帖子

你猜对了,就是dd的问题
回复

使用道具 举报

136#
 楼主| 发表于 2010-2-7 13:37:07 | 只看该作者
能不能把格式化后的U盘镜像
fat file create后的U盘镜像。
还有
dd 以后的镜像。

打包传上来看一下。

另外准备抽空改下代码,让copy不再调用dd,而是使用自己的方式去复制应该会比较快。

[ 本帖最后由 chenall 于 2010-2-7 13:42 编辑 ]
回复

使用道具 举报

137#
发表于 2010-2-7 13:44:18 | 只看该作者
好,我弄一下镜像

反复测试了几遍之后,12-3的版本也是有一样的问题

当u盘上只有2个文件,grldr和一个复制grldr为t1的文件,进入grub执行dd显示没问题
但是只是显示结果没问题,实际上分区也是损坏了的

而当我把grub目录一起复制进去时,再执行同样的命令就会显示出错
grub目录下包括fonts.gz wenv fat ghostid 4个文件
而加不加载fonts.gz,中英文版本的grldr无关


格式化后.rar (1.93 KB, 下载次数: 27)
写入grub引导后.rar (1.92 KB, 下载次数: 20)
create以后.rar (127.87 KB, 下载次数: 28)

损坏之后的不知道怎么制作镜像


另外就是,如果fat file copy 写到 内存镜像则没问题
map --mem /test.ima.gz (fd1)
map --hook
fat file copy (fd0)/grldr (fd1)/grldr

运行正常,问题出在写入u盘的时候出错,而当文件很小的时候写入u盘则不会出错

[ 本帖最后由 NicTense 于 2010-2-7 14:29 编辑 ]
回复

使用道具 举报

138#
 楼主| 发表于 2010-2-7 14:29:29 | 只看该作者
直接用IMDISK右键另存为。
还有WINHEX也可以。
回复

使用道具 举报

139#
发表于 2010-2-7 14:42:15 | 只看该作者
损坏.rar (136.25 KB, 下载次数: 22)

好了,我瞄了一眼,好像0磁盘最前面几个字节被改写了,这个错误好像还挺恐怖的,竟然隐藏了这么久没被发现
回复

使用道具 举报

140#
发表于 2010-2-7 16:31:45 | 只看该作者
啥时候能从PD上直接copy呀,那样就方便了
回复

使用道具 举报

141#
 楼主| 发表于 2010-2-7 16:56:36 | 只看该作者
本来就可以啊.copy的源可以是任意GRUB4DOS可以访问文件或块列表.
回复

使用道具 举报

142#
 楼主| 发表于 2010-2-7 17:14:12 | 只看该作者
太概看了一下,好像是写错位置了相当于
dd if=()/grldr of=()

我这里用那个镜像测试还是正常的.

麻烦你再提供一些信息

create以后
blocklist ()/grldr
blocklist ()/t1

blocklist ()/t2
...
看看这些文件的位置是否正常.

如果正常可以再试试
dd if=()/grldr of=()xxx+yyyy
其中xxx+yyy是上面t1或t2的块列表.看看是否还会写错..
回复

使用道具 举报

143#
发表于 2010-2-7 18:36:11 | 只看该作者

回复 #140 blithewind 的帖子

(pd)的问题不在(pd)成功创建后,而且创建前
只要能够成功创建(pd)
使用起来跟(fd0)没啥区别阿
回复

使用道具 举报

144#
发表于 2010-2-7 18:42:12 | 只看该作者
blocklist 三个都正常
但是一dd就出错,还是那样

而且,如果写入镜像的话是没问题的,写入u盘就不行

blocklist明明是对的,但是写入u盘就写到0磁道去了

就是本来应该写到 0x80000之后的,就都写到0磁道去了

也就是 (fd0)400+1开始的字段发生偏移,是不是某个算法有误呢

[ 本帖最后由 NicTense 于 2010-2-7 18:48 编辑 ]
回复

使用道具 举报

145#
 楼主| 发表于 2010-2-7 18:55:57 | 只看该作者
也就是说直接使用
dd if=(fd0)/grldr of=(fd0)400+1
竟然会写入到0扇区上..

如果真是这样的话,看来GRUB4DOS的写磁盘部份有BUG.

我这里没有办法重现这个错误(直接用上面的镜像使用都是正常的)
也许和U盘有关系.

稍后我修改一下FAT让它使用自己的方式来复制(不使用dd),看看是否还是一样.

[ 本帖最后由 chenall 于 2010-2-7 18:57 编辑 ]
回复

使用道具 举报

146#
 楼主| 发表于 2010-2-7 20:11:46 | 只看该作者
试试直接用这个新版的fat copy功能复制文件看看..

这个版本不再调用dd命令,

[ 本帖最后由 chenall 于 2010-2-7 23:20 编辑 ]
回复

使用道具 举报

147#
发表于 2010-2-7 20:24:09 | 只看该作者

回复 #145 chenall 的帖子

这个问题估计无法解决了,不用研究了
我换了个u盘测试就没问题了
所以应该是我那个u盘的某些构造很特殊,grub在写的时候触发了某些错误
这样问题并不在写入的程序段那里,所以是无法解决的



新fat测试结果,还是一样的问题,看样子跟dd也没什么关系了,就是我的这个u盘结构特殊
grub4dos无法在上面正常写入,所以这个本来以为是bug的应该也就不算bug了


新fat复制文件的速度比dd有小幅提高,不太明显
文件名好像什么特殊字符都能用阿

fat file copy ()/ghost.img ()/grub/t1
会在根目录创建一个名为 grub/t1的文件

那这个写错0扇区的问题就搁置了,这个u盘不知道做了什么手脚,估计无解

问回上面那个问题

为什么文件map到 (rd) 后,就变成200多k都在一个扇区里面了

[ 本帖最后由 NicTense 于 2010-2-7 20:37 编辑 ]
回复

使用道具 举报

148#
 楼主| 发表于 2010-2-7 20:45:02 | 只看该作者
呵呵,文件名没有任何限制,
使用者自己小心吧...

Q:为什么文件map到 (rd) 后,就变成200多k都在一个扇区里面了
(rd)+1
在grub4dos里面是一个比较特殊的设备.它代表整个rd的长度(到字节)

你想查看第一个扇区应该这样
cat --hex (rd)+1,511


复制很慢,用这个吧,使用了3M的缓存,应该够用了.


注:这个版本有带调试信息.
debug on可以看到一些调试用的信息..

如果没有什么问题,明天再发一个不带调试信息的版本.

[ 本帖最后由 chenall 于 2010-2-7 23:20 编辑 ]

fat.zip

10.41 KB, 下载次数: 27, 下载积分: 无忧币 -2

回复

使用道具 举报

149#
发表于 2010-2-7 21:04:38 | 只看该作者

回复 #148 chenall 的帖子

最新的fat速度飞快,比原来那个速度提高了几倍
反复测试了几次,没发现问题

但是发现了另外一个奇怪的问题

fat file copy ()/grldr ()/t1
fat file copy ()/ghost.img ()/t2
fat dir
fat info
blocklist ()/t1
blocklist ()/t2
cmp ()/grldr ()/t1
到这里一切正常

cmp ()/ghost.img ()/t2

问题来了
所有中文提示全部变成二维码
这个时候内部命令不受影响,正常使用
但是执行fat的任何命令都会提示

error 28:selected item cannot fit into memory

是不是内存有冲突呢
回复

使用道具 举报

150#
发表于 2010-2-7 21:06:16 | 只看该作者
忘了说
grldr 200多k,cmp他没问题


ghost.img 有2m多

cmp他就出现了上面的问题
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-9-23 08:20

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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