无忧启动论坛

标题: grub4dos FAT分区创建文件命令(02-09 ) [打印本页]

作者: chenall    时间: 2010-1-13 13:06
标题: grub4dos FAT分区创建文件命令(02-09 )
最新版本下载地址
http://grub4dos-chenall.googlecode.com/files/fat.zip

查看最新版本信息请移步我的搏客..
http://www.chenall.com/blog/2010/01/GRUB4DOS_FAT.html

使用方法都在截图中了,,,

BUG是在所难免的...

目前只支持操作根目录。只能用在FAT16分区上。

需要先将FAT16分区设为root才可以使用。

创建文件最大不能超过19MB,使用连续簇存放文件,如果可用的连续簇的空间小于文件大小,不能创建。

!请使用虚拟机测试(并设置硬盘还原),否则写错了我可不管,^_^...

唉,原理基本上明白了,但是要把原理转换成程序,我还有好长一段路要走。。
注:新的版本必须要有路径名(截图的的旧版的)至少也得加()/代表当前磁盘
例子:
fat file create size=* ()/bootmgr

2010-02-09
1.不再使用dd命令来复制文件,加快复制文件的速度.

2010-02-06
1.修正了一个写文件分配表的BUG.

2010-01-30
1.修正FAT dir命令显示的问题。
2.添加了一些帮助信息。fat 或 fat help都可以显示帮助信息。
3.优化的创建文件分配表的代码。

2010-01-29
1.支持FAT32。

2010-01-13
修正一个可用簇数计算方法的错误,导致写FAT表错误。

2010-01-12
预览版。

[ 本帖最后由 chenall 于 2010-2-8 11:49 编辑 ]

20100112222742034.png (5.93 KB, 下载次数: 212)

20100112222742034.png

20100112222911354.png (10.66 KB, 下载次数: 194)

20100112222911354.png

20100112223549655.png (13.03 KB, 下载次数: 214)

20100112223549655.png

20100112223609392.png (7.4 KB, 下载次数: 215)

20100112223609392.png

作者: 天涯海角1216    时间: 2010-1-13 15:10
支持大师,好作品一个接着一个。
可惜没个FAT16的分区整。
作者: junyee    时间: 2010-1-14 23:51
难道GRUB4DOS 的COPY离我不远了???
作者: NicTense    时间: 2010-1-15 03:26
c大,0106的版本已经支持ghostid,为什么0108的版本又有个外置的ghostid,这两个有什么区别呢

还有一个疑问,chinese目录下的几个文件有什么区别,貌似也并不能直接支持中文显示

[ 本帖最后由 NicTense 于 2010-1-15 03:52 编辑 ]
作者: chenall    时间: 2010-1-15 09:55
0108以后的GRUB4DOS版本没有内置GHOSTID命令,使用了外置的。

chinese目录下的是支持中文的啊。需要加载字体文件才能显示中文。

@junyee
现在就可以尝试了。暂时使用以下方法实现复制。

fat file create size=要复制文件的大小 test.bin
dd if=(hdx,y)/test.bin of=()/test.bin

要复制文件的大小可以通用cat命令得到
cat --length=0 (hdx,y)/test.bin
作者: NicTense    时间: 2010-1-15 16:07
一直都没加载字体,惭愧啊,怪不得中文乱码了

肥16这种格式貌似只能用在dos底下了,我都很久没用过这种格式的分区了
作者: chenall    时间: 2010-1-15 17:34
一般情况下32MB左右的磁盘格式化自动是使用FAT16格式的。像CSPE里面的CSPE.img和EXT.IMG都是FAT16的。

再小的分区就大都是FAT12的了。

一般的软盘镜像大多是FAT12格式的。

搞这个命令我主是要用于内存盘启动时动态添加文件,以方便实现模块化。

[ 本帖最后由 chenall 于 2010-1-15 17:36 编辑 ]
作者: junyee    时间: 2010-1-15 18:16
原帖由 chenall 于 2010-1-15 09:55 发表


@junyee
现在就可以尝试了。暂时使用以下方法实现复制。
fat file create size=要复制文件的大小 test.bin
dd if=(hdx,y)/test.bin of=()/test.bin
要复制文件的大小可以通用cat命令得到
cat --length=0 (hdx,y)/test.bin

我看得不是很明白,这是COPY还是Creat???
源文件(hdx,y)/test.bin ---》目标文件()/test.bin ???


再者,请问Chenall大哥,以后会不会考虑加入FAT32/NTFS/CDFS/PD 等格式的支持?这样的话此功能才有一定实际意义,毕竟FAT16在硬盘上用得都比较少了。

如果这方面能成功的话,这个G4D就不单止是个引导程序了,更像个OS!!!

[ 本帖最后由 junyee 于 2010-1-15 18:18 编辑 ]
作者: fujianabc    时间: 2010-1-15 20:44
原帖由 chenall 于 2010-1-15 17:34 发表
一般情况下32MB左右的磁盘格式化自动是使用FAT16格式的。像CSPE里面的CSPE.img和EXT.IMG都是FAT16的。

再小的分区就大都是FAT12的了。

一般的软盘镜像大多是FAT12格式的。

搞这个命令我主是要用于内存 ...

请问你现在这个命令支部支持FAT12阿?
现在大家都没FAT16了,还不如先搞FAT12有意义,至少可以在软盘镜像上测试。
作者: zhhsh    时间: 2010-1-16 10:02
支持一下,不错!!!
作者: 不点    时间: 2010-1-16 10:07
不带参数的configfile 放在所有的 title 之前,表示兼容以前的启动方式,即,优先执行与 grldr 处于相同目录的 menu.lst 文件。

如果去掉这个 “不带参数的configfile”,则优先执行的是内置菜单。

[ 本帖最后由 不点 于 2010-1-16 10:08 编辑 ]
作者: chenall    时间: 2010-1-19 22:38
更新了一下,支持FAT12了。
内容。

http://bbs.znpc.net/viewthread.p ... fromuid=29#pid43728

