![프로그램이 커널 공간에서 실행되고 있는지 아니면 사용자 공간에서 실행되고 있는지 확인하는 방법은 무엇입니까?](https://linux55.com/image/122792/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4%20%EC%BB%A4%EB%84%90%20%EA%B3%B5%EA%B0%84%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EA%B3%A0%20%EC%9E%88%EB%8A%94%EC%A7%80%20%EC%95%84%EB%8B%88%EB%A9%B4%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EA%B3%B5%EA%B0%84%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EA%B3%A0%20%EC%9E%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 처음부터 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은 아님).