无忧启动论坛

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

[求助] 批处理引导linux内核出错

  [复制链接]
1#
发表于 2017-4-7 18:26:48 | 显示全部楼层
回复

使用道具 举报

2#
发表于 2017-4-7 21:52:59 | 显示全部楼层
使用 test 里面的批处理,与命令行输入,没有变化,都是启动到:

IMG_20170407_214440.jpg (2.93 MB, 下载次数: 186)

IMG_20170407_214440.jpg
回复

使用道具 举报

3#
发表于 2017-4-7 22:17:50 来自手机 | 显示全部楼层
cpu是64位的,操作系统是33位的。不知道是不是仿真器QEMU不支持。
回复

使用道具 举报

4#
发表于 2017-4-7 22:48:19 来自手机 | 显示全部楼层
是楼主fb自带的虚拟机。
回复

使用道具 举报

5#
发表于 2017-4-7 22:50:11 来自手机 | 显示全部楼层
其他虚拟机不知如何加载fba文件。
回复

使用道具 举报

6#
发表于 2017-4-10 09:28:38 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-4-10 09:30 编辑

kernel 函数,可以在菜单、命令行运行。但是不可以在 !BAT 批处理文本中运行。
在菜单及命令行,函数是解析一条执行一条。
在 !BAT 批处理文本中,猜测可能是为了跳转等功能,函数是一次性全部解析完毕,各函数起始位置放置在指针数组内。执行kernel 函数后,指针数组被破坏,因此后续函数没法继续运行。
回复

使用道具 举报

7#
发表于 2017-4-10 12:19:40 来自手机 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-4-10 12:41 编辑
经测试kernel放在批处理里面没问题,是执行initrd命令后出问题。
kernel与批处理都占用24Mb区域内存。kernel执行后,覆盖了批处理的数组指针,使得initrd无法执行。
这是我跟踪测试的结果。

我以前以为,内置的内存管理使用8-13Mb区域的内存。经过跟踪测试才知道,内置的内存管理使用24Mb以上的内存。
回复

使用道具 举报

8#
发表于 2017-4-10 14:33:59 | 显示全部楼层
请教不点,page_map_start 在 10M 处,原计划是用来作什么的?
回复

使用道具 举报

9#
发表于 2017-4-10 17:58:20 来自手机 | 显示全部楼层
知道了
回复

使用道具 举报

10#
发表于 2017-4-11 08:16:19 | 显示全部楼层
可惜没有64位环境。不然的话,可以试一试问题定位。
回复

使用道具 举报

11#
发表于 2017-4-13 09:44:00 | 显示全部楼层
请 jianliulin 测试一下,似乎可以在批处理文件中运行 kernel 函数。

grldr.rar

160.68 KB, 下载次数: 1, 下载积分: 无忧币 -2

回复

使用道具 举报

12#
发表于 2017-4-13 19:51:29 来自手机 | 显示全部楼层
那么现在的改动是不是没有意义?
回复

使用道具 举报

13#
发表于 2017-4-21 08:55:47 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-4-21 08:58 编辑
然而,我写的 mem64 汇编语言函数,竟然是无效的

现在可以使用了。4Gb以下内存我测试可以移动及填充。4Gb以上内存我没有测试环境,不知如何。请有条件的网友帮忙测试。

无效的原因源自:
  1. movl        %esp, %ebp                # clear upper 32-bit of %rbp
复制代码


估计 esp 由于以下语句改变了值:
  1. ljmp        $32, $ABS(1f)                # ljmp to enter 64-bit mode
  2.         .code64
  3. 1:
复制代码

现在修改为:
  1. addl $0, %ebp
复制代码

经测试,不加这句也能正常工作。

grldr.rar

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

点评

同样的测试环境,引导ud中的内核成功,引导尾续在批处理后面的内核失败 如图 [attachimg]345235[/attachimg] [attachimg]345236[/attachimg]  详情 回复 发表于 2017-4-21 14:59
超级强悍!此问题终于被你俘虏!我没测试环境,但应该是解决了。以下是我的分析、思考。 mem64 函数的开头,是这样的: 可以看到,在 ebp 被赋值以后,又执行了三条 push 指令,这就隐含地改变了 esp 的值!这  详情 回复 发表于 2017-4-21 12:30
回复

使用道具 举报

14#
发表于 2017-4-21 12:38:43 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-4-21 14:37 编辑

ljmp        $32, $ABS(1f)
其中 $32 是什么意思?是段因子?

点评

看这段 “全局描述符表” 的定义: 其中的 /*32*/ 处,就是关于 64 位 long_mode 的代码段的描述。 当 ljmp $32, $ABS(1f) 这条指令执行的时候,CPU 仍旧处于 32 位保护模式。它执行的结果,就是实实在在地  详情 回复 发表于 2017-4-21 16:54
回复