有条件或需要的就测试下,没有BUG的话今年内就不会再更新了。
作者: NicTense    时间: 2010-1-21 00:01
@ 不点

貌似这个不带参数的configfile并没有真正起到您说的作用(也就是readme里所说的)

我分别测试了620,1203和最新的0113版本

grldr的内置菜单如下


pxe detect
configfile
default 0
timeout 30


title Command line
commandline

title Ghost 11.02
map /ghost.img (fd0)||map --mem /ghost.img (fd0)
map --hook
rootnoverify (fd0)
chainloader +1

title Tango WinPE SP3
chainloader /ntldr

title Boot from local HDD
chainloader (hd1)+1
rootnoverify (hd1)

title Boot from CDROM
cdrom --init
map --hook
chainloader (cd0)

title Reboot
reboot

title Shutdown
halt


grldr放于u盘根目录,根目录下放了一个menu.lst
内容只有一行
commandline

按道理,如果configfile起作用,优先执行同目录下的menu.lst
那么启动后应该是直接进入命令行模式

但是实际进入的却是上面的菜单选择

把内置菜单换成默认的,也就是把原版的grldr放到u盘根目录
u盘启动后为(fd0)
而由于我的(hd0,0)的根目录有一个用于载入pe的menu.lst
grub启动后直接进入pe
也就是说,起作用的还是内置菜单,

这个是原版内置的第一项
title find /menu.lst, /boot/grub/menu.lst, /grub/menu.lst
errorcheck off
configfile /menu.lst
configfile /boot/grub/menu.lst
configfile /grub/menu.lst
find --set-root --ignore-floppies --ignore-cd /menu.lst && configfile /menu.lst
find --set-root --ignore-floppies --ignore-cd /boot/grub/menu.lst && configfile /boot/grub/menu.lst
find --set-root --ignore-floppies --ignore-cd /grub/menu.lst && configfile /grub/menu.lst
errorcheck on
commandline


这里还有一个问题不明白
按这里的顺序
应该是先执行的 configfile /menu.lst
那么应该是执行u盘根目录的 (fd0)/menu.lst,即进入命令行才对
为什么实际执行的却是 (hd0,0)/menul.lst
也就是说起作用的是 find --set-root --ignore-floppies --ignore-cd /menu.lst && configfile /menu.lst

是configfile代码有误,还是我没理解对呢

[ 本帖最后由 NicTense 于 2010-1-22 02:32 编辑 ]
作者: chenall    时间: 2010-1-21 00:21
可以试试把硬盘的GRLDR改名或删除再重启.

有可能是启动到了硬盘上的GRLDR了.

另外菜单应该至少要有一个title的吧.

把上面u盘的那个menu.lst的内容换成如下
default 0
timeout 5
title command
commandline
作者: NicTense    时间: 2010-1-21 00:24
标题: 回复 #15 chenall 的帖子
我确定不是启动到硬盘上的grldr,因为版本不一样

好了,按您说的修改了menu.lst,把硬盘的grldr改名

重起

还是进入我的内置菜单选项

[ 本帖最后由 NicTense 于 2010-1-21 00:30 编辑 ]
作者: chenall    时间: 2010-1-21 00:42
我用虚拟机下测试从软盘启动或硬盘启动都是正常的.
把GRLDR的内置菜单改成了#14上面的菜单.

还有一点忘了,和U盘启动加载GRLDR应该也有关系.比如
用FBINST加载的可能就不会优先使用根目录下的menu.lst,其它的工具应该也是类似的吧.

你可以试试进入GRUB4DOS命令行以后再
chainloader (fd0)/grldr
试试看会不会先加载同根目录下的menu.lst

[ 本帖最后由 chenall 于 2010-1-21 00:50 编辑 ]
作者: NicTense    时间: 2010-1-21 01:05
标题: 回复 #17 chenall 的帖子
还是一样执行内置菜单,无视u盘根目录menu.lst

我用的bootice,启动时,电脑无视u盘mbr,直接从pbr启动

下次换个u盘测试一下再来报告


另外就是,14楼最后一个问题

先执行的 configfile /menu.lst
那么应该是执行u盘根目录的 (fd0)/menu.lst,即进入命令行才对
为什么实际执行的却是 (hd0,0)/menul.lst
也就是说起作用的是 find --set-root --ignore-floppies --ignore-cd /menu.lst && configfile /menu.lst

c大能否帮我解释一下这个,不太理解

configfile执行了menu.lst之后是跳转了,不再继续执行,还是执行完还会回来继续执行下面的命令呢

[ 本帖最后由 NicTense 于 2010-1-21 01:10 编辑 ]
作者: NicTense    时间: 2010-1-21 01:26
测试了另外一个u盘,usb-hdd格式,同样的grub和menu.lst
启动后进入命令行
也就是说,configfile起作用了
这个也是用bootice做的,不同的是这个grub装在mbr
用u盘启动,电脑是从u盘的mbr的grub启动的

而之前那个u盘,电脑无视这个u盘的mbr,而直接从pbr启动(即这个u盘的mbr好坏或者用什么格式都没影响)

所以,我估计可能configfile不起作用跟什么工具制作的无关

而跟装在mbr还是pbr可能有关系
作者: 不点    时间: 2010-1-21 01:28
问题很可能是 BOOTICE 造成的。启动 GRLDR 时,必须把 DH 寄存器设置成 GRLDR 所在的分区号码。如果不设置,那就相当于没有正确地设置 root 设备,那么当然就不正常了。

用 GRUB4DOS 的引导扇区搜索到 GRLDR 后,DH 就正确地设置了。你应该试试 GRUB4DOS 的引导扇区。
作者: NicTense    时间: 2010-1-21 01:52
基本上我知道问题所在了

貌似是我这个电脑在启动的时候把 (bd) 定位为 (fd0,0)了

所以在启动后马上执行

ls/

提示:Error 17: Cannot mount selected partition

执行

root

提示:(fd0): Filesystem type unknown, partition type 0x47

