无忧启动论坛

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

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

[复制链接]
61#
发表于 2010-1-30 15:13: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 编辑 ]
回复

使用道具 举报

62#
发表于 2010-1-30 15:26:19 | 只看该作者
把sd盘格式化为 fat32 簇大小2048
则所有功能正常

簇为512时就不行了

[ 本帖最后由 NicTense 于 2010-1-31 04:00 编辑 ]
回复

使用道具 举报

63#
 楼主| 发表于 2010-1-30 15:29: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

回复

使用道具 举报

64#
发表于 2010-1-30 15:43:38 | 只看该作者
FAT32分区硬盘测试也正常,呵呵圆满了。
该关注NTFS了。
回复

使用道具 举报

65#
 楼主| 发表于 2010-1-30 15:55:44 | 只看该作者
原帖由 zhaohj 于 2010-1-30 15:43 发表
FAT32分区硬盘测试也正常,呵呵圆满了。
该关注NTFS了。


不想搞NTFS,太复杂了。

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

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

FAT32会自动扩展。
回复

使用道具 举报

66#
发表于 2010-1-30 16:03:59 | 只看该作者

回复 #65 chenall 的帖子

貌似正常了
但是很奇怪
fat32 簇大小2048正常
我快速格式化为 fat32 簇大小512
create 和copy 正常,dir显示结果,最后面几行乱码

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

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

[ 本帖最后由 NicTense 于 2010-1-31 04:01 编辑 ]
回复

使用道具 举报

67#
 楼主| 发表于 2010-1-30 16:09:15 | 只看该作者
可能是快速格式化时根目录表没有清干净,或者是程序还有问题。
回复

使用道具 举报

68#
发表于 2010-1-30 18:01:24 | 只看该作者

回复 #69 chenall 的帖子

ntfs以后再说吧,先征集反馈信息把fat的bug解决了再说,这个操作毕竟是危险操作,有bug的话,有时候后果是很严重的

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

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

[ 本帖最后由 NicTense 于 2010-1-30 18:15 编辑 ]
回复

使用道具 举报

69#
 楼主| 发表于 2010-1-30 18:12:46 | 只看该作者
目前没有办法。。。。
回复

使用道具 举报

70#
发表于 2010-1-30 18:19:32 | 只看该作者

回复 #71 chenall 的帖子

哎,偶的基础太差,研究了老半天,现在只实现原来有slic2.0的bios,用grub的dd写入,将slic更新为2.1
但是slic的地址好像每种不同品牌的电脑地址都是不一样的
如果不能运算,还真不知道怎么实现的通用性
看样子,那个破解程序的改版grldr要用通用版的grldr的函数来实现,还真的比较困难啊

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

[ 本帖最后由 NicTense 于 2010-1-30 18:30 编辑 ]
回复

使用道具 举报

71#
 楼主| 发表于 2010-1-30 18:40:01 | 只看该作者
对于SLIC没有研究过,只要明白它的原理,你可以通过写一个外部程序来实现。

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

目前是这样,只针对根目录。
回复

使用道具 举报

72#
发表于 2010-1-30 18:43:53 | 只看该作者

回复 #73 chenall 的帖子

写外部程序对我来说有点难啊,c和汇编都忘光了,上次看了你的例子,看完头有点晕,放弃了
等研究懂了再说吧

fat反复测试了几遍,没发现问题了,这个应该可以发布了
回复

使用道具 举报

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

[ 本帖最后由 netwinxp 于 2010-1-30 19:11 编辑 ]
回复

使用道具 举报

74#
发表于 2010-1-30 19:15:39 | 只看该作者

回复 #75 netwinxp 的帖子

所以我只能修改我自己的电脑的slic
因为本来就有2.0的,只要将2.1的bin文件的374字节用dd写到内存就可以了
地址也是固定的

要通用的连运算符都没有是不可能的了,binbin的那个grldr也没看到源代码,要有源代码写外部程序就简单多了
回复

