无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
241#
发表于 2015-2-11 15:25:40 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-11 16:02 编辑
不点 发表于 2015-2-11 14:40
建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾 ...


1:  builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。
在 源代码中兜圈。
所以 来问问。

2: 我问的是2个问题。
上面只涉及一个。


3: 我需要具体的答案。
比如 【ls  (hd0,0)/】
builtin_cmd  怎么写。

不是 一些 “空泛”的指导——那些我懂的。
实际中碰到具体问题, 就希望 “具体” 的答案。

点评

你可以看一下builtin_cmd的源码就明白了.  详情 回复 发表于 2015-2-11 15:48
回复

使用道具 举报

242#
发表于 2015-2-11 15:56:42 | 显示全部楼层
chenall 发表于 2015-2-11 15:48
通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的, ...

非常感谢!!
回复

使用道具 举报

243#
发表于 2015-2-13 11:53:47 | 显示全部楼层
chenall 发表于 2015-2-13 09:36
这个你的理解错误,有点想当然.

(md)0x880 处存放的是lzma菜单是没有错,但是这个是原始的而不是经过解压 ...

非常感谢!
回复

使用道具 举报

244#
发表于 2015-2-13 12:07:14 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-13 12:10 编辑
chenall 发表于 2015-2-13 09:36
这个你的理解错误,有点想当然.

(md)0x880 处存放的是lzma菜单是没有错,但是这个是原始的而不是经过解压 ...


请教C大一个问题:
C中 怎么获得命令行参数, 当前文件名。
看到 get_cmdline_obsolete(struct get_cmdline_arg cmdline)


C中 怎么准备 get_cmdline_obsolete ()的参数?
int
get_cmdline_obsolete (struct get_cmdline_arg cmdline);

struct get_cmdline_arg
{
        unsigned char *cmdline;
        unsigned char *prompt;
        unsigned int maxlen;
        unsigned int echo_char;
        unsigned int readline;
} __attribute__ ((packed));
这个结构怎么准备,怎么填。
我就想获得 命令行参数, 当前文件名。


还看到 get_cmdline(void);
get_cmdline(void) 好像不能直接用。 用了直接重启了。

点评

印像中get_cmdline不能单独使用,它还有一个全局参数,需要先设置好再运行就行了. 参数的话你上面的那个就是了,看参数名字就能理解了. 一个比较重要的 cmdline指针指向要存放输入的字符,配合maxlen限定字符数(需要  详情 回复 发表于 2015-2-13 12:52
回复

使用道具 举报

245#
发表于 2015-2-13 13:22:01 | 显示全部楼层
chenall 发表于 2015-2-13 12:52
印像中get_cmdline不能单独使用,它还有一个全局参数,需要先设置好再运行就行了.

参数的话你上面的那 ...


怎么看 get_cmdline_obsolete()   好像 不是  我要的。

我要的 的是 运行当前程序的 命令行。

get_cmdline_obsolete() 好像是从命令行读取 用户的命令, 比如读取键盘输入的命令行!

“运行当前程序的 命令行” 怎么获得? 其实 就要 %0--当前文件.

点评

当前文件名称,有的dos版本会放在comline的参数上,即和comspec一样可以在psp区段读取。 psp区段一般放在ds:2ch处,比较正式的获取方法是呼叫int 21h ah=62h,BX传回的便是psp区段。 psp:0放的是整个系统参列序列  详情 回复 发表于 2015-2-13 21:46
我不明白这个 “运行当前程序的 命令行” 到底具体指的是什么, 我猜测是要获取到当前"正在运行的命令",这个没有办法得到吧,除非你自己写一个外壳程序 类似于批处理之样的,因为所有的命令都是由你控制运行的,当  详情 回复 发表于 2015-2-13 13:42
回复

使用道具 举报

246#
发表于 2015-2-15 08:51:39 | 显示全部楼层
请问 能加上  USB 和 U盘 的 驱动,
这样可以越过BIOS访问U盘。
这样 就不会有 BIOS访问能力限制。
就像 Linux一样自由地访问U盘。(精简的LInux也就300K)

点评

有了,0.4.6a usb --init  详情 回复 发表于 2015-2-15 13:32
回复

使用道具 举报

247#
发表于 2015-2-15 13:47:36 | 显示全部楼层
sunsea 发表于 2015-2-15 13:32
有了,0.4.6a usb --init

1) 这个能超越 BIOS的限制吗?
      这么问,是因为, 我所知道的是, 这个用来加速USB2.0.
      也不知道, 怎么用这个来  超越 BIOS的限制。

