프로그램이 커널 공간에서 실행되고 있는지 아니면 사용자 공간에서 실행되고 있는지 어떻게 확인합니까?

프로그램이 커널 공간에서 실행되고 있는지 아니면 사용자 공간에서 실행되고 있는지 어떻게 확인합니까?

저는 처음부터 Linux OS를 만들고 있었습니다. 나는 우연히 만났다이것Linux 커널이 부팅되면 hello world를 인쇄하는 최소한의 Linux OS를 만드는 기사입니다.

그래서 내 질문은, helloworld 프로그램이 어느 공간(커널 또는 사용자 공간)에서 실행되고 있습니까? 내 양심은 커널 공간을 말하고 있는데 어떻게 사용자 공간에서 실행되도록 만들 수 있습니까?

긴 기사를 읽고 싶지 않은 사람들을 위해 여기에서는 간단히 설명합니다.

  • USB 플래시 드라이브[Linux 시스템의/dev/sdb]를 ext4 파일 형식으로 포맷했습니다.
  • /mnt/mylinux 폴더에 마운트했습니다.
  • 그 안에 /boot 및 /bin 폴더가 생성되었습니다.
  • /boot 폴더에 Linux 커널 [Github 소스 코드에서 컴파일했습니다.] bzImage 사본을 배치했습니다.
  • /dev/sdb의 /boot 폴더에 grub2를 설치하고 init 프로그램을 지정하기 위해 grub.cfg 파일을 생성했습니다.

내 초기화 프로그램.

#include <stdio.h>
#include <unistd.h>

int main(void){
    while(1){
        printf("Hello World\n");
        sleep(1);
    }
}

내 초기화 프로그램은 정적으로 컴파일되어 /bin 폴더에 배치됩니다.

따라서 이 드라이브를 부팅하면 인쇄가 시작됩니다. Hello World

여기에 이미지 설명을 입력하세요

답변1

귀하의 경우에는 사용자 공간입니다. 표준 라이브러리를 사용하므로 사용자 공간 API를 사용하여 작업을 수행합니다.

프로그램이 커널에 의해 실행된 경우 내부 커널 API(즉, kprintf)만 있고 수행할 수 있는 작업에 대한 많은 제한이 있습니다. 추가적으로 커널에 넣거나 커널 모듈로 넣어야 합니다. 커널은 외부 코드를 커널 공간으로 실행하지 않습니다.

참고: 하이브리드 사례가 있지만 커널을 차단하지 않고 오래 지속되는 프로세스를 위해 항상 커널에 의해 시작됩니다. 이 경우 코드는 스케줄러에 의해 처리되며 프로세스 목록에 표시됩니다(일반적으로 낮은 PID 번호이지만 1은 아님).

관련 정보