올바르게 이해했다면 dylib 인스턴스는 로드될 때 메모리 세그먼트에 저장된 다음 공유됩니다.그리고 사본도 없어여러 프로세스 간에 가상 메모리가 필요합니다. 하지만 실행 시 누구에게 전화해야 할지 어떻게 알 수 있나요?
예를 들어, 내 프로세스 이름에 의존하는 라이브러리의 클래스 생성자(실제로 이름을 전달할 수 있으므로 이름을 직접 전달할 필요가 없음)에 연결된 여러 프로세스가 실제로 What을 호출하는지 어떻게 알 수 있습니까?
(이 예에서 메타 정보는 비밀이 아니며 간단한 시스템 호출로 검색할 수 있다는 사실을 무시합니다.) / 라이브러리의 코드는 이론적으로 의존할 수 있는 프로세스별 메모리에 대한 정보조차 의존할 수 없습니다. 메모리 공유와 동일한 방식은 역방향으로 적용할 수 없습니다(하나의 라이브러리 <- 동시에 여러 프로세스). 이는 큰 보안 허점이 됩니다.
라이브러리가 모든 프로세스가 아닌 일부 특정 프로세스 간에 공유할 정적 속성으로 일부 프로세스 관련 정보를 클래스에 저장해야 하는 경우 상황은 더욱 복잡해집니다.영어붙어 있는 것입니다. 실제로 데이터는 클래스가 자신의 일반 필드로 처리하는 형식으로 프로세스 메모리에 기록될 것이라고 가정합니다. 하지만 다시 라이브러리 코드 수준의 프로세스 식별 문제로 돌아가겠습니다.
답변1
일반적으로 스택(반환 주소의 소스), 힙(데이터 저장소) 및 일부 변수 값 또는 주소에 대한 포인터가 CPU 레지스터에 전달됩니다. 이 주소는 모두 호출자의 가상 메모리에 있습니다. 동적 라이브러리 코드는 호출자의 컨텍스트에서 실행되므로 모든 시스템 호출은 호출자가 완료한 것처럼 작동합니다.
나는 내 물건에 대한 포인터를 사용하여 내 가상 공간의 공유 라이브러리를 호출하고 사용자는 자신의 물건에 대한 포인터를 사용하여 가상 공간의 공유 라이브러리를 호출합니다.