而在执行 root (fd0) 后再 ls / 就正常了

也就是说,启动后 (bd) 对grub是无法读取的,所以根目录下的menu.lst自然被忽略
作者: NicTense    时间: 2010-1-21 01:57
标题: 回复 #20 不点 的帖子
如果进入grub后

chainloader (fd0)/grldr.mbr
或者
chainloader (fd0)+1

结果都一样,问题应该是出在 (fd0,0) 的问题上,但是grub启动后,u盘又被定位为 (fd0)

不知道是跟我的u盘有关还是跟我主板的bios有关,由于几个电脑,有的只支持usb-hdd,有的只支持usb-zip

我也没法确定这个问题了

不过看样子可以确定问题不在configfile命令上了
作者: NicTense    时间: 2010-1-21 02:51
把那个出问题的u盘格式化为usb-fdd格式
(bd)为(fd0),启动后执行root和 ls/ 均正常
而且启动后也能进入命令行模式,即根目录menu.lst生效

看来问题就出在usb-zip上了
由于usb-zip有分区表,存在mbr和pbr,启动后(bd)会被定位为 (fd0,0),而grub又不支持(fd0,0),从而导致(bd)出错,自然无法读取(bd)上的menu.lst文件
只是不知道这个是所有被认定为usb-zip格式的u盘的问题,还是只是我的u盘或者我的电脑的bios的问题
作者: pseudo    时间: 2010-1-21 14:09
标题: 回复 #23 NicTense 的帖子
在usb-zip上使用内置菜单的grldr,例如放个0PE试试?
作者: recosong    时间: 2010-1-21 19:41
关注中 学习了 ~~~
作者: chenall    时间: 2010-1-21 21:29
再改了一下.把几个命令整在一起,现在可以直接fat file copy了(必须配合最新版GRUB4DOS才可以使用用)

例子:
fat file copy (hd0,0)/grldr (hd1,0)/grldr

http://grub4dos-chenall.googlecode.com/files/fat.rar
http://grub4dos-chenall.googleco ... 4.5a-2010-01-21.zip

来源 可以是任何GRUB4DOS可以访问的文件,
目标 只能是FAT16/FAT12并且只可以使用根目录.

只是简单的把dd命令整合进去了.

[ 本帖最后由 chenall 于 2010-1-21 21:31 编辑 ]
作者: 想傲江湖    时间: 2010-1-21 22:40
grub4dos想发展成为一个OS ?
作者: pseudo    时间: 2010-1-21 23:55
标题: 回复 #26 chenall 的帖子
来源是gzip压缩文件时,目标文件内容跟来源文件相同吗?
作者: chenall    时间: 2010-1-22 00:19
没考虑这一点,你可以试一下.

因为是调用DD的功能.

刚试了,如果是GZ格式就不能复制了,呵呵.

我下次再改一下,如果是GZ格式按原文件复制.

[ 本帖最后由 chenall 于 2010-1-22 00:26 编辑 ]
作者: NicTense    时间: 2010-1-22 02:55
考虑到某些usb-zip启动后 (bd)和根区出错的问题,即(fd0,0)的问题
如果我在内置菜单的
configfile
这行前面加上一行

checkrange 0 read 0x8280 && root (fd0)

是不是应该可以解决问题了
作者: chenall    时间: 2010-1-22 10:27
这个要看(fd0)被识别成什么了,有时会是(fd0,0)
作者: pseudo    时间: 2010-1-22 12:39
原帖由 chenall 于 2010-1-22 00:19 发表
没考虑这一点,你可以试一下.
因为是调用DD的功能.
刚试了,如果是GZ格式就不能复制了,呵呵.
我下次再改一下,如果是GZ格式按原文件复制.

只是想想而已,还没动手试——跟不上发展。

对GZ格式,dd默认是自动解压的,那么体积计算就不同于来源文件了。
得先解压后再看体积,或者深入解剖来源文件,从中取到解压后的体积。
我想grub4dos总要为目标文件申请空间,也许已经有现成的代码可以计算出解压后的体积。

gz格式按原文件复制似有不妥。最好跟dd、map、configfile等命令一致,按相同的规则处理是否自动解压问题。
作者: 不点    时间: 2010-1-22 13:03
gz 文件最末尾的四个字节表示压缩前的文件实际长度。

是的,默认时,应该自动解压。

默认时,打开一个 gz 文件,得到的 filemax 就是解压后的文件长度。当 grub_read 扇区的时候,也是读出了解压后的扇区。
作者: chenall    时间: 2010-1-22 14:18
copy应该是要按原样复制。

需要解压的可以通过rd设备中转。
先map 到(rd)
然后再把rd的内容复制到文件中。
作者: chenall    时间: 2010-1-22 14:21
标题: 回复 #32 NicTense 的帖子
grub4dos可以访问带mbr的(fd0)
就是(fd0,x)的格式。

但好像启动时的启动设备号有问题所以不能自动设置好root .

不管用什么方式,能解决就OK。
作者: cs035090    时间: 2010-1-23 21:57
不错。。。看起开很好用。。
作者: chenall    时间: 2010-1-24 01:18
没有人测试?
最新版GRUB4DOS下载
http://grub4dos-chenall.googleco ... 4.5a-2010-01-23.zip
外部命令
http://grub4dos-chenall.googlecode.com/files/grub4dos_cmd.zip
作者: chenall    时间: 2010-1-26 12:58
创建文件,没那么简单。
还是需要像FAT这样子。

目前的FAT就是可以创建指定大小的文件啊。

command集,
一是作为例子。
二是可以让以后的minigrub调用。

[ 本帖最后由 chenall 于 2010-1-26 13:00 编辑 ]
作者: pseudo    时间: 2010-1-26 14:52
标题: 回复 #39 chenall 的帖子
需求:
创建一个指定大小的内存仿真盘,按指定大小分区、格式化,然后复制文件于其上。
作者: NicTense    时间: 2010-1-26 15:10
标题: 回复 #39 chenall 的帖子
@chenall