2) 目前的USB --init  , 好像支持USB2.0。 USB1.1 和  USB3.0都不支持。

点评

可以,本人亲测可以突破CHS的8.4G限制,直接运行就可以了  详情 回复 发表于 2015-2-15 14:43
回复

使用道具 举报

248#
发表于 2015-2-15 13:51:19 | 显示全部楼层
chenall 发表于 2015-2-13 13:42
我不明白这个 “运行当前程序的 命令行” 到底具体指的是什么,

我猜测是要获取到当前"正在运行的命令" ...

C大, 请教个问题。
usb --init
这个命令能用来超越 BIOS 的访问能力限制,自由地访问U盘/USU.SD/USB.手机卡 吗?
就是 可以访问整个磁盘。
目前BIOS 可能不能访问 磁盘后面, 这个能解决U盘的这个问题吗?

回复

使用道具 举报

249#
发表于 2015-2-15 18:34:41 | 显示全部楼层
sunsea 发表于 2015-2-15 14:43
可以,本人亲测可以突破CHS的8.4G限制,直接运行就可以了

请问, 你怎么测试的? 我还为怎么测试犯愁勒!
现在的 机器 和U盘, 一般本来就没有这个限制。
只有很少的几率能碰到 有BIOS访问限制的盘和BIOS!
我这里, 目前没这个测试条件。 

点评

我就是找了一个移动硬盘,往里面部署multimbr(32G),0PE,一堆合盘和一个USBXP,占了10G多,然后故意不放USBXP的ntldr,在最后把ntldr放进去,那台电脑把我的移动硬盘驱动器号分配为0x00,只能采用CHS访问,然后我  详情 回复 发表于 2015-2-17 13:10
回复

使用道具 举报

250#
发表于 2015-2-15 22:59:02 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-15 23:02 编辑

发现宝了!

原来G4D中还有藏着这种内存设备表示法:
(md,0x24000ac,0x1d78)
---   -------------   -------
md: 内存设备
0x24000ac: 起始地址, 字节单位
0x1d78: 长度, 字节单位


(md)xx+bb,c
好多了。

现在只要不多不少的2个数, 且没有512字节对齐一说;也没有 后面多于的字节一说!

这么好的东西,怎么不公开啊!
怎么不让大家用啊!

是不是还可以扩展到
(hd0,510,2)
那是多漂亮的事!


回复

使用道具 举报

251#
发表于 2015-2-16 17:57:51 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-16 18:13 编辑

请教C大:
从你的博客看到下面的文件,
http://chenall.net/post/grub4dos_initrdfs/
  1. set rdev=
  2. blocklist %~m0/1 | call :get_dev=
  3. ls %rdev%/
  4. cat %rdev%/file
  5. goto :eof
  6. :get_dev
  7. set rdev=%~d1
  8. goto :eof
复制代码


几乎没动:
  1. !BAT
  2. echo 测试多cpio文件
  3. #访问 %~m0/1中的 f1.lst f2.lst
  4. blocklist %~m0/1
  5. set rdev=
  6. blocklist %~m0/1 | call :get_dev=
  7. ls %rdev%/
  8. cat %rdev%/f1.lst
  9. goto :eof
  10. :get_dev
  11. set rdev=%~d1
  12. goto :eof
