대부분의 Linux 커널은 C로 작성되었기 때문에 커널이 메인 메모리에 로드되면 표준 C 라이브러리도 Linux 커널과 함께 로드됩니까?
이것이 C로 작성된 프로그램이 다른 프로그램보다 메모리를 덜 소비하는 이유라면 표준 C 라이브러리가 이미 로드되어 있기 때문에 Linux 시스템에서 실행할 때 다른 언어로 작성된 프로그램보다 더 빠릅니다(페이지 폴트가 적음).
답변1
커널은 C로 작성되었지만 C 라이브러리(예:데이브 톰슨_085"라고 지적했다.떨어져 있는"). 이렇게 하더라도 커널에서 사용하기 위해 커널과 함께 로드된 C 라이브러리는 커널에서만 사용됩니다(커널이 어떻게든 사용자 공간에 명시적으로 액세스할 수 있도록 만들지 않는 한). 메모리 요구 사항.
즉, 대부분의 경우 가장 오래된 프로그램은 커널 부팅 후에 실행됩니다(initramfs에 있는 프로그램은 자체 C 라이브러리 복사본을 사용하지만 결국에는 init
C 라이브러리를 사용하므로 결국에는 초기에는 널리 사용되는 라이브러리 부품이 항상 물리적 메모리에 남아 있을 가능성이 높습니다.
커널에는 다음 구현이 포함되어 있습니다.많은 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리눅스에서.
문제는 다음과 같습니다. 두 번째 프로그램이 시작되면도서관다시 로드되지 않았습니다. 대신 첫 번째 프로그램과 라이브러리를 공유합니다. 이는 새로운 메모리가 필요하지 않음을 의미합니다.
정적 링크:
만약에도서관정적 링크, 라이브러리는 실행 파일 내에 있습니다. 그래서 두 개의 프로그램을 실행하면도서관메모리에 두 번 존재합니다.