2017-11-16 89 views
6

Chciałbym utworzyć program ze specjalną sekcją na końcu pamięci wirtualnej. Więc chciałem zrobić coś skryptu linkera tak:Jawnie ustawiono wskaźnik stosu początkowego ze skryptem konsolidatora

/* ... */ 
.section_x 0xffff0000 : { 
    _start_section_x = .; 
    . = . + 0xffff; 
    _end_section_x = .; 
} 

Problemem jest to, że gcc/LD/glibc wydaje się załadować stos w tej lokalizacji domyślnie dla aplikacji 32 bitowych, nawet jeśli pokrywa się znanym Sekcja. Powyższy kod zeruje stos, powodując wyjątek. Czy jest jakiś sposób, aby powiedzieć linkerowi, aby użył innej lokalizacji pamięci VM dla stosu? (Poza tym chciałbym się upewnić, że sterta nie obejmuje tej sekcji pamięci wirtualnej ...).

+0

Musisz podać więcej informacji o celu. Początkowa zawartość rejestru (która określa położenie stosu) zależy od celu. –

+0

To jest system arm-8 (kompilacja w trybie 32-bitowym). Używam jądra Linux 3.10 z opcją narzędziową gcc 4.7.0. – HardcoreHenry

Odpowiedz

1

Nienawidzę odpowiedzi, które zakładają lub nawet pytają, czy pytanie jest błędne, ale jeśli potrzebujesz segmentu 64k, dlaczego nie możesz go po prostu przydzielić na starcie?

Dlaczego mógłbyś potrzebować stałego adresu w przestrzeni adresowej twojego procesu? Przez prawie 30 lat robiłem wiele różnych rodzajów kodowania i nie widziałem potrzeby posiadania stałego adresu od czasu pojawienia się chronionej pamięci.

+0

Nie, niestety, pytanie nie jest niepoprawne. Modyfikuję istniejący system z możliwością przypisania specjalnego znaczenia do różnych bitów wskaźnika. Jako takie, muszę zarezerwować zakres adresów 0xffff0000 dla specjalnego celu. – HardcoreHenry

+0

@HardcoreHenry Jestem pewien, że ktokolwiek stworzył ten system, opisał go jako "elegancki", ale myślę, że 99% świata, z nadzieją, że to ty, postrzega to jako złe. To powiedziawszy, dlaczego te głupkowate wskaźniki muszą rozwiązać ważne adresy? Czy jakaś warstwa abstrakcji nie zapewnia dodatkowej funkcjonalności, a jednocześnie nie wymaga stałych adresów pamięci? Mogą wskazywać na strukturę z tymi ustawionymi bitami, albo dereferencja wskaźnika może być wykonana przez rutynę, która wie jak zrobić lookaside? –