운영 체제 개념 Silberschatz A., Galvin PB, Gagne G. 저작 - 운영 체제 개념, 9판 - 2012
8.1.4 동적 로딩
지금까지의 논의에서 프로세스의 전체 프로그램과 모든 데이터는 실행되기 위해 물리적 메모리에 위치해야 합니다. 따라서 프로세스의 크기는 물리적 메모리의 크기에 따라 제한됩니다. 더 나은 메모리 공간 활용을 위해 동적 로딩을 사용할 수 있습니다.동적 로딩을 사용하면 루틴이 호출될 때까지 루틴이 로드되지 않습니다. 모든 루틴은 재배치 가능한 로드 형식으로 디스크에 저장됩니다.메인 프로그램이 메모리에 로드되어 실행됩니다. 루틴이 다른 루틴을 호출해야 하는 경우 호출 루틴은 먼저 다른 루틴이 로드되었는지 확인합니다. 그렇지 않은 경우 재배치 가능 링크 로더가 호출되어 필요한 루틴을 메모리에 로드하고 프로그램의 주소 테이블을 업데이트하여 이 변경 사항을 반영합니다. 그런 다음 새로 로드된 루틴으로 제어가 전달됩니다.
동적 로딩의 장점은 루틴이 필요할 때만 로드된다는 것입니다. 이 방법은 오류 루틴과 같이 자주 발생하지 않는 상황을 처리하기 위해 많은 양의 코드가 필요할 때 특히 유용합니다. 이 경우 전체 프로그램 크기는 클 수 있지만 사용되는(따라서 로드되는) 부분은 훨씬 작을 수 있습니다.
동적 로딩에는 운영 체제의 특별한 지원이 필요하지 않습니다. 이 방법을 활용하도록 프로그램을 설계하는 것은 사용자의 책임입니다. 그러나 운영 체제는 동적 로딩을 구현하는 라이브러리 루틴을 제공하여 프로그래머를 도울 수 있습니다.
8.1.5 동적 연결 및 공유 라이브러리
Linux에서 "재배치 가능한 로드 형식"을 갖는 파일 유형은 무엇입니까?
- ELF 실행 파일,
- .so 공유 라이브러리 파일,
- 커널 모듈,
- .o 개체 파일?
모두 동적으로 로드할 수 있나요?
참조의 "재배치 가능한 로드 형식"은 다음에 따라 .o 공유 라이브러리 파일이 아닌 .o 개체 파일, 커널 모듈을 의미합니다.
http://refspecs.linuxbase.org/elf/gabi4+/ch4.intro.htmlELF 파일은 실행 파일, 공유 객체 파일, 재배치 가능 파일의 세 가지 유형으로 나누어진다고 합니다.
커널 자체와 커널 모듈에는 어떤 ELF 유형이 있습니까?커널 모듈도 재배치 가능한 ELF임을 나타냅니다.
이 책에서는 섹션 8.1.5까지 공유 라이브러리에 대해 아무 것도 언급하지 않으므로 섹션 8.1.4 동적 로딩이 반드시 공유 라이브러리를 사용자 프로그램에 로드하는 것은 아니지만 다른 것을 로드할 수도 있는 것 같습니다. 정말?
섹션 8.1.4의 마지막 단락은 프로그래머가 명시적으로 동적 로딩을 수행해야 한다고 말하는 것 같습니다. 그것은 그것을 가리키는가 dlopen()
? dlopen()
.so 공유 라이브러리, .o 객체 파일, 커널 모듈, 실행 가능한 ELF 파일 등 어떤 유형의 ELF 파일이 첫 번째 인수로 허용 됩니까 ?
감사해요.
답변1
공유 라이브러리는 실제로 재배치 가능해야 할 필요는 없습니다. AT&T는 1987년경 SYSvr3에서 재배치 불가능한 공유 라이브러리를 사용했습니다.
AT&T에서 사용하는 방법은 공유 라이브러리의 고정 주소를 기반으로 하며, 공유 라이브러리는 특수 시스템 도구를 통해 시작 시 시스템 메모리에 설치됩니다(모든 프로세스에서 사용할 수 있음). 이러한 라이브러리를 사용하는 프로그램은 설치 시 사용된 고정 주소로 연결됩니다. 다양한 라이브러리가 로드되는 위치를 정의하려면 전역 관리자가 필요하므로 이 접근 방식은 매우 제한적입니다.
오늘날 사용되는 방법은 Sun Microsystems의 1987년 연구를 기반으로 하며 1987년 12월에 발표되었습니다.
이는 mmap()
커널의 기능을 기반으로 합니다. 각 프로그램에는 재배치 가능한 코드를 사용하여 필요한 라이브러리를 매핑하는 특수 시작 코드가 포함되어 있습니다.
각 라이브러리에는 라이브러리에 있는 다양한 기호의 오프셋이 포함된 특수 테이블이 포함되어 있습니다. 각 프로그램에는 함수 이름이 포함된 테이블이 포함되어 있으며 바이너리는 필요한 모든 기능과 관련된 테이블 항목에서 점프 서브루틴을 수행합니다.
이 테이블 항목에는 런타임 링커 코드에 대한 점프 명령이 포함되어 있으며, 처음 사용되면 런타임 링커는 공유 라이브러리의 함수로 점프하여 점프를 대체합니다.
이 모든 것은 시스템 소프트웨어에 의해 처리되며 사용자 프로그래밍의 대상이 아닙니다.
참고: 이 책에서는 어떤 프로그램도 물리적 메모리보다 커질 수 없다고 주장합니다. 1960년대에는 확실히 이것이 사실이었다. IBM은 1970년대 초반에 메인프레임을 변경했고, BSD는 1979년에 가상 메모리 관리를 통해 UNIX를 변경했습니다.
dlopen()
런타임에 동적 라이브러리를 "수동으로" 로드하는 데 사용할 수 있으므로 이전에 발생한 작업에 대한 종속성을 허용합니다. 예를 들어, 사운드 플레이어 프로그램은 file 매개변수가 인코딩을 사용하는 사운드 파일을 참조한다는 사실을 발견한 후 dlopen
로드 디코더를 사용하기로 결정할 수 있습니다.mp3
mp3
를 사용하는 경우 dlopen
로드된 공유 라이브러리의 함수는 자동으로 링크되지 않습니다 . dlsym()
함수 이름에서 주소를 가져온 다음 포인터 역참조를 통해 함수를 호출 해야 합니다 .
파일을 생성해야 하는데 , 파일 생성에 필요한 특수한 연결 과정을 통해 파일이 생성되기 때문에 dlopen
파일을 생성 할 수 없습니다 ..o
_PROCEDURE_LINKAGE_TABLE_
.so.
Microsoft에서 사용 하는 접근 방식 은 dlopen
. 정적 라이브러리는 프로그램에 정적으로 연결되어 있으며 라이브러리를 로드하고 함수 주소를 검색한 다음 함수 포인터를 호출하는 trmapolin 코드를 포함합니다.dlopen
dll
Microsoft 컴파일러는 항상 재배치 가능한 코드를 생성하므로 해당 컴파일러로 컴파일된 완전히 정적 라이브러리라도 재배치 가능한 코드를 사용합니다.
일반적인 경우, 루틴이 참조될 때까지 로드되지 않는다고 말하는 것은 잘못된 것이며 이 dlopen
경우에만 적용됩니다.
ELF 런타임 시스템에서 관리하는 라이브러리는 나열될 수 있지만
ldd
수동으로 관리되는 라이브러리는dlopen
이름이 런타임 문자열 처리의 결과일 수 있으므로 나열될 수 없습니다.