Pular para o conteúdo principal

Recentemente, respondi a uma pergunta de um cliente VOS que queria saber como alinhar suas regiões de memória virtual compartilhada entre seus programas legados não POSIX e seus novos programas baseados em POSIX.

Esse cliente havia usado o comando create_data_object para criar várias regiões de memória virtual compartilhadas diferentes. Em seguida, ele usou um arquivo de controle de ligação para garantir que cada programa referenciasse as regiões na mesma ordem e no mesmo endereço virtual.  O problema era que, independentemente de como ele usasse o comando gcc para vincular seus novos programas baseados em POSIX, ele não conseguia alinhar as regiões SVM. Os novos programas colocavam as regiões SVM em endereços diferentes. Mesmo usando um arquivo de vinculação com o gcc não adiantava.

O mapa de ligação (ou a saída do comando display_program_module) revela que os programas POSIX começam sempre com os módulos de objeto “s_start_c_program” e “crti”. O módulo de objeto s_start_c_program aparece mais tarde no programa legado, e o módulo de objeto crti não aparece de todo.  A presença desses dois módulos de objeto empurra todos os módulos de objeto subsequentes para baixo no arquivo, o que resulta no desalinhamento.

Não há como impedir que o gcc coloque esses dois módulos objeto em primeiro lugar no módulo do programa. Portanto, a solução é alterar a forma como os programas legados são vinculados.  Como as regiões SVM devem começar em um limite de página e como o tamanho combinado das regiões de código s_start_c_program e crti é menor que uma página, tudo o que precisamos fazer é alocar uma página extra não utilizada no início dos programas legados. Use o comando create_data_object para criar um objeto de dados de 4096 bytes e coloque-o no arquivo de controle de vinculação como o primeiro módulo de objeto.

Concordamos em manter o tamanho desses dois programas em 1 página (4096) bytes ou menos, portanto, essa solução funcionará daqui para frente.

Se você tiver alguma dúvida sobre essa técnica, poste-a abaixo.

© 2024 Stratus Technologies.