我发完贴又重新看了一下新版的grub,才发现fat不单可以copy,还能create,之前没仔细看
然后明白,暂时还是无法突破fat12和fat16的瓶颈,所以删掉了帖子
没想到c大动作太快了已经看到了

@pseudo
目前应该是连格式化命令都没有吧
我觉得这个需求应该是分成几步的吧
那样只要一个,创建指定大小的内存仿真盘命令和一个格式化命令就可以了
其他应该是现成有的了

[ 本帖最后由 NicTense 于 2010-1-29 20:25 编辑 ]
作者: chenall    时间: 2010-1-26 15:16
原帖由 pseudo 于 2010-1-26 14:52 发表
需求:
创建一个指定大小的内存仿真盘,按指定大小分区、格式化,然后复制文件于其上。


创建内存仿真盘,应该也很好处理。。

格式化: 应该比创建文件还简单。格式化只需要处理一下文件分配表和根目录表基本上就搞定了(扇区清0)。

改天有空再试试吧。在FAT的基本上增加。因为已经有了地基再建房子比较简单。

我还没有抽空处理FAT32,不过启动时比较少用,先不搞了。

目前也是只支持根目录(对付启动盘够用了)。还不想支持子目录(代价比较大,不值得)。

[ 本帖最后由 chenall 于 2010-1-26 15:20 编辑 ]
作者: chenall    时间: 2010-1-29 09:18
参考了GRUB的FAT代码,重写大部份的代码。

新增支持在FAT32.

copy命令未加上。

先放上来测试下。

[ 本帖最后由 chenall 于 2010-1-30 11:31 编辑 ]
作者: zhaohj    时间: 2010-1-29 14:06
还有问题,我改名为fat16,fat16 dir缺文件(8.3格式的),目录也没显示

Snap1.jpg (38.9 KB, 下载次数: 201)

Snap1.jpg

作者: chenall    时间: 2010-1-29 19:41
加入了copy

我这里测试还是没有问题。

你可以再试试fat info看看一些详细的信息(用新版的)
debug on
看一下。

否者把你的镜像文件传给我试一下。

[ 本帖最后由 chenall 于 2010-1-30 11:31 编辑 ]
作者: NicTense    时间: 2010-1-29 20:30
不好意思啊,请教2个跟fat无关的问题
1、read每次都会读出4个字节,有没有办法只读一个字节,或者2个字节

2、grub怎么实现类似于批处理的for那样的循环功能呢
比如,我需要将(hd0)映射为最后一个硬盘,而将第2,3...个硬盘一次后移,但是硬盘个数不知
我的做法是


uuid (hd1,0)
checkrange 21 errnum || map (hd0) (hd-1)
uuid (hd1,0)
checkrange 21 errnum || map (hd1) (hd0)
uuid (hd2,0)
checkrange 21 errnum || map (hd2) (hd1)
uuid (hd3,0)
checkrange 21 errnum || map (hd3) (hd2)
uuid (hd4,0)
checkrange 21 errnum || map (hd4) (hd3)
map --hook


有没有更方便的方法呢,而且这样由于无法确定硬盘个数,如果硬盘数多于4还是会错误映射的
作者: chenall    时间: 2010-1-29 21:22
Q:read每次都会读出4个字节,有没有办法只读一个字节,或者2个字节
方法1.直接修改源码,让它可以读取指定字节数。
方法2.通过dd命令把这一个字节复制到其它地方,然后再读取
比如

dd if=(md) of=(md) bs=1 count=1 skip=0x829c seek=0x60000
把0x829c的一个字节移动0x60000
然后再
read 0x60000就可以了,当然了首先可能得清空0x60000上已有的数值
write 0x60000 0

2、grub怎么实现类似于批处理的for那样的循环功能呢
没有for的功能。目前无解,
当然了你可以想办法通过外部程序来实现这一功能倒是比较简单的。
你有条件可以试一下。
作者: chenall    时间: 2010-1-30 11:33
优化了写入文件分配表的代码。
创建大文件时,速度应该会比以前的版本快很多。

fat.rar

4 KB, 下载次数: 43, 下载积分: 无忧币 -2


作者: NicTense    时间: 2010-1-30 12:04
本来想测试一下fat,把slic表给导出来,结果进去之后傻掉了
外部命令不能用help
fat --help 也不行

又回来看了1楼

fat dir
fat info
fat file create
fat file copy

目前就这4个用法,对吧

建议增加一个 fat help 或者 fat --help
我基本不用linux,不知道习惯的用法是哪个
反正就是增加一个显示参数的功能,这样比较方便

[ 本帖最后由 NicTense 于 2010-1-30 12:09 编辑 ]
作者: NicTense    时间: 2010-1-30 12:46
还是不行啊,fat32支持看来还是有问题
fat32,usb-hdd格式的sd卡启动进入grub
根目录放了7个文件,2个目录
fat dir 显示出其中4个文件,1个目录,其他不见了,多了一个4G大的AT a n g  o文件
fat file create 一蹋糊涂
fat file create size=0x176 slic.bin 提示错误1
fat file create size=0x176 /slic.bin 提示错误11
fat file create size=0x176 (hd0,0)/slic.bin 执行了一半,然后错误24

file file copy跟create一样

另外有个问题请教一下
fat和 command fat 是完全一样的吧
作者: chenall    时间: 2010-1-30 12:50
fat和command fat都是一样的。
是一样的,嗯,下次再加一个帮助信息。。

可以开启一下debug
debug on
然后再看一下fat info显示的信息是否正确。

前面的错误,可能是因为有长文件名的关系。我再试试看。

[ 本帖最后由 chenall 于 2010-1-30 13:25 编辑 ]
作者: zhaohj    时间: 2010-1-30 13:26
C大,随便那个镜像都可以的,比如CSPE.GZ
刚map好时fat dir比较正常,如果往镜像里fat file copy文件后,fat dir文件和目录就不正确了,往往少很多。
作者: NicTense    时间: 2010-1-30 13:28
fat info可以正常运行
参数跟disgenius基本一致
有一点不明白
geometry 出来的扇区总数是 498138
而 fat info和disgenius出来的是 498075

