최근 VOS 고객으로부터 공유 가상 메모리 영역을 기존 비-POSIX 프로그램과 새로운 POSIX 기반 프로그램 간에 정렬시키는 방법을 묻는 질문을 받았습니다.
이 고객은 create_data_object 명령어를 사용하여 여러 개의 서로 다른 공유 가상 메모리 영역을 생성했습니다. 이후 바인드 제어 파일을 사용하여 각 프로그램이 동일한 순서와 동일한 가상 주소에서 해당 영역을 참조하도록 했습니다. 문제는 POSIX 기반의 새 프로그램들을 gcc 명령어로 어떻게 바인딩하든 SVM 영역을 정렬시킬 수 없었다는 점입니다. 새 프로그램들은 SVM 영역을 서로 다른 주소에 배치했습니다. gcc와 함께 바인드 파일을 사용해도 소용이 없었습니다.
바인드 맵(또는 display_program_module 명령어의 출력)을 보면 POSIX 프로그램은 항상 "s_start_c_program" 및 "crti" 객체 모듈로 시작함을 알 수 있습니다. s_start_c_program 객체 모듈은 레거시 프로그램에서는 뒤에 나타나며, crti 객체 모듈은 전혀 나타나지 않습니다. 이 두 객체 모듈의 존재로 인해 후속 객체 모듈들이 파일 내에서 아래로 밀려나게 되어 정렬 불일치가 발생합니다.
gcc가 이 두 객체 모듈을 프로그램 모듈의 맨 앞에 배치하는 것을 막을 방법은 없습니다. 따라서 해결책은 기존 프로그램의 바인딩 방식을 변경하는 것입니다. SVM 영역은 페이지 경계에서 시작해야 하며, s_start_c_program 및 crti 코드 영역의 합산 크기가 페이지보다 작기 때문에, 레거시 프로그램 시작 부분에 추가로 사용되지 않는 페이지를 할당하기만 하면 됩니다. create_data_object 명령을 사용하여 4096바이트 데이터 객체를 생성하고, 이를 바인드 제어 파일의 첫 번째 객체 모듈로 배치하십시오.
이 두 프로그램의 크기를 1페이지(4096바이트) 이하로 유지하기로 합의했으므로, 이 해결책은 앞으로 계속 적용될 것입니다.
이 기술에 대해 궁금한 점이 있으시면 아래에 질문해 주세요.