使用道具 举报

15#
发表于 2017-4-21 15:13:38 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-4-21 15:30 编辑

现在只是 mem64 函数可以使用了。引导尾续在批处理后面的内核没有改进。

经测试,movl %ebp, %ebp 或者 addl $0, %ebp 都可以清除 rbp 的高32位。
movl %ebp, %ebp 编译后少一个字节。

点评

搞清楚了就好。其实,还得测试 AMD 和 Intel 两个厂家的 CPU 才行,而不能只测试其中一家。 grub4dos 迄今为止的代码,全都同时适用于 AMD 和 Intel。就连进入 64 位以后的操作,也都有意避免了那些有差异的部分  详情 回复 发表于 2017-4-21 17:13
回复

使用道具 举报

16#
发表于 2017-4-21 17:24:00 来自手机 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-4-21 17:39 编辑

明白了。谢谢。

movl  %ebp, %ebp
orl    %ebp, %ebp
andl   %ebp, %ebp
都是3字节指令。
回复

使用道具 举报

17#
发表于 2017-4-21 17:49:26 | 显示全部楼层
同样的测试环境,引导ud中的内核成功,引导尾续在批处理后面的内核失败

最好能给出调用尾续批处理的语句,便于分析是哪个函数引起内存冲突。
同时给一个简易的引导尾续批处理的 grldr。我会移植压缩菜单到新的 grldr.

点评

我是按C进入命令行后,直接执行批处理的,没有使用到grldr的菜单功能。 批处理内容如下,其中vmlinuz-4.10.4-1.el7.elrepo.x86_64,initramfs-4.10.4-1.el7.elrepo.x86_64.img是尾续在此批处理中: !BAT  详情 回复 发表于 2017-4-22 08:45
回复

使用道具 举报

18#
发表于 2017-4-22 11:19:31 | 显示全部楼层
其实,还得测试 AMD 和 Intel 两个厂家的 CPU 才行

movl %ebp, %ebp
在 AMD 和 Intel 两个厂家的 CPU 测试,证明可以清除 rep 的高32位.

点评

好的,这就可以放心地使用 movl %ebp, %ebp 了。先前你证明了 add 指令也能够清除寄存器的高 32 位。而 or 和 and 指令,还没有证明过。如果以后有机会,最好都能证明一下,这样将来说不定啥时候就能用上了。甚至还  详情 回复 发表于 2017-4-24 00:27
现在mem64可用的话 优先用mem64启动大于4G的内存吧 顺便usb --init这几天频繁发生这个检测到USB设备但是没有进度条的问题  详情 回复 发表于 2017-4-23 21:07
回复

使用道具 举报

19#
发表于 2017-4-24 18:27:10 | 显示全部楼层
orl %ebp, %ebp
andl %ebp, %ebp
在 AMD 和 Intel 两个厂家的 CPU 测试,证明可以清除 rep 的高32位.

test %ebp, %ebp
在 AMD 和 Intel 两个厂家的 CPU 测试,证明不能清除 rep 的高32位.

PAE分页到底可以支持多大内存,从网上没有查到准确信息。很早的帖子说是64GB。

karyonix 的代码有点特殊。没有采用常规的连续分页方法,而是采用分段方法。
每次填写分页表,修改虚拟地址为固定的16MB及32MB,读8MB长度。特点是分页表只使用了12KB,速度相对慢些。不使用64位代码。

不点采用连续分页方法,读512GB使用了2MB多分页表。可以直接读任意地址及长度。可以适用于多任务操作系统,各任务在自己的分页内运行,互不干扰。

实际上,从32位代码跳转到在64位代码,可以使用 %ebp而不使用%rbp(其高32位为零),就不会出问题了。

点评

扩展后的 PAE 支持很大的内存。你可以写个测试程序,看看 karyonix 的代码能否读写 64G 以上的内存。我估计没问题。另外,如果 karyonix 的代码能够处理 64G 以上的内存,(根据你提供的分页方面的信息)那就能够处  详情 回复 发表于 2017-4-24 18:47
回复

使用道具 举报

20#
发表于 2017-4-24 19:42:22 来自手机 | 显示全部楼层
可惜我的内存只有2Gb

点评

不是你自己测试,你可以让网友测试。你只需要告诉测试步骤即可。  详情 回复 发表于 2017-4-24 19:45
回复

使用道具 举报

21#
发表于 2017-4-24 19:48:44 来自手机 | 显示全部楼层
哪位网友有大于64Gb的内存,帮忙试一试。

点评

本区的人估计都没有64G内存的机子 测试的话甚至可能要128GB内存 还有就是测试用的程序或者批处理  详情 回复 发表于 2017-4-24 20:26
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-3 09:43

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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