我正在构建一个自定义initramfs映像,我将其构建为Linux内核(3.2)中的CPIO存档.
我遇到的问题是无论我尝试什么,内核似乎都不会尝试从initramfs运行.
我在CPIO档案中的文件:
cpio -it < initramfs.cpio
.
init
usr
usr/sbin
lib
lib/libcrypt.so.1
lib/libm.so
lib/libc.so.6
lib/libgcc_s.so
lib/libcrypt-2.12.2.so
lib/libgcc_s.so.1
lib/libm-2.12.2.so
lib/libc.so
lib/libc-2.12.2.so
lib/ld-linux.so.3
lib/ld-2.12.2.so
lib/libm.so.6
proc
sbin
mnt
mnt/root
root
etc
bin
bin/sh
bin/mknod
bin/mount
bin/busybox
sys
dev
4468 blocks
Run Code Online (Sandbox Code Playgroud)
Init很简单,应该只是初始化设备并生成一个shell(现在):
#!/bin/sh
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
/bin/busybox --install -s
exec /bin/sh
Run Code Online (Sandbox Code Playgroud)
在内核.config我有:
CONFIG_INITRAMFS_SOURCE="../initramfs.cpio"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=32768
Run Code Online (Sandbox Code Playgroud)
内核构建和uImage大小取决于initramfs大小,因此我知道图像正在打包.但是我在启动时得到了这个输出:
console [netcon0] enabled
netconsole: network logging started
omap_rtc omap_rtc: setting …Run Code Online (Sandbox Code Playgroud) 我收到一条消息,打印出在 ARM 平台上运行的 Linux 应用程序 (Qt C++):
未知的 HZ 值!(108) 假设 100。
此输出在不同的应用程序中定期显示,括号中的值不同。
当我从基于 glibc 的工具链切换到基于 eglibc 的工具链以构建应用程序、内核和文件系统时,它开始发生。
似乎没有造成任何不良影响,至少不是直接的。
谁能解释一下这是什么意思?
这是一个基于真实问题的虚构场景.如果我有一个基类:
class Vehicle
{
public:
void run() { incrementStuff(); }
virtual void incrementStuff() { }
};
Run Code Online (Sandbox Code Playgroud)
派生类:
class Car : public Vehicle
{
public:
Car() : Vehicle() { stuff = new StuffClass(); }
~Car() { delete stuff; stuff = NULL; }
virtual void incrementStuff() { if (stuff != NULL) stuff->increment(); }
protected:
StuffClass* stuff;
};
Run Code Online (Sandbox Code Playgroud)
然后说我有一个定期调用Vehicle :: run()的线程.我有另一个线程,最终删除指向汽车的指针.破坏的顺序将导致汽车首先被删除,然后是车辆.
如果线程(生活在Vehicle对象中)在析构函数在汽车中运行之后调用incrementStuff函数会发生什么(但显然在车辆被破坏之前)?是否会执行Car :: incrementStuff并尝试取消引用已删除的指针?或者将调用Vehicle :: incrementStuff哪个是安全的,什么都不做?
假设在Car ::〜Car()运行时线程无法调用Car :: incrementStuff(这是由互斥锁阻止的).
这段代码已被重构以避免这种情况,但我只是想知道是否有人可以阐明它是如何工作的,或者它是否只是简单的未定义行为?
更一般地说,如果我在Car被破坏之后但是在车辆出现之前尝试调用Car :: incrementStuff会发生什么?NULL检查是否有效,或者该内存是否已经解除分配并且现在可以被任何内容使用?或者,在基础对象被破坏之前,该内存是否已"释放"?