使用道具 举报

75#
发表于 2010-1-31 03:58:39 | 只看该作者
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开始的扇区就可以写入启动需要的文件了,写几个扇区就用块列表方式读入几个扇区就行了,这样就不会被应用程序删掉了
除非分区软件
回复

使用道具 举报

76#
发表于 2010-1-31 12:41:07 | 只看该作者
那个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大的帮助信息写的太简单了,我估计有些新手不会用
回复

使用道具 举报

77#
 楼主| 发表于 2010-1-31 13:08:22 | 只看该作者
新建的文件和复制的目标文不能使用“块列表表示法”。复制的源文件可以。

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

作为fat --help 时显示的信息。
回复

使用道具 举报

78#
发表于 2010-1-31 13:18:33 | 只看该作者

回复 #78 chenall 的帖子

好,我更正一下

英文帮助信息...我试试吧,英文语法我是文盲啊,我写好先找个人帮我修正一下语法再发上来吧
回复

使用道具 举报

79#
发表于 2010-1-31 15:26:16 | 只看该作者
看看这样子行不行

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.
回复

使用道具 举报

80#
发表于 2010-1-31 15:50:47 | 只看该作者
如果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 编辑 ]
回复

使用道具 举报

81#
 楼主| 发表于 2010-1-31 16:05:24 | 只看该作者
收下了,看起来没有问题。。
试了刚好占满一个屏幕。。。

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

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

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

[ 本帖最后由 chenall 于 2010-1-31 16:07 编辑 ]
回复

使用道具 举报

82#
发表于 2010-1-31 16:22:38 | 只看该作者
原帖由 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 编辑 ]
回复

使用道具 举报

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

[ 本帖最后由 netwinxp 于 2010-1-31 16:56 编辑 ]
回复

使用道具 举报

84#
 楼主| 发表于 2010-1-31 17:05:32 | 只看该作者
也许我该考虑编写一个外部命令用于动态执行命令了。

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

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

不知这个设想如何??
回复

使用道具 举报

85#
发表于 2010-1-31 17:28:38 | 只看该作者

回复 #86 chenall 的帖子

0x60000之前用于用户自定义数据
像你的MICROPE就用了不少,不会有冲突吗

这个设想具体是怎么样的
把命令行写入内存地址,然后作为参数执行?
目的是什么?批处理吗
如果是,似乎没有必要啊
如果创建一个lst文件,然后用configfile运行,是不是就可以实现批处理了
回复

使用道具 举报

86#
 楼主| 发表于 2010-1-31 17:48:06 | 只看该作者
上面的地址只是一个假设,可以定义一个地址,或由用户指定。

使用configfile不方便。

具体还没有想好,之前好像有碰到这样的问题,需要动态执行某些命令,参数不是固定的。
回复

使用道具 举报

87#
发表于 2010-1-31 18:09:12 | 只看该作者
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正常。
回复

使用道具 举报

88#
发表于 2010-1-31 18:11:50 | 只看该作者

回复 #88 chenall 的帖子

明白了,就是给命令传递动态的参数

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

calc ADDR +|-|*|/N

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

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

把结果写入ADDR2

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

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

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

[ 本帖最后由 NicTense 于 2010-1-31 18:16 编辑 ]
回复

使用道具 举报

89#
 楼主| 发表于 2010-1-31 18:19:51 | 只看该作者
@cchessbd
原则上请使用最新版测试后再报告是否有问题。。
另外也有可能是你的命令输入错误(之前的版不支持外部命令,新版本,错误的命令会当成外部命令来执行。。

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

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

如果是这样倒是很简单,只需修改一下READ的源码,变成CALC.就可以了。
回复

使用道具 举报

90#
发表于 2010-1-31 18:27:57 | 只看该作者

回复 #91 chenall 的帖子

是的,乘除法如果麻烦都可以不要,因为乘除法很少会用到

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

2个地址参数用起来会更方便一些
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-9-23 10:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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