另外,这个0123版本的grub好像有点小问题
我在命令行里,按左右箭头键的时候,有时候正常,有时候就会出来4和6
就是连续按几次,有时候是左右移,有时候是4和6
不知道为什么会不断地numlock on/off切换
但是之前的版本没有这个问题

[ 本帖最后由 NicTense 于 2010-1-31 03:33 编辑 ]
作者: chenall    时间: 2010-1-30 14:23
修正fat dir显示的问题。

fat.rar

4.27 KB, 下载次数: 64, 下载积分: 无忧币 -2


作者: chenall    时间: 2010-1-30 14:25
@NicTense
geometry有包括MBR。

fat info显示的只有本分区的大小。

出来4,6?用虚拟机还是实机测试。应该不会吧。虚拟机特别是QEMU就经常会这样。

另外有时是键盘的问题,可以换台机器,再试,如果还是一样,那可能就是GRUB的问题了。

[ 本帖最后由 chenall 于 2010-1-30 14:30 编辑 ]
作者: NicTense    时间: 2010-1-30 14:30
把之前的fat32的sd卡格式化为fat16的
fat dir 依然出错,4g文件依然存在,还多了个sd256的文件,0字节,(sd256实际上是卷标)
fat creat 的文件,直接用文件名依然错误1,加/错误11,加(hd0,0)则创建成功

54楼的版本我再测试一下
作者: NicTense    时间: 2010-1-30 14:32
实机,因为我要读slic信息,只能用实机
acer 4810tg 笔记本,用256m的sd卡启动进入grub
呆会换台机子测试一下
我先看看新版本解决了问题没有
作者: chenall    时间: 2010-1-30 14:33
忘了说下,新的版本必须要加路径至少也要 ()/
和dd要求一样,因为是要调用dd的。所以就和dd命令要求一样了。
作者: NicTense    时间: 2010-1-30 14:45
标题: 回复 #58 chenall 的帖子
怪不得,我说例子都是直接写文件名,怎么我这里一定得写完整路径才行

#54楼的新版本 fat16下测试正常,我再把卡格式化成fat32测试一下,看样子可能跟fat32无关,之前fat16一样出问题

呆会再来报告
作者: zhaohj    时间: 2010-1-30 14:45
新版本fat dir在FAT12/16下正常了。我再测试一下FAT32情况
作者: chenall    时间: 2010-1-30 14:48
最好能测试一下创建、复制的功能,看看是否正常。。

因为我自己的测试条件有限,不能完全考虑到位。

另外为了提高复制的速度,最好使用(rd)做为临时中转盘,否则可能会很慢(和DD一样)
例子:
使用以下方式可能会比直接fat file copy (hd0,0)/bootmgr (hd1,0)/bootmgr快好倍(PXE上使用更是明显).

map --mem (hd0,0)/bootmgr (rd)
fat file copy (rd)+1 (hd1,0)/bootmgr

[ 本帖最后由 chenall 于 2010-1-30 14:49 编辑 ]
作者: zhaohj    时间: 2010-1-30 15:03
fat32上测试,fat dir/fat file copy正常,下面的_SRS.ZIP是刚复制进去的。

[ 本帖最后由 zhaohj 于 2010-1-30 15:05 编辑 ]

Snap2.jpg (53.97 KB, 下载次数: 175)

Snap2.jpg

作者: NicTense    时间: 2010-1-30 15:13
fat32, fat dir正常
fat file copy和fat file create出错

fat file create size=374 (hd0,0)/t2.bin

....前面忽略
cur_cluster:268435455,268443645
Error:Write Dir_table

Error 24: Attempt to access block outside partition

还是越界了
sd卡的格式是 fat32 簇大小512

fat16下测试结果所有功能正常

[ 本帖最后由 NicTense 于 2010-1-31 04:00 编辑 ]
作者: NicTense    时间: 2010-1-30 15:26
把sd盘格式化为 fat32 簇大小2048
则所有功能正常

簇为512时就不行了

[ 本帖最后由 NicTense 于 2010-1-31 04:00 编辑 ]
作者: chenall    时间: 2010-1-30 15:29
原帖由 NicTense 于 2010-1-30 15:13 发表
fat32, fat dir正常
fat file copy和fat file create出错

fat file create size=374 (hd0,0)/t2.bin

....前面忽略
cur_cluster:268435455,268443645
Error:Write Dir_table

Error 24: Attempt to a ...



重新传了一个,再试下。

你里面已经有文件了是吗?
好像刚好你根目录里面的文件把根目录的一个簇占满了,自动扩展根目录簇时出错。

fat.rar

4.27 KB, 下载次数: 37, 下载积分: 无忧币 -2


作者: zhaohj    时间: 2010-1-30 15:43
FAT32分区硬盘测试也正常,呵呵圆满了。
该关注NTFS了。
作者: chenall    时间: 2010-1-30 15:55
原帖由 zhaohj 于 2010-1-30 15:43 发表
FAT32分区硬盘测试也正常,呵呵圆满了。
该关注NTFS了。


不想搞NTFS,太复杂了。

FAT的我还没有完全搞懂呢,以后再说。

目前根目录FAT12/16如果根目录满了,因为FAT12/16的根目录大小是固定的所以,就不能创建文件了。

FAT32会自动扩展。
作者: NicTense    时间: 2010-1-30 16:03
标题: 回复 #65 chenall 的帖子
貌似正常了
但是很奇怪
fat32 簇大小2048正常
我快速格式化为 fat32 簇大小512
create 和copy 正常,dir显示结果,最后面几行乱码

然后我重新格式化(不用快速),还是512
再运行又正常了
不知道是不是第一次快速格式化,损坏了什么东西

另外就是,好像箭头出现46的问题也解决了(最新测试箭头还是有时候出现4和6,等我有空换几台电脑再测试一下这个跟grub本身有没有关系)