复制代码

不能访问第一个cpio中的file

调试发现, 关键是 【blocklist %~m0/1】没输出。
不知是哪儿出了问题。


m_cpio2.sh:
主文件为main.lst
后面2个cpio,中间均有一个\NUL间隔。
cpio[1]:  file  f1.lst f2.lst
cpio[2]:        f3.lst f4.lst

测试文件包.7z (959 Bytes, 下载次数: 1)

点评

理解错了吧 应该是 main.lst\NULf1.lst\NULf2.lst\NULf3.lst\NULf4.lst\NUL[cpio] 这样的形式 然后 %~m0/1对应的就是 f1.lst  详情 回复 发表于 2015-2-16 18:16
回复

使用道具 举报

252#
发表于 2015-2-16 22:31:14 | 显示全部楼层
sratlf 发表于 2015-2-16 18:16
理解错了吧  应该是 main.lst\NULf1.lst\NULf2.lst\NULf3.lst\NULf4.lst\NUL[cpio] 这样的形式

然后 ...

谢谢!
那么
1)  
  1. set rdev=
  2. blocklist %~m0/1 | call :get_dev=
  3. ls %rdev%/
  4. cat %rdev%/file
  5. goto :eof
  6. :get_dev
  7. set rdev=%~d1
  8. goto :eof
复制代码

到底什么意思?

2)我又做个测试。
main.lst\NULf1.lst\NULf2.lst\NULf3.lst\NULf4.lst\NUL[cpio]
[cpio]:file+fil2+fil3
  1. !BAT
  2. echo 测试多cpio文件
  3. #访问 %~m0/1中的 f1.lst f2.lst
  4. blocklist %~m0/1
  5. set rdev=
  6. blocklist %~m0/1 | call :get_dev=
  7. ls %rdev%/
  8. cat %rdev%/file
  9. goto :eof
  10. :get_dev
  11. set rdev=%~d1
  12. goto :eof
复制代码

效果:

【blocklist %~m0/1】 有东西了。
【ls %rdev%/】的输出是【0】
请教:(1)具体本例, %~m0/1到底指的谁?  f1.lst 还实际 【cpio】 ?还是【cpio/file】?
           (2) %rdev%/ 有时谁? ls %rdev%/ 为什么输出【0】
           (3) %rdev%/file 有时谁? cat  %rdev%/file 为什么什么也没有,也没报错。

点评

1) 2) 你的cpio是怎么生成的 有没有经过压缩 或者你也可以附加一个没经过压缩的img或者iso文件作为数据文件 比每次生成cpio文件方便的多 3) 1. %~m0/1 指的是主批处理 mail.lst 后面的第一个  详情 回复 发表于 2015-2-17 09:45
回复

使用道具 举报

253#
发表于 2015-2-17 10:08:53 | 显示全部楼层

1)
》》你的cpio是怎么生成的  有没有经过压缩  
  1. cat x.lst| cpio -o -H newc >1.cpio
复制代码

其中x.lst就3行文本:
  1. file
  2. fil2
  3. fil3
复制代码

1.cpio 没有压缩。


2) %~m0/file
这个是方便。

我看到 博客的那个脚本, 很是好奇。似乎蕴含着什么很重要的东西。
象弄个究竟。
首先是发现一种新的 扇区序列表示法。

好钻研新技术。新技术会带来新的应用。

点评

那就不太清楚了 我都是用的iso和img。。。  详情 回复 发表于 2015-2-17 10:40
回复

使用道具 举报

254#
发表于 2015-2-17 10:50:34 | 显示全部楼层

1:
file file2 file3 做成1.ISO,结果还是一样。

