今天这篇进度比较差,但是也就只能这样继续努力debug。
首先先简介一下原本的进度,是要将initramfs => true rootfs这条路打通,正常来说,Alpine的initramfs希望作的事情是:
(1) 将 apkovl
的overlay透过overlayfs盖上userspace
(2) 然後使用apk-static将基础套件装到rw layer
(3) 紧接着如果有permanant stage的rootdev,才在最後盖上来。
但是对我们的usecase来说,这太复杂了。而且按照Alpine Init的逻辑,他的root
会跟kernel parameter冲突,其实这也代表它的预期流程是被kernel直接包套吃走的;为了避免每次都要重包kernel、且反正initramfs我们可以改,不如这样办吧:
直接hack掉permanent rootdev的detection,并且塞一个loopback file进去initramfs当作我们的real rootdev。
可是这样改时,会非常尴尬地遇上一个问题:
那就是Alpine Init是用swtich_root在作iniramfs => rootfs的交棒,而switch_root期待新旧皆为ramfs/tmpfs。
出於无奈,我们再次进行改动 — —
将原本的
exec /bin/busybox pivot_root $sysroot $chart_init "$KOPT_init" $KOPT_init_args
更改为
cd /sysroot
pivot_root . .
exec chroot . /sbin/openrc
然而此时,我们撞到了bus error:
[ 165.477801] openrc[82]: unhandled signal 7 code 0x2 at 0x95ad11ac in ld-musl-riscv32-sf.so.1[95ad4000+c7000]
[ 165.478835] CPU: 0 PID: 82 Comm: openrc Not tainted 5.10.7 #2
[ 165.479261] epc: 95b473dc ra : 95b556e0 sp : 9da494f0
[ 165.479607] gp : 95ad4000 tp : 95b9df28 t0 : 00000002
[ 165.479960] t1 : 0000d1d3 t2 : 00000007 s0 : 9da499a8
[ 165.480307] s1 : 0000d000 a0 : 95ad11ac a1 : 00000000
[ 165.480654] a2 : 00000e54 a3 : 00000fff a4 : fffff000
[ 165.481006] a5 : 00000000 a6 : 00000000 a7 : 000000de
[ 165.481355] s2 : 95ac5000 s3 : 00000000 s4 : 95ac5000
[ 165.481695] s5 : 000000a0 s6 : 00000000 s7 : 00000003
[ 165.482210] s8 : 00000004 s9 : 95b9ca6c s10: 0000d000
[ 165.482496] s11: 9da4955c t3 : 95b9c288 t4 : 00000000
[ 165.482757] t5 : 00000000 t6 : 00000020
[ 165.482968] status: 00004020 badaddr: 95ad11ac cause: 0000000f
Bus error
若单纯照字面解读, cause 0xf
代表着(AMO) store error,所以kernel判定是bus error。
但是此时我们还在QEMU上做事,这比较有可能发生的情形是、出於某些原因PC飞到了data segment去,而非真正的bus error。
而initramfs半残的状态下,我们还是先回shell来找找有没有比较小的测试可以看。
在乱try乱看的路上,我们发现了一组有趣的对照:
apk-static
可以正常运作,但是apk
不行,这个警讯整个让人警铃大响 — — dynamically linked 出bug了。
然而此时遇到了一个我还在想办法workaround掉的debug难点:seperated debug symbol。
在现代化的distro、为了方便distribute套件,会采用「先开启debug build、再objcopy出 debug symbol的elf stub、尔後strip target program」的手法,一般人安装时都是strip过的、尔後需要debug时去安装*-dbg
的套件。
想做实验的话,可以这样玩:
riscv32-linux-gcc -g3 -static ./hello_world.c -o hello_world
riscv32-linux-objcopy --only-keep-debug ./hello_world ./hello_world.debug
riscv32-linux-strip --strip-debug --strip-unneeded ./hello_world
qemu-riscv32 -g 1234 ./hello_world &
riscv32-linux-gdb -ex 'target remote localhost:1234' -ex 'symbol-file ./hello_world.debug'
But,就是这个but,目前我从我bootstrap的musl-dbg套件中捞出来的seperated debug file,是坏的Orz
下篇会来继续debug这个惨况QQ
<<: Day 0xF - Web ATM 内容?,测试模拟交易回传资讯
三十天很快要到了尾声了,今天要来介绍 The Twelve-Factor App(下称 12 Fac...
这学期我加入了学校的实验室,而学长给我们的第一个作业呢,就是要我们去了解到基本网页架构是怎麽形成的,...
中介软件为组成应用程序管线的软件,用以处理要求与回应, .net core中定义的中介则可以说是用来...
今天我们来认识一个相当常使用的 hook: useState。 语法 const [currentV...
哈罗大家好,我是黄奇昌 我就读岭东科技大学视觉传达设计系 今年是第一次参加13th铁人赛,想跟大家好...