[ 本帖最后由 NicTense 于 2010-1-31 04:01 编辑 ]
作者: chenall    时间: 2010-1-30 16:09
可能是快速格式化时根目录表没有清干净,或者是程序还有问题。
作者: NicTense    时间: 2010-1-30 18:01
标题: 回复 #69 chenall 的帖子
ntfs以后再说吧,先征集反馈信息把fat的bug解决了再说,这个操作毕竟是危险操作,有bug的话,有时候后果是很严重的

对了,grub是不是没有运算符的

比如我要实现,读某个内存的制,然后加1,写回去,怎么实现呢

[ 本帖最后由 NicTense 于 2010-1-30 18:15 编辑 ]
作者: chenall    时间: 2010-1-30 18:12
目前没有办法。。。。
作者: NicTense    时间: 2010-1-30 18:19
标题: 回复 #71 chenall 的帖子
哎,偶的基础太差,研究了老半天,现在只实现原来有slic2.0的bios,用grub的dd写入,将slic更新为2.1
但是slic的地址好像每种不同品牌的电脑地址都是不一样的
如果不能运算,还真不知道怎么实现的通用性
看样子,那个破解程序的改版grldr要用通用版的grldr的函数来实现,还真的比较困难啊

另外,fat dir 设计的原意就是只能列表根目录的吧?

[ 本帖最后由 NicTense 于 2010-1-30 18:30 编辑 ]
作者: chenall    时间: 2010-1-30 18:40
对于SLIC没有研究过,只要明白它的原理,你可以通过写一个外部程序来实现。

像要实现你之前的映射磁盘的用外部命令应该只需要几行代码就搞定了。

目前是这样,只针对根目录。
作者: NicTense    时间: 2010-1-30 18:43
标题: 回复 #73 chenall 的帖子
写外部程序对我来说有点难啊,c和汇编都忘光了,上次看了你的例子,看完头有点晕,放弃了
等研究懂了再说吧

fat反复测试了几遍,没发现问题了,这个应该可以发布了
作者: netwinxp    时间: 2010-1-30 18:51
修改SLIC没那么简单,它涉及到EXXXXXXX ACPI地址的添加(原来没有SLIC的机子)、移动或修改,由于这里的数据是BIOS芯片内容解压形成的,并且涉及到ACPI表的改动(有些表不能移动位置的),所以不同的机子所采取的措施会有所不同,说白了就是兼容性会有问题。最好的办法还是刷BIOS。
NTFS下文件的创建确实很麻烦,涉及到$Bitmap(相当于FAT的FAT表)、$MFT、$MFTMirr、$LOGFILE的修改,小文件还好,直接添加$MFT记录,大文件还得新建节点。读取工作则要简单许多。

[ 本帖最后由 netwinxp 于 2010-1-30 19:11 编辑 ]
作者: NicTense    时间: 2010-1-30 19:15
标题: 回复 #75 netwinxp 的帖子
所以我只能修改我自己的电脑的slic
因为本来就有2.0的,只要将2.1的bin文件的374字节用dd写到内存就可以了
地址也是固定的

要通用的连运算符都没有是不可能的了,binbin的那个grldr也没看到源代码,要有源代码写外部程序就简单多了
作者: NicTense    时间: 2010-1-31 03:58
1、看来我把簇和扇区的概念弄混了
fat32分区格式化时可以选的那个 512 1024 2048...应该是簇的大小,而扇区大小目前主流硬盘,u盘都是512,对吧

2、假设mbr为nt类型,那么前63个扇区,是不是第3个开始的61个扇区我写入什么都不影响分区的数据的,如果是的话,
那是不是意味着我把n个引导程序分别写入后面的扇区,比如第3,4,5...个,然后grub分别chainloader (hd0)2+1,3+1,4+1...
就可以实现n重引导了

3、我突然想到了一个grub的一个很不错的用法,如果分区的时候,在最前面留一点点位置,然后再建第一个主分区
那样 (hd0)63+1开始的扇区就可以写入启动需要的文件了,写几个扇区就用块列表方式读入几个扇区就行了,这样就不会被应用程序删掉了
除非分区软件
作者: NicTense    时间: 2010-1-31 12:41
那个help信息可能不太规范

grub4dos的一贯写法,变量都是大写字母的,help中的部分变量为小写字母

info,dir都是针对分区操作,我在想用PARTITION是不是比DRIVE更合适呢

还有一个就是,fat file中的 (drive)/filename.ext 是不是用 (DEVICE)/FILENAME.EXT

另外,我写了个简易教程,不知道有没有错误的地方,请帮忙指正一下

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159760

c大的帮助信息写的太简单了,我估计有些新手不会用
作者: chenall    时间: 2010-1-31 13:08
新建的文件和复制的目标文不能使用“块列表表示法”。复制的源文件可以。

能否帮忙整理一份英文的帮助信息。

作为fat --help 时显示的信息。
作者: NicTense    时间: 2010-1-31 13:18
标题: 回复 #78 chenall 的帖子
好,我更正一下

英文帮助信息...我试试吧,英文语法我是文盲啊,我写好先找个人帮我修正一下语法再发上来吧
作者: NicTense    时间: 2010-1-31 15:26
看看这样子行不行

fat [help]
    Print this help infomation.

fat info [PARTITION]
    Print the infomation for partition PARTITION or the current root partition if PARTITION is not specified.

fat dir [PARTITION]
    List all files and directories in the root directory of partition PARTITION or the current root partition if PARTITION is not specified.

fat file create size=[SIZE|*] FILE
    Create file FILE of a certain size SIZE,FILE must be an absolute pathname e.g. (hd0,0)/1 ,()/abc.bin .if size=* is specified,the fat will get SIZE from memory address 0x8290(file size by last "cat --length=0").

fat file copy FILE1 FILE2
    Copy file FILE1 to file FILE2,FILE1 must be either a blocklist notation e.g. (fd0)100+2 or an absolute pathname e.g. (hd0,0)/1 , ()/abc.bin ,FILE2 must be an absolute pathname.