2:
  1. 1. %~m0/1 指的是主批处理 mail.lst 后面的第一个子批处理  也就是f1.lst  
  2.   2. 变量 rdev 的值实际是cpio数据文件所在的扇区序列
  3.       ls %rdev%/ 这个只是确定一下访问数据文件是否正常  这里输出0肯定就不是正常情况  
  4.       需要再检查数据文件或者命令是否存在错误  你可以试下不用cpio  换成普通的iso文件  注意不要压缩
  5.   3. %rdev%/file 这个只是个示例  表示的cpio数据文件里名为 file 的文件
复制代码

那么上面的代码有逻辑问题:
blocklist %~m0/1 | call :get_dev=
::  %~m0/1 对应 f1.lst。得到的%rdev% 也应该是 f1.lst的目录(容器),
:: 下面 [ls %rdev%/]列出的 应该是  f1.lst 同级文件。
::  [cat %rdev%/file]访问的应该是   f1.lst 同级文件file.问题在这儿, file 和 f1.lst 不同级。
:: 1.iso或1.cpio 才是和 f1.lst 同级,  file是   1.iso或1.cpio  的子文件。
::  file 和 f1.lst 差辈了!!!

ls %rdev%/
::对cpio数据文件里名为 file 的文件执行cat命令
cat %rdev%/file
::结束
goto :eof

:get_dev
::将cpio数据文件所在的扇区序列赋值给变量rdev
set rdev=%~d1
::结束
goto :eof
---------------------
感觉目前实现了2种:
1) 多个普通文件依次平铺,依数字序号,用 %~m0/1  %~m0/2 ... %~m0/n 来访问后面的文件。
2) 主文件+1个CPIO/ISO等包。  依子文件名,用 %~m0/file1   %~m0/file2 ...来访问包中的文件。
后者似乎用到内置的map,   %~m0/ 对应一个文件系统(ISO/CPIO)


至于从C大的脚本体会出的:“多个脚本+CPIO”或“多个CPIO”。
似乎原理上可行,但是可能什么底层细节支持没有实现,或者没找到怎么使用这些底层的高层方法。


点评

chenall提供的尾续批处理,fbt新版提供了便捷操作功能  详情 回复 发表于 2015-2-18 10:17
代码逻辑那个还是你理解出问题了。。。 附加的子批处理只能用 %~m0/1 这种形式访问 没办法通过 ls 命令列出来 然后获取的%rdev%指向的是附加在最后的cpio数据文件 不会包含cpio文件前的子批处理文件 两者是不  详情 回复 发表于 2015-2-17 10:56
回复

使用道具 举报

255#
发表于 2015-2-17 11:12:27 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-17 11:42 编辑
sratlf 发表于 2015-2-17 10:56
代码逻辑那个还是你理解出问题了。。。 附加的子批处理只能用  %~m0/1 这种形式访问  没办法通过 ls 命令 ...


》》代码逻辑那个还是你理解出问题了。。。 附加的子批处理只能用  %~m0/1 这种形式访问  没办法通过 ls 命令列出来

然后获取的%rdev%指向的是附加在最后的cpio数据文件  不会包含cpio文件前的子批处理文件  两者是不互通的
-----------------------------------
你是说,
对:main.lst\NULf1.lst\NULf2.lst\NULf3.lst\NULf4.lst\NUL1.CPIO
1) %~m0/1 的确 对应 fl.lst
2) 但是 blocklist %~m0/1 | call :get_dev= 后得到的 %rdev% 却对应1.CPIO.
    这样  %rdev%/file 就是1.CPIO的file.
是这个意思吗?

点评

c大些的说明有点问题 可能代码后来调整过了但是说明没更新 1, 原文:访问方式: %~m0/1是第一个文件,%~m0/2是第二个文件,以此类推.并且可以直接运行 更正:访问方式: %~m0/0是第一个文件,%~m0/1是第二个文件  详情 回复 发表于 2015-2-17 12:12
小意见:M大,您对技术的研究精神毋庸置疑是一流的,但文字表达上(可能是输入法的原因)笔误很是频繁……  发表于 2015-2-17 11:24
回复

