프로그램이 커널 공간에서 실행되고 있는지 아니면 사용자 공간에서 실행되고 있는지 확인하는 방법은 무엇입니까?

프로그램이 커널 공간에서 실행되고 있는지 아니면 사용자 공간에서 실행되고 있는지 확인하는 방법은 무엇입니까?

저는 처음부터 Linux 운영 체제를 만들고 있습니다. 내가 만난이것기사에서는 Linux 커널이 부팅되면 간단히 hello world를 인쇄하는 최소한의 Linux 운영 체제를 만듭니다.

그래서 내 질문은, 그러한 helloworld 프로그램이 어느 공간(커널 또는 사용자 공간)에서 실행되는지입니다. 양심은 커널 공간이라고 하는데 어떻게 사용자 공간에서 실행되게 할 수 있을까요?

긴 기사를 읽고 싶지 않은 사람들을 위해 여기서 진행되는 내용은 간단합니다.

  • USB 플래시 드라이브[Linux 시스템의 경우/dev/sdb]를 ext4 파일 형식으로 포맷했습니다.
  • /mnt/mylinux 폴더에 설치하세요.
  • 거기에 /boot 및 /bin 폴더를 만듭니다.
  • Linux 커널 사본 [Github 소스에서 컴파일했습니다. ] bzImage는 /boot 폴더에 위치합니다.
  • /dev/sdb의 /boot 폴더에 grub2를 설치하고 grub.cfg 파일을 생성하여 초기화 프로그램을 지정했습니다.

내 초기화 프로그램.

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

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

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

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

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

답변1

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

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

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

관련 정보