作者: NicTense    时间: 2010-1-31 15:50
如果write的地址参数可以实现四则运算,grub4dos就无敌了

利用现有的命令,AND/OR逻辑运算倒是可以实现的,加减乘除就想不出什么办法了

gnu grub 0.97的好像可以利用linux下 /dev/zero和bigfile的特殊设备直接创建文件,实现fat file的功能

不过现在有fat了,问题也就不存在了,只要它不会不小心损坏了硬盘的数据就行

对了,顺便问个问题

dbr(也就是bootice的pbr)是不是跟mbr一样,实际是占用了63个扇区的?
或者说,是不是每个分区的前63个扇区是不储存用户数据的?

[ 本帖最后由 NicTense 于 2010-1-31 15:58 编辑 ]
作者: chenall    时间: 2010-1-31 16:05
收下了,看起来没有问题。。
试了刚好占满一个屏幕。。。

运算,好像用到的地方比较少。。
如果需要运算,那还可能需要变量的支持等。

把WRITE的外部命令改造一下应该可以实现简单运算功能。

不是所有的MBR、DBR都是63个扇区的。。。

[ 本帖最后由 chenall 于 2010-1-31 16:07 编辑 ]
作者: NicTense    时间: 2010-1-31 16:22
原帖由 chenall 于 2010-1-31 16:05 发表
收下了,看起来没有问题。。
试了刚好占满一个屏幕。。。

运算,好像用到的地方比较少。。
如果需要运算,那还可能需要变量的支持等。

把WRITE的外部命令改造一下应该可以实现简单运算功能。

不是所 ...


1、copy和create的目标文件只能位于根目录没有写进上面的帮助信息,因为在附加说明里,如果以后不打算取消这个限制,就考虑一下改成这段

fat file create size=[SIZE|*] FILE
    Create file FILE of a certain size SIZE,FILE must be an absolute pathname e.g.
