표준 C 라이브러리는 기본적으로 Linux의 메인 메모리에 로드됩니까?

표준 C 라이브러리는 기본적으로 Linux의 메인 메모리에 로드됩니까?

대부분의 Linux 커널은 C로 작성되었기 때문에 커널이 메인 메모리에 로드되면 표준 C 라이브러리도 Linux 커널과 함께 로드됩니까?

이것이 C로 작성된 프로그램이 다른 프로그램보다 메모리를 덜 소비하는 이유라면 표준 C 라이브러리가 이미 로드되어 있기 때문에 Linux 시스템에서 실행할 때 다른 언어로 작성된 프로그램보다 더 빠릅니다(페이지 폴트가 적음).

답변1

커널은 C로 작성되었지만 C 라이브러리(예:데이브 톰슨_085"라고 지적했다.떨어져 있는"). 이렇게 하더라도 커널에서 사용하기 위해 커널과 함께 로드된 C 라이브러리는 커널에서만 사용됩니다(커널이 어떻게든 사용자 공간에 명시적으로 액세스할 수 있도록 만들지 않는 한). 메모리 요구 사항.

즉, 대부분의 경우 가장 오래된 프로그램은 커널 부팅 후에 실행됩니다(initramfs에 있는 프로그램은 자체 C 라이브러리 복사본을 사용하지만 결국에는 initC 라이브러리를 사용하므로 결국에는 초기에는 널리 사용되는 라이브러리 부품이 항상 물리적 메모리에 남아 있을 가능성이 높습니다.

커널에는 다음 구현이 포함되어 있습니다.많은 C 라이브러리 함수또는 변형(예:printk대신 printf); 하지만 모두가 표준을 정확하게 따르지는 않습니다. 경우에 따라 C 라이브러리 함수 구현번역가대신 사용됩니다.

(C 이외의 언어로 작성된 대부분의 프로그램은 궁극적으로 C 라이브러리를 사용합니다.)

답변2

표준 C 라이브러리는 기본적으로 Linux의 메인 메모리에 로드됩니까?

아니요.

커널에 의해 시작된 첫 번째 사용자 공간 프로세스는 이라고 불리며 init, 그 목적은 다른 모든 프로세스를 시작하고 좀비 하위 프로세스(부모 프로세스가 종료되기 전에 종료되어 다른 프로세스가 종료 상태를 얻을 수 없는 프로세스)를 얻는 것입니다.

표준 C 라이브러리는 거의 항상 사용되기 때문에 init표준 C 라이브러리는 시작되자마자 메모리에 로드됩니다 init. 그러나 이것은 단지 부작용일 뿐이며 커널은 이에 대해 신경 쓰지 않습니다.

커널은 표준 C 라이브러리와 아무 관련이 없습니다. (커널은 다음과 같이 작성되었습니다.독립형C, 표준 C 라이브러리가 위치한 환경아니요쓸 수 있는. )

답변3

커널 컨텍스트에서 "C 표준 라이브러리"는 추상화에 가깝습니다. 즉, C 언어에서 지정한 작업을 수행할 수 있는 재사용 가능한 유틸리티 서브루틴이 있다는 뜻입니다. C 언어가 아니라 커널 자체에 의해 정의된 재사용 가능한 서브루틴과 마찬가지로 "공유 객체"(동적 라이브러리)로 존재하지 않습니다. 대신 커널과 함께 컴파일되어 커널 실행 파일로 어셈블됩니다.

여기에서 memcpy, strcmp/strncmp와 같은 일부 라이브러리 코드를 찾을 수 있습니다. https://elixir.bootlin.com/linux/latest/source/arch/x86/lib

따라서 커널은 자체 C 라이브러리 구현과 함께 제공되며 이를 다른 사용자 수준 코드와 공유하지 않으며 사용자 제공 C 라이브러리를 사용하여 부팅하지도 않습니다. 실제로 모든 사용자 영역 프로그램은 C 라이브러리를 정적으로 링크(포함, 패키지)하고 다른 사람과 공유하지 않는 등 동일한 작업을 수행할 수 있습니다.

마지막 질문에 대답하자면, 어떤 사용자 공간 프로그램도 C 표준 라이브러리를 커널과 공유하지 않습니다.

답변4

C 표준 라이브러리의 약어는 다음과 같습니다.도서관.

우리가 가장 먼저 분명히 해야 할 것은도서관다른 도서관과 마찬가지로 도서관입니다.

커널 자체는 libc를 사용하지 않습니다(읽을 수 있듯이).여기).

도서관동적으로 또는 정적으로 링크될 수 있습니다.

동적 링크:

라이브러리는 실행 파일에 포함되어 있지 않습니다. 프로그램이 시작되면 시스템 경로에서 라이브러리가 로드됩니다. 예를 들어/lib/x86_64-linux-gnu/libc.so리눅스에서.

문제는 다음과 같습니다. 두 번째 프로그램이 시작되면도서관다시 로드되지 않았습니다. 대신 첫 번째 프로그램과 라이브러리를 공유합니다. 이는 새로운 메모리가 필요하지 않음을 의미합니다.

정적 링크:

만약에도서관정적 링크, 라이브러리는 실행 파일 내에 있습니다. 그래서 두 개의 프로그램을 실행하면도서관메모리에 두 번 존재합니다.

관련 정보