使用道具 举报

256#
发表于 2015-2-17 12:52:06 | 显示全部楼层
sratlf 发表于 2015-2-17 12:12
c大些的说明有点问题  可能代码后来调整过了但是说明没更新

1,


非常感谢。
一切的症结: 序号差一个了。
我试过 %~m0/5 , 就是没试过 %~m0/4
上面程序改成 %~m0/4 就好了。

1.cpio 1.img 都成功。
就1.iso 不成功。 我用UltraISO做的1.iso
换成iso,你那能成功吗?

点评

iso的没问题 不过我是用mkisofs生成的 没有用ultraiso  详情 回复 发表于 2015-2-17 13:20
回复

使用道具 举报

257#
发表于 2015-2-17 14:54:00 | 显示全部楼层
sunsea 发表于 2015-2-17 13:10
我就是找了一个移动硬盘,往里面部署multimbr(32G),0PE,一堆合盘和一个USBXP,占了10G多,然后故意 ...

1: 你是说,没加 usb --init 就不能正常启动, 加了就能正常启动,是吗?


2:移动硬盘本身是支持LBA的。也就是说硬件接口本身有这个能力。
你这里 是“认”成fdd 0x00, 从用CHS访问。
但是 usb --init ,会不会有把它变回hdd,从而能用硬件的LBA接口。

现在,怎确认是 用的硬件本身的LBA访问接口,还是usb -init直接通过 sici总线命令、U盘协议直接访问?

看来还得问问C大了。



点评

这件事问yaya更好,这个功能是他写的  发表于 2015-2-17 17:36
1:是的 2:所有USB存储设备内部寻址都是LBA,其他我不知道  详情 回复 发表于 2015-2-17 17:34
回复

使用道具 举报

258#
发表于 2015-2-17 14:56:12 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-17 17:44 编辑

请问,  usb --init 后,  用的硬件本身的LBA/CHS访问接口,还是 直接通过 sici总线命令、U盘协议直接访问?
后者直接越过BIOS的驱动支持,从而克服BIOS访问限制。
回复

使用道具 举报

259#
发表于 2015-2-17 15:25:58 | 显示全部楼层
sratlf 发表于 2015-2-17 13:20
iso的没问题   不过我是用mkisofs生成的  没有用ultraiso

还这是UI不行。
mkiso生产的iso。 用UI编辑下, 就不行了。
回复

使用道具 举报

260#
发表于 2015-2-18 16:56:01 | 显示全部楼层
chenall 发表于 2015-2-18 10:30
@mdyblog,@sratlf

是我的疏忽


>>忘了更新了,早期的版本0是批处理本身后面发现这个没有什么用处
也就是 说 原来是从1开始的。
其实, 没必要改成从0开始。
改成从0开始 也看不出有什么好处。
这一改,反倒造成 不必要的不兼容。
和历史上的文档, 方法,记忆都不兼容的。

追求感觉上的完美,是要付出代价的。
-------------------------------
祝C大、丫丫、不点、sratlf  新年快乐!{:soso_e177:}

点评

谢谢您,谢谢所有的朋友们。借此顺祝各位喜气洋洋,洋洋洒洒,阳光灿烂,扬眉吐气。 淡出之后,看到你们继续前进,由衷高兴。 希望开发者们注意身体,不要熬夜,稳步前进,不急不躁。  详情 回复 发表于 2015-2-18 17:49
回复

使用道具 举报

261#
发表于 2015-2-24 14:01:14 | 显示全部楼层
请问下面的情况, 怎么保留(ud)还能访问?

UD启动 (ud)/grldr

(ud)/grldr 将一块磁盘 map为(hd0)
  1. map (hd0)0x4096+0x4096000 (hd0)
  2. map (hd0) (hd1)
  3. map --rehook
复制代码


