现象:
开机后,应用启动阻塞30秒,直到random: crng init done之后才能继续运行。
原因:
追查发现是由于getrandom后,进入系统调用SYSC_getrandom:
SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
unsigned int, flags)
{
if (flags & ~(GRND_NONBLOCK|GRND_RANDOM))
return -EINVAL;
if (count > INT_MAX)
count = INT_MAX;
if (flags & GRND_RANDOM)
return _random_read(flags & GRND_NONBLOCK, buf, count);
if (!crng_ready()) {
if (flags & GRND_NONBLOCK)
return -EAGAIN;
crng_wait_ready(); //*******************此时因为熵池未满而阻塞***************
if (signal_pending(current))
return -ERESTARTSYS;
}
return urandom_read(NULL, buf, count, NULL);
}
理论上urandom_read不需要等待crng_wait_ready,解决方式为将crng_ready条件修改为crng_init > 0:
#if CRNG_READY_0
#define crng_ready() (likely(crng_init > 0))
#else
#define crng_ready() (likely(crng_init > 1))
#endif