주요 콘텐츠로 건너뛰기

나는 최근에 그의 레거시 비 POSIX 프로그램과 그의 새로운 POSIX 기반 프로그램 사이에 정렬 자신의 공유 가상 메모리 영역을 얻는 방법을 알고 싶어 VOS 고객에서 질문을 필드.

이 고객은 create_data_object 명령을 사용하여 여러 공유 가상 메모리 영역을 만들었습니다.  그런 다음 바인드 컨트롤 파일을 사용하여 각 프로그램이 동일한 순서와 동일한 가상 주소로 영역을 참조했는지 확인했습니다.  문제는 Gcc 명령을 사용하여 새로운 POSIX 기반 프로그램을 바인딩하는 방법에 관계없이 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) 바이트 이하로 유지하기로 합의했기 때문에 이 솔루션은 앞으로 도용될 것입니다.

이 기술에 대한 질문이 있으시면 아래에 게시하십시오.

© 2024 스트라투스 테크놀로지스.