jianliulin 发表于 2017-4-7 08:55:53

批处理引导linux内核出错

本帖最后由 jianliulin 于 2017-4-7 09:05 编辑

title 启动CentOS-7.3中文版
kernel (ud)/boot/centos/vmlinuz-4.10.4-1.el7.elrepo.x86_64 root=UUID='ddf344343-dsds-dsd9sdsd'ro crashkernel=auto rhgb quiet LANG=zh_CN.UTF-8
initrd (ud)/boot/centos/initramfs-4.10.4-1.el7.elrepo.x86_64.img

或直接在命令行输入均可以启动linux。


===========================================================
如果转为批处理则出错,屏幕显示很多乱码

!BAT
kernel (ud)/boot/centos/vmlinuz-4.10.4-1.el7.elrepo.x86_64 root=UUID='ddf344343-dsds-dsd9sdsd'ro crashkernel=auto rhgb quiet LANG=zh_CN.UTF-8
initrd (ud)/boot/centos/initramfs-4.10.4-1.el7.elrepo.x86_64.img


======================================================================
再改为如下批处理,执行后接着在命令行输入:initrd (ud)/boot/centos/initramfs-4.10.4-1.el7.elrepo.x86_64.img 也会成功启动。所以可以确定是在initrd 阶段出了问题。

!BAT
kernel (ud)/boot/centos/vmlinuz-4.10.4-1.el7.elrepo.x86_64 root=UUID='ddf344343-dsds-dsd9sdsd'ro crashkernel=auto rhgb quiet LANG=zh_CN.UTF-8





附:
vmlinuz-4.10.4-1.el7.elrepo.x86_64 大小:6M
initramfs-4.10.4-1.el7.elrepo.x86_64.img 大小:28M

2011yaya2007777 发表于 2017-4-7 18:26:48

不能下载呀

jianliulin 发表于 2017-4-7 20:42:03

2011yaya2007777 发表于 2017-4-7 18:26
不能下载呀

链接: http://pan.baidu.com/s/1geDa05H 密码: c2ni

2011yaya2007777 发表于 2017-4-7 21:52:59

使用 test 里面的批处理,与命令行输入,没有变化,都是启动到:

jianliulin 发表于 2017-4-7 21:59:32

本帖最后由 jianliulin 于 2017-4-7 22:02 编辑

这是64位的内核,需要64位的cpu,图中还没执行到initrd 阶段

2011yaya2007777 发表于 2017-4-7 22:17:50

cpu是64位的,操作系统是33位的。不知道是不是仿真器QEMU不支持。

不点 发表于 2017-4-7 22:34:59

2011yaya2007777 发表于 2017-4-7 22:17
cpu是64位的,操作系统是33位的。不知道是不是仿真器QEMU不支持。

现在哪还有 32 位的 CPU?肯定都是 64 位的了。

我试过,在 32 位的 XP 之下,qemu 可以支持 64 位的 Guest 操作系统。

你需要运行 qemu-system-x86_64 而不是 qemu-system-i386。

2011yaya2007777 发表于 2017-4-7 22:48:19

是楼主fb自带的虚拟机。

2011yaya2007777 发表于 2017-4-7 22:50:11

其他虚拟机不知如何加载fba文件。

jianliulin 发表于 2017-4-7 22:58:29

2011yaya2007777 发表于 2017-4-7 22:50
其他虚拟机不知如何加载fba文件。

fbinsttool 自带的qemu当初只为了测试grldr,找了一个体积小,似乎只支持i368;需要把fba恢复到U盘再测试。

求道者 发表于 2017-4-8 11:13:51

jianliulin 发表于 2017-4-7 22:58
fbinsttool 自带的qemu当初只为了测试grldr,找了一个体积小,似乎只支持i368;需要把fba恢复到U盘再测试 ...

搞img吧
长痛不如短痛啊

求道者 发表于 2017-4-8 11:19:20

不点 发表于 2017-4-7 22:34
现在哪还有 32 位的 CPU?肯定都是 64 位的了。

我试过,在 32 位的 XP 之下,qemu 可以支持 64 位的...

说起来奔腾四就有64位的支持了吧
再早些才只有纯32位吧

2011yaya2007777 发表于 2017-4-10 09:28:38

本帖最后由 2011yaya2007777 于 2017-4-10 09:30 编辑

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

jianliulin 发表于 2017-4-10 10:09:54

2011yaya2007777 发表于 2017-4-10 09:28
kernel 函数,可以在菜单、命令行运行。但是不可以在 !BAT 批处理文本中运行。
在菜单及命令行,函数是解 ...

经测试kernel放在批处理里面没问题,是执行initrd命令后出问题。

不点 发表于 2017-4-10 11:40:56

我来说说这个问题。启动 Linux,很可能与批处理互相冲突。

尽量避免这样使用。

我不知道能不能避免在批处理里面启动 Linux,如果能避免的话,就不用折腾了。

就是说,批处理功能与 Linux 的启动,两者存在冲突。

初步想了一下,你可以用一个菜单去启动 Linux,大概用 configfile 命令即可做到吧,我想。

jianliulin 发表于 2017-4-10 11:59:09

如果比较难处理那就不用搞了,我最初的目的是想把vmlinuz和initramfs尾续到批处理,这样一个文件就能启动centos,

2011yaya2007777 发表于 2017-4-10 12:19:40

本帖最后由 2011yaya2007777 于 2017-4-10 12:41 编辑