(hd0,0)/1 ,()/abc.bin ,and must be in the root directory of a partition. if size=* is
specified,the fat will get SIZE from memory address 0x8290(file size by last "cat --
length=0").

fat file copy FILE1 FILE2
    Copy file FILE1 to file FILE2,FILE1 must be either a blocklist notation e.g. (fd0)100+2
or an absolute pathname e.g. (hd0,0)/1 , ()/abc.bin ,FILE2 must be an absolute pathname,and
must be in the root directory of a partition.


2、变量不需要的,0x60000之后的内存地址,每个地址就是一个变量

3、zip32的mbr应该就是32扇区的对吧,其实我想确定的是,对于mbr是63个扇区的硬盘来说,是不是
也意味着每个dbr实际也会占用63个扇区,即这63个扇区不会用于存储用户数据

[ 本帖最后由 NicTense 于 2010-1-31 16:47 编辑 ]
作者: netwinxp    时间: 2010-1-31 16:48
DBR属于主分区或者逻辑分区的一部分,它不会像MBR一样占一整条磁道,默认情况是——
FAT16、FAT12占一个扇区;FAT32占8个扇区(0~2为BPB+引导程序、4~6为备份、3、7保留以后DBR的扩展);NTFS占16个扇区;扩展分区到逻辑分区由扩展分区表+逻辑分区组成,每一级扩展分区表有两个项(最后一级只有一个),第一个指向这一级的逻辑分区,第二个指向下一级扩展分区表,简单地说扩展分区是一个链,每级扩展分区表理论上应该和主分区表+MBR一样占整条磁道,但有的分区软件(比如PQ)并没有这么做,所以存在一定的兼容性问题。

[ 本帖最后由 netwinxp 于 2010-1-31 16:56 编辑 ]
作者: chenall    时间: 2010-1-31 17:05
也许我该考虑编写一个外部命令用于动态执行命令了。

比如固定执行内存0x60000地址开始的命令。

这样可以把需要动态执行的命令写入到0x60000地址中,然后再执行外部命令调用。。。

不知这个设想如何??
作者: NicTense    时间: 2010-1-31 17:28
标题: 回复 #86 chenall 的帖子
0x60000之前用于用户自定义数据
像你的MICROPE就用了不少,不会有冲突吗

这个设想具体是怎么样的
把命令行写入内存地址,然后作为参数执行?
目的是什么?批处理吗
如果是,似乎没有必要啊
如果创建一个lst文件,然后用configfile运行,是不是就可以实现批处理了
作者: chenall    时间: 2010-1-31 17:48
上面的地址只是一个假设,可以定义一个地址,或由用户指定。

使用configfile不方便。

具体还没有想好,之前好像有碰到这样的问题,需要动态执行某些命令,参数不是固定的。
作者: cchessbd    时间: 2010-1-31 18:09
c大,0.4.5a-01-15 grldr,在(ud)+hdd 的优盘上有个bug:
在menu.lst
find --set-root /t.iso
map /t.iso (0xff) || map --mem /t.iso (0xff)
map --hook
chainloader (0xff)
在执行到map /t.iso (0xff) || map --mem /t.iso (0xff)时出现 "error 15"提示,但跳入命令行,手动输入以上命令可以执行。

换回 2009-12-23正常。
作者: NicTense    时间: 2010-1-31 18:11
标题: 回复 #88 chenall 的帖子
明白了,就是给命令传递动态的参数

有一个方案你可以考虑一下

calc ADDR +|-|*|/N

即读取地址ADDR的值,执行指定的加/减/乘/除运算后把结果写回原地址,N可以限定为整数

或者设置两个地址参数
calc ADDR1 ADDR2  +|-|*|/N

把结果写入ADDR2

grub需要的四则运算不会太复杂,估计有加减法都足够了,乘除法可能涉及到越界和取整的问题,加减法越界只要变成全FF或者全00就可以了

这个方案的好处是不会影响到任何现存的其他命令

而且这个实现起来应该很简单

[ 本帖最后由 NicTense 于 2010-1-31 18:16 编辑 ]
作者: chenall    时间: 2010-1-31 18:19
@cchessbd
原则上请使用最新版测试后再报告是否有问题。。
另外也有可能是你的命令输入错误(之前的版不支持外部命令,新版本,错误的命令会当成外部命令来执行。。

@NicTense
如果是很简单的运算,直接写一个外部命令倒是不难。

上面的例子,只有一个操作数?另一个数可以自己指定?
是不是像这样子
calc ADDR + 123
把addr的值+123后再写入ADDR地址?

如果是这样倒是很简单,只需修改一下READ的源码,变成CALC.就可以了。
作者: NicTense    时间: 2010-1-31 18:27
标题: 回复 #91 chenall 的帖子
是的,乘除法如果麻烦都可以不要,因为乘除法很少会用到

不过如果 calc ADDR1 ADDR2 + 123 实现起来跟calc ADDR + 123 相差不是很大的话

2个地址参数用起来会更方便一些
作者: chenall    时间: 2010-1-31 18:33
这个理论上很很单,双目运算都是一样的。

求余%,移位>>,等。

明天再尝试一下。
作者: chenall    时间: 2010-2-1 14:55
简单的实现了5则运算
+,-,*,/,%

为了编程的方便。

只能进行双目运算。

只使用一个内存地址,(只能处理32位整数)

基本上够用。

使用方法

calc ADDR 符号 数值

符号可以使用
++
--
以上两个符号后面的数值没有使用。
+=
-=
*=
/=
%=

calc.rar

586 Bytes, 下载次数: 34, 下载积分: 无忧币 -2


作者: chenall    时间: 2010-2-1 15:42
呵呵,

因为是作为一个算术公式去考虑的。



a = a +2 相当于 a += 2

只是这里a使用的是一个地址。

方便以后扩展为使用两个地址吧。

汗,,跑题了。。

[ 本帖最后由 chenall 于 2010-2-1 15:46 编辑 ]
作者: zhaohj    时间: 2010-2-1 17:38
原帖由 NicTense 于 2010-2-1 16:11 发表
calc出错了
数值N被忽略,永远等于1

另外就是最好能把运算结果同时作为函数返回值
以便checkrange调用,这个应该是增加一行代码而已


我这里测试正常啊

Snap1.jpg (33.17 KB, 下载次数: 167)

Snap1.jpg

作者: NicTense    时间: 2010-2-1 17:58
我晕.....我没把字看清楚
我以为操作符支持 + - * / %
所以才不明白还要 +=那些干什么
结果测试的时候符号就用了 + - * /了
那就没问题了,我把那楼删了

c大能不能把运算结果同时作为函数返回值
以便checkrange调用,这个应该是增加一行代码而已

要是2个地址,像这个功能就很容易实现了

比如 0x829c的地址只要2位,但是read出来的是4位,后面2位是ffff,我又不确定那4位什么情况下会变

calc 0x829c 0x60000 /=0x10000

就解决了

[ 本帖最后由 NicTense 于 2010-2-1 18:21 编辑 ]
作者: chenall    时间: 2010-2-1 18:27
ok,
完善了一下。

1.结果作为程序的返回值

2.添加>> << & ^ | 运算符。

3.重新定义了命令行参数。

如果第一个参数没有带*则只作运算不写内存。

例子 
calc 1 + 1 或calc 1++
得到2
calc 1 + *0x8290

把内存0x8290的值+1,然后直接返回。

calc *0x60000 = *0x8290 + 2

读取内存值*0x8290加2后的值写入到*0x60000地址。

如果前面的*0x60000 是没有带*的则第一个参数被忽略(即不写内存);

calc *0x60000 + 2
计算并写内存到*0x60000处。

总之,只要第一个参数前导*的就有写内存,没有就不写内存。
并且前导*代表这是一个内存地址,否则按正常数值处理。

注:此版因为重写了代码不再支持上一个版本的+=或-=。
上个版本的+=2

用这个版本直接+2就可以了。

试下如果没有问题,就麻烦你们写个帮助文件了。^_^,我英文不行。不知如何表达。

[ 本帖最后由 chenall 于 2010-2-1 18:37 编辑 ]

calc.rar

708 Bytes, 下载次数: 23, 下载积分: 无忧币 -2


作者: chenall    时间: 2010-2-1 18:33
另外,
比如 0x829c的地址只要2位,但是read出来的是4位,后面2位是ffff,我又不确定那4位什么情况下会变

calc 0x829c 0x60000 /=0x10000

就解决了

用移位比较快,只要把后面的FFFF移掉就OK了
一个ff是8位。

calc *0x60000 = *0x829c >> 16

calc 1 = *0x829c >> 16

只作计算,不写内存。

对了,请版主看到本贴的话,把后面CALC.部份转移到新贴中,免得乱了。。

[ 本帖最后由 chenall 于 2010-2-1 18:36 编辑 ]
作者: NicTense    时间: 2010-2-1 19:09
标题: 回复 #98 chenall 的帖子
这个版本比我原来想象的还要好

虽然用法完全明白了,但是帮助文件很难写

别说英文了,要写个言简意赅,符合规范的中文帮助都有点难度

这个参数表达式估计得参考一下c的英文help了
作者: chenall    时间: 2010-2-1 19:40
简单使用说明:GRUB4DOS 简单双目计算器.
使用方式
1.calc 数值 [运算符] 数值
2.calc 数值 = 数值 运算符 数值
如果数值前面有前导*代表这是一个内存地址,
计算时会从这个内存地址中读取32位整数进行计算.
第一个参数如果有前导*,会将计算结果写入这个内存地址中.
可使用运算符列表:
递减 --
递增 ++
加法 +
除法 /
取余 %
乘法 *
减法 -
按位与 &
按位或 |
按位异或 ^
按位左移 <<
按位右移 >>

[ 本帖最后由 chenall 于 2010-2-1 19:43 编辑 ]
作者: maffff    时间: 2010-2-1 23:37
支持一下,希望越来越完善.




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3