然后到(hd0,0),并启动 (hd0,0)/grldr
------------------
问题是:
  1. root (hd0,0)
  2. chainloader /grldr
复制代码
后, (ud)不能访问了.

请问怎么才能启动新的 (hd0,0)/grldr 后还能访问(ud)?

点评

你直接访问(hd1)/不就行了. 实际上早期的版本经过以上hook之后ud的就已经失效了的(无法正常访问).后面经过不点的修改可以了. ud就是从ud上启动才会有的,就像pd一样,只有从pxe启动才会有pd 若是按你所说的修  详情 回复 发表于 2015-2-26 15:03
回复

使用道具 举报

262#
发表于 2015-2-25 21:22:07 | 显示全部楼层
不点 发表于 2015-2-25 20:40
从 ud 盘启动时,ud 可以访问。如果转而启动另一个 grldr,则已经不是从 ud 盘启动了,而是相当于从 bios  ...


1) 我要的不是原因,也不是原理,也不是“理念”。 而是适用的解决方案。

2) 解决办法:不要在 grub 环境又启动一个新的 grub 环境,丧失原来的 ud 访问能力。
这个是无法保证的。
MBROSTool格式化的 UD盘,启动UD中的实现准备好的grldr。
加载用户区。
转而启动用户区。

用户区 是用户格式化的,那个grldr 是用户的。不能代替用户的grldr.

用户还想访问(ud)中的配置信息。

理论上是可以保留(ud)-----只要突破“理念”的束缚。
或者 加个开关:
chainloader --ud  /grldr
总之给个 可行的手段就行,什么方式都行。
回复

使用道具 举报

263#
发表于 2015-2-26 17:16:32 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-27 04:23 编辑
chenall 发表于 2015-2-26 15:03
你直接访问(hd1)/不就行了.

实际上早期的版本经过以上hook之后ud的就已经失效了的(无法正常访问).后面 ...


1:  你直接访问(hd1)/不就行了.
谢谢, 原来还可以这样 用啊!
非常感谢!


2: 首先,就是带来兼容性问题.
----------
可以提供一个开关。比如 --ud。 用户负责自付。

另外 没有这个功能,才带来兼容性问题。
原来的版本反倒有这个功能。

我相信这个功能还是很有用的。
前面就有人 因为新版本取消了这个功能(而不是完善这个功能)而放弃新版。


3: 其次,假如多个磁盘上都有使用fb格式,那ud是要指哪一个呢????
---------------
原来的UD。
和2一起说吧。

chainloader   --ud    /grldr
这样就保留了原来的 (ud)



4:我觉得有些工作还是自己修改一下菜单修改下就行了,没有必要让软件来代劳,因为得不偿失.
你可以自己写一个外部软件来实现你想要的功能,在菜单中运行你的软件就产生ud设备.
ud设备关键信息在fb_status中
外部程序的作用就是自动查找ud并设置fb_status的值,这样就有ud了.
--------------
这个 新启动的grldr 是用户提供的,我这根本无法控制它。

1) 你说的“设置fb_status的值”,请问具体怎么设置。


2)
你说的“设置fb_status的值”, 那也是在新启动的 grldr中或者后面的菜单中做吧。
那都是用户的,我这根本无法控制这些。
如果
chainloader   --ud    /grldr
能就不同了。他只是提供一个初始环境——保留原来的(ud)。
回复

使用道具 举报

264#
发表于 2015-2-27 07:28:16 | 显示全部楼层
不点 发表于 2015-2-26 03:47
我说的是现状,你说的是要改变现状,不是一个概念。很抱歉,我帮不了了,我退出这个话题。

下面是想说 ...


>>假如能够把这个问题做好,达到两全其美,那也是好事。
-------------------
我分析了下。 应该可以的。
1(ud)本身的问题。
由于(ud) 绑定的 是物理磁盘。
这样,没有map 动态调整的 麻烦。
因为 map 动态调整,不会调整 物理磁盘 号。