经测试kernel放在批处理里面没问题,是执行initrd命令后出问题。kernel与批处理都占用24Mb区域内存。kernel执行后,覆盖了批处理的数组指针,使得initrd无法执行。
这是我跟踪测试的结果。

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

不点 发表于 2017-4-10 13:41:37

yaya 可以考虑优化批处理,也优化 malloc 等函数。主要就是内存冲突引起的。

kernel 固定加载在 32M 处,而此处的内存,却被批处理以及 grub4dos 的外部命令占据。

所以,kernel 执行以后,就不可以再执行任何外部命令以及批处理了,否则,一定是破坏了已经加载的 kernel 代码和数据。

续尾本来就不是一个正儿八经的办法,又碰上 kernel 和 initrd 这个庞然大物,就出问题了。

我不主张对 grub4dos 进行大修。能节约点精力,尽量节约,少做这些不怎么重要的工作。

BIOS 被淘汰之后,这些工作就全部失去意义了。努力是不值得的。



jianliulin 发表于 2017-4-10 14:29:58

我都觉得grub4dos就是因为这样那样奇葩的功能集合在一起大家才喜欢用它

2011yaya2007777 发表于 2017-4-10 14:33:59

请教不点,page_map_start 在 10M 处,原计划是用来作什么的?

不点 发表于 2017-4-10 17:50:11

2011yaya2007777 发表于 2017-4-10 14:33
请教不点,page_map_start 在 10M 处,原计划是用来作什么的?

grub4dos 要支持访问 4G 以上的内存空间。然而,4G 以上内存空间的访问,需要页映射,而不是像 4G 以内那样,仅仅通过 cpu 指令、地址前缀 0x66,0x67 即可实现。

既然需要页映射,就得有页面空间。这个页面空间所起的作用很简单,不过就是恒等映射而已。page_map_start 开始的几个 M 的空间,就是用于页映射。

然而,我写的 mem64 汇编语言函数,竟然是无效的。我印象当初是测试有效的,怎会后来无效了呢?我至今很疑惑。我也离开开发队伍了,也不感兴趣了,同时也确实没什么精力和能力了,所以,也就不能去排除 bug 了。

既然我写的 mem64 函数无效,那么 page_map_start 开始的那个页空间,也就可能是没用的。karyonix 写了新的函数来处理高于 4G 的内存访问。我不知道 karyonix 是否采用了 page_map_start 开始的页面空间。假如 karyonix 不使用这个页面空间的话,那么这个空间是可以挪作它用的。

最好不要挪作他用。karyonix 的内存处理是用 PAE,我的 mem64 汇编代码是用 64 位指令,两种方法是不一样的。64 位指令的效率应该更高一些。当 PAE 失效时,会尝试采用 mem64,因此,mem64 也是有用的。这个 mem64 目前是有 bug 的,是失效的。但假如将来有人捉住了 mem64 的 bug,那时,还是需要 page_map_start 这个页面空间的。

2011yaya2007777 发表于 2017-4-10 17:58:20

知道了

不点 发表于 2017-4-10 18:15:51

2011yaya2007777 发表于 2017-4-10 17:58
知道了

再补充一点。karyonix 的内存函数,我不太清楚究竟能够处理多大内存。我猜有可能是 64G 内存。我的 mem64 函数(如果排除了 bug 的话),可以处理 512G 内存。而且,假如扩大页映射的空间,还可以支持更大内存。因此,如果 grub4dos 还要继续开发下去的话,那就应该找出 bug,让 mem64 真正发挥作用。

2011yaya2007777 发表于 2017-4-11 08:16:19

可惜没有64位环境。不然的话,可以试一试问题定位。

不点 发表于 2017-4-11 08:50:19

2011yaya2007777 发表于 2017-4-11 08:16
可惜没有64位环境。不然的话,可以试一试问题定位。

没关系,4G 以内照样可以试验。

mem64 即使是访问 4G 以内的空间,都失败了。连访问 1M 以内的常规内存都失败了。我怀疑是某个补丁造成的。问题出得很早,现在很难知道具体是什么原因。只要能访问常规内存,就成功了。

求道者 发表于 2017-4-11 09:14:33

2011yaya2007777 发表于 2017-4-11 08:16
可惜没有64位环境。不然的话,可以试一试问题定位。

我那板子的内存贼鸡儿便宜 双十一的时候记得是15块4g内存 amd专用条

2011yaya2007777 发表于 2017-4-13 09:44:00

请 jianliulin 测试一下,似乎可以在批处理文件中运行 kernel 函数。

jianliulin 发表于 2017-4-13 10:51:43

本帖最后由 jianliulin 于 2017-4-13 11:07 编辑

2011yaya2007777 发表于 2017-4-13 09:44
请 jianliulin 测试一下,似乎可以在批处理文件中运行 kernel 函数。




晚上再测试下实机,目前是qemu测试。

只引导内核,正常菜单,可以进入到shell:




尾续批处理,不能进入到shell,卡在这里:




jianliulin 发表于 2017-4-13 11:08:00

2011yaya2007777 发表于 2017-4-13 09:44
请 jianliulin 测试一下,似乎可以在批处理文件中运行 kernel 函数。

不尾续,批处理了只写命令,可以进入到shell,晚上再实机测试看看。

jianliulin 发表于 2017-4-13 18:54:16

实机测试,不尾续内核就可以引导成功。
页: [1] 2
查看完整版本: 批处理引导linux内核出错