시스템을 가능한 한 베어 커널에 가깝게 만들어야 하는 "최소 Linux" 실험이 있으므로 매 PID 1에서 실행되는 init
종료, 재부팅 및 콘솔 초기화를 수행하는 방법을 알고 있습니다. init
시간이며 프레임 버퍼를 초기화하거나 이를 수행하는 스크립트가 있습니다. 저는 리눅스에 대해 매우 잘 알고 있지만 init
아주 작은 초기화 콘솔을 printf
3번 실행하고 종료하는 것 외에는 인터넷에 쓸 정보가 없습니다 (협회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
를 사용하여 정의된 스크립트를 실행하는 프로세스입니다 . 수신 되면 시작 스크립트가 실행됩니다. 또는 을 수신 하면 종료 스크립트를 실행한 다음 각각 또는인지 여부에 따라 종료되거나 다시 시작됩니다.init
initrq
initrq
-i
initrq
-s
-r
-s
-r