多个硬盘也没问题。
从硬盘启动时,总是0x80.  也不受map影响。


2grldr启动的时候,要检查是否从ud启动。如果是的,则把 ud 区当作当前 root 区
-------------------
这个也根本不是问题。这个是有规范的。
启动磁盘,本来就和(ud)没有一点关系。
启动磁盘 依据规范,是通过dl传递的。 传递的多少,就是多少。
启动分区,本来就和(ud)没有一点关系。
启动磁盘 依据规范,也传递过来的。 传递的多少,就是多少。不是有(ud)决定的。

只有从MBR启动时,或者类似情况。此时 分区号为255,表示没有分区,而从“整个磁盘”启动。
此时 才会 “检查是否从ud启动,如果是的,则把 ud 区当作当前 root 区”.

比如:
1) 从 (hd0,0)  chainloader  /grldr
此时指定了 分区号, 根分区和 (ud)无关。 根分区为(hd0,0)
此时,会继承原来的 (ud).  注意是继承的,而不是分析(hd0,0) 的这个hd0而得来的。


2) 从(ud)   chainloader  /grldr
此时,会继承原来的 (ud).  并用继承的(ud)作为root。
注意是继承的,而不是分析得来的。


3) 从(hd0)   chainloader  /grldr
(1)此时,会自动继承原来的 (ud).
         注意是继承的,而不是分析(hd0,0) 的这个hd0而得来的。

(2)如果没有开关禁止,
         如果逻辑磁盘(hd0) 对应一个物理磁盘或其头部,分析物理磁盘对应区域, 如果是完的(ud), "则把 ud 区当作当前 root 区"。 同时更新(ud)
         否则直接把(hd0)  "当作当前 root 区"。 ((ud).还是原来的(ud))

(3)如果有开关禁止, 不分析逻辑磁盘(hd0), 直接把(hd0)  "当作当前 root 区" ((ud).还是原来的(ud))



点评

随便说说一点看法,供参考。 你可以自己打补丁,提交给 chenall。chenall 接到补丁后,可以先测试一段时间,如果放心,就会正式采纳。chenall 甚至也有可能为你单独开辟一个系列,就像以前为 yaya 单独开辟一个  详情 回复 发表于 2015-2-27 09:01
回复

使用道具 举报

265#
发表于 2015-2-28 10:03:34 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-28 10:11 编辑

请问  rawread() 最后的 那个 魔术数 怎么填?
我的代码从 udm搬到UD后。 读  0扇区(就恰好一个扇区)就卡死了。

目前 我用的的是 0xedde0d90

rawread(0x80, 0,0,0x200, 0x200*0x200,  0xedde0d90);
这样就卡住了。 (经调试,boot设备是0x80)

点评

rawread原型 这个buf是一个内存地址,你0x200*0x200是什么意思? write是读写标志. 用grub4dos.h的话可以使用GRUB_READ或GRUB_WRITE 最新版的grub4dos.h在这里 https://raw.githubusercontent.com/chenall/gr  详情 回复 发表于 2015-2-28 10:17
回复

使用道具 举报

266#
发表于 2015-2-28 11:29:36 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-28 15:43 编辑

反应个现象,不知算不算BUG。
如果对U盘启动的ud 执行 geometry --lba1sector
后面读盘就死翘翘了。
先确认hd启动,不是fd。

  1. geometry --lba1sector (128)
  2. dd  if=(128)0+1  of=(md)0x200+1
复制代码

就死翘翘了。


没有geometry --lba1sector
  1. dd  if=(128)0+1  of=(md)0x200+1
复制代码

就没问题。


Ver: grub4dos-0.4.6a-2015-01-18.7z

实例fba: 2015-0118.fba.zip (165.92 KB, 下载次数: 15)

