init実行可能ファイルからフレームバッファを初期化する方法は?

init実行可能ファイルからフレームバッファを初期化する方法は?

システムをできるだけベアカーネルに近づける必要がある「最小のLinux」実験があるため、PID 1で実行されるinitシャットダウン、再起動、およびコンソール初期化を実行する方法を知っています。initこれは時間であり、フレームバッファを初期化または実行するスクリプトがあります。私はLinuxについて非常によく知っていますが、非常に小さなinit初期化コンソールをprintf3回実行して終了する以外にインターネットに書き込む情報はありません(協会init)と終了/再開の問題に対するPythonの問題(協会)。私にとって必要なのは、フレームバッファの初期化に役立ちます。私の現在のコードは次のとおりです。

int init_main(int argc, char **argv)
{
    // PID handler
    if (getpid() != 1)
    {
pidn1:  if (getppid() == 1)
        {
            execl("/sbin/initrq", "-i" 0);
            return;
        }
    }
    reboot(RB_DISABLE_CAD);
    // Console initialization
    int onefd = open("/dev/console", O_RDONLY, 0);
    dup2(onefd, 0); // stdin
    int twofd = open("/dev/console", O_RDWR, 0);
    dup2(twofd, 1); // stdout
    dup2(twofd, 2); // stderr
    if (onefd > 2) close(onefd);
    if (twofd > 2) close(twofd);
    // Print a message
    printf("CUSTOM LINUX INIT\nNo framebuffer init\n");
    // Run initrq.
    fork() // This forked copy will not be PID 1, so that receives an execl("/sbin/initrq", 0)
    if (getpid() != 1) goto pidn1; // Fork behavior independency
    // Create shutdown/reboot agent FIFO
    int fifofd = mkfifo("/etc/cinit-rs", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | IWOTH);
    uint8_t buf[2];
    // Main loop
    for (;;)
    {
        if (read(fifofd, buf, 2) < 2)
        {
            sleep(1);
            continue;
        }
        if (buf[0] == 0x4A)
        {
            if (buf[1] == 0xF0)
            {
                init_shutdown(0);
            }
            if (buf[1] == 0xFF)
            {
                init_shutdown(1);
            }
        }
    }
}
void init_shutdown(int rscmd)
{
    execl("/sbin/initrq", rscmd ? "-r" : "-s", 0);
}

明確にしますinitrq。特定のメソッド(そのメソッドは実装で定義されています)initrqを使用して定義されたスクリプトを実行するプロセスです。受信すると、起動スクリプトが実行されます。または を受け取ると、終了スクリプトを実行し、それぞれかどうかによって終了または再起動します。initinitrqinitrq-iinitrq-s-r-s-r

ベストアンサー1

おすすめ記事