Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Adresy statyczne
#1
Mam nadzieję, że pomożesz mi zrozumieć.   Jak statyczne są adresy statyczne?   Myślałbym, że kiedykolwiek uruchomisz grę lub program, w którym zmieniają się wszystkie adresy i jedyny sposób, w jaki mogę myśleć o logice, to to, że wszystkie rejestry mają adresy statyczne od momentu zbudowania maszyny, i nigdy się nie zmieniają nawet przy ponownym uruchomieniu i to z tych rejestrów wyliczamy przesunięcia?   Czy mam rację, skoro wyciągnąłem z tego logikę? Jeśli nie, proszę, rozjaśnij mnie.
Reply
#2
Adresy statyczne nie są szczególnie "statyczne" za pomocą adresu statycznego, ale za pomocą przesunięcia statycznego. Plik PE jest ładowany jako plik odwzorowany w pamięci po uruchomieniu go jako plik wykonywalny lub załadowaniu biblioteki DLL jako modułu. Plik wykonywalny składa się z nagłówka PE, sekcji danych i sekcji kodu wykonywalnego. Na przykład zmienne globalne są w większości przydzielane statycznie w sekcji danych, co oznacza, że gdy plik jest ładowany przez system Windows, zmienna zostanie przydzielona statycznie względem adresu podstawowego załadowanego pliku wykonywalnego. #thread przeniósł się do programowania ogólnego i cofania.
Reply
#3
Wiem, że jest to stałe przesunięcie, ale pozwól, że masz adres początkowy, który ma adres, a następnie bierzesz go z tego adresu, ale co się stanie, gdy program / maszyna zostanie zrestartowana, czy adres początkowy, z którego różne? Staram się zobaczyć, jak to działa, chyba że tak opisałem powyżej, jeśli chodzi o rozwiązywanie adresów rejestrów.
Reply
#4
Jedynym sposobem zmiany adresu statycznego jest aktualizacja gry. Po wybraniu adresu początkowego wystarczy upewnić się, że można go znaleźć w inny sposób. To, co robię, to zdefiniowanie adresu początkowego za pomocą wzorców lub użycie bazy modułów. start address + offset = Twój prawdziwy adres Zacytować: maszyna zostanie zrestartowana, czy adres początkowy, od którego się wyrównasz, będzie inny? Nie jestem pewien, aby zrozumieć tę część. Zasadniczo plik wykonywalny gry jest przechowywany na dysku twardym, a po uruchomieniu jest on ładowany do pamięci. Ponowne uruchomienie komputera nic nie zmieni. Edycja: Nawet jeśli adres początkowy zmieni się po ponownym wykonaniu, nie ma to znaczenia, ponieważ możesz go znaleźć. Mam nadzieję, że to pomoże.
Reply
#5
Dziękuję za poświęcenie czasu, ale albo nie otrzymujesz tego, o co pytam, albo nie widzę odpowiedzi na moje pytanie w tym, co powiedziałeś. Oto, co rozumiem: 1) Znajdujemy statyczny adres (0x00F08710) w naszym programie 2) Przesunięcie od tego adresu mówi (+ 0x28), który jest za każdym razem taki sam stały dystans Czego nie rozumiem, to dlaczego 0x00F08710 jest taki sam za każdym razem, gdy program jest uruchamiany, kiedy program jest ładowany do innego miejsca w pamięci? Jedynym sposobem na zrozumienie tego jest to, że 0x00F08710 jest adresem rejestru, a adresy rejestru nigdy się nie zmieniają, ale to tylko moje przypuszczenie.
Reply
#6
Adresowanie wirtualne to powoduje. Proces tak naprawdę nie zna "prawdziwego adresu fizycznego". Po prostu Google, artykuł wiki opisuje to lepiej niż ja. To pochodzi ze strony wiki pamięci wirtualnej. Zacytować: Pamięć wirtualna ułatwia programowanie aplikacji ukrywając fragmentację pamięci fizycznej; poprzez delegowanie do jądra obciążenia zarządzania hierarchią pamięci (eliminując potrzebę bezpośredniego obsługiwania nakładek przez program); oraz, gdy każdy proces jest uruchamiany we własnej dedykowanej przestrzeni adresowej, przez uniknięcie potrzeby przeniesienia kodu programu lub dostępu do pamięci za pomocą względnego adresowania. Wirtualizację pamięci można uznać za uogólnienie koncepcji pamięci wirtualnej.
Reply
#7
Dzięki, rozumiem teraz
Reply




Users browsing this thread: 1 Guest(s)