qemu  模拟器中没问题。
实际U盘,在我的新旧2台机器上都是  死翘翘 。--------------急
回复

使用道具 举报

267#
发表于 2015-2-28 11:30:58 | 显示全部楼层
chenall 发表于 2015-2-28 10:17
rawread原型,
看原型应该很容易理解的,drive设备号,sector扇区号,byte_offset偏移,byte_len要读写的字 ...

这么重要的东东,还是放在首页吧(链接)。
回复

使用道具 举报

268#
发表于 2015-2-28 15:38:53 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-28 15:40 编辑

着急:
UD上 geometry --lba1sector 的问题。
914#

点评

貌似着急也没用。你的主板 bios 不允许按单扇区读盘,你又有了新发现。祝贺。同时你分享给大家,大家也都能增加这样的知识。 当你发现更多类似的现象时,你的视野也就更开阔了,理解力也就进一步加强了。世上大概  详情 回复 发表于 2015-2-28 16:51
回复

使用道具 举报

269#
发表于 2015-2-28 17:09:28 | 显示全部楼层
不点 发表于 2015-2-28 16:51
貌似着急也没用。你的主板 bios 不允许按单扇区读盘,你又有了新发现。祝贺。同时你分享给大家,大家也都 ...

不是主板 不支持。支持的。
只是用了UD后才出了妖蛾子。

以前一直用UDm, 不是UD, --lba1sector (128)一直用的好好的。
否则早就发现了。

最近做UD版, 同样的代码,才发现这个幺蛾子。


反复实验, 发现只有一种方式可以的。
  1. calc *0x82A0=128
  2. geometry --lba1sector
  3. dd  if=(128)0+1  of=(md)0x200+1
复制代码


要的
1) 要用calc *0x82A0=128
root (128)不行的。

2)geometry --lba1sector  不能带dev
不能是  geometry --lba1sector  (128)

-----------------
这么奇怪,像是软件问题啊。否则 "root (128)不可以,calc *0x82A0=128“  "geometry --lba1sector 不带dev才可以"都说不过去的。
好像是UD混乱了。


回复

使用道具 举报

270#
发表于 2015-2-28 20:07:36 | 显示全部楼层
本帖最后由 mdyblog 于 2015-3-1 10:33 编辑
不点 发表于 2015-2-28 18:24
从 ud 启动后,直接进入 grldr,此时会混乱吗?

有多少个机器会出现混乱?


1:从 ud 启动后,直接进入 grldr,此时会混乱吗
---------------
就是 ud 直接进入 grldr,
见 示例fba。  (fba不支持我的UDM扩展UD。我用的是标准UD测试的)

再在命令行 输入上面的命令。



2:有多少个机器会出现混乱?
我这就2台机器能USB启动, 都出这种 UD 幺蛾子。



3:是不是由于你的部署方式太奇特了(这一点你自己最清楚),因而造成混乱?
----------------
我是用的部署方法发现问题的。
为了方便交流。 上面的测试都是用标准UD。就是用J大的FBT。
为了说明是标准UD,我上面还附上了测试的FBA文件。


4:0.4.5 有问题吗?(前面问过的,没有得到答复)
----------------
我等会儿再补上。(干嘛要测这么多版本,挺烦的,难道不能就做好一个版本,并维护好.大家始终向都一个版本看齐。节省劳动,提高效率)

补上了。 grub4dos-0.4.5c-2015-02-09.7z
效果和0.46a一样。


5:以上这几个问题,是想帮你定位问题的根源,不是让你回答的。你自己有测试环境,因此你可以找毛病。最好是死活都找不出原因,那样你就有更多的机会去折腾了,折腾的结果会让你的电脑技术得到大大加强。
-----------------------
我却相反。
我只是希望尽快解决问题。至于提高“电脑技术”,已经不再是我的关注了。(每个人有自己的关注点,否则一事无成)
如果有人能解决,我就不折腾了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-1 18:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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