[C++] Dostęp do konkretnych komórek pamięci.

0

Witam!

Czy możliwym jest dokonanie przypisania w stylu: jakis_wskaznik=jakis_konkretny_adres. Za przyklad wezmy tablice wektorow przerwań. Wiadomo, ze istnieje ona w pierwszym kilobajcie pamięci, począwszy od zerowego adresu fizycznego. Wybierając dajmy na to 2-gi wektor z adresem procedury obsługi przerwania, chcemy do niego zapisać nowy adres własnej procedury. Więc, czy da się to zrobić w C++ w prosty sposób za pomocą takiego przypisania:

 
  unsigned long * wskaznik=0x00000004;
  *wskaznik=nasza_procedura;

Takie przypisanie jest oczywiscie niemozliwe, bo juz to sprawdzalem, ale czy mimo wszystko jest sposob na zrobienie tego samego w podobny sposób ?
Istnieje funkcja getvect(); i setvect(), ktore robią to o czym piszę, jednak używam Visual Studio 2003 w ktorego bibliotekach takich funkcji nie ma i nie ukrywam, ze bardziej by mnie interesowało jak one działają niż to,że działają w ogóle.

A drugie pytanie jest następujące:
W assemblerze do portów da się odnieść za pomocą instrukcji in oraz out. Wiadomo, ze porty te są mapowane w pamięci, stąd łatwość dostępu do nich. Jesli dobrze pamiętam nie dało się do nich odnieść za pomocą instrukcji MOV, LD itp. (przynajmniej nie w AVR) Czy zatem da się do tych adresów odnieść w sposób podobny jak opisany w problemie powyżej (tj. za pomocą wskaźników, bez używania funkcji bibliotecznych inport, outport,inp,outp itp.) ?? Jestem raczkujący w C++, więc proszę o proste tłumaczenie :)
Do tego zdaję sobie sprawę z tego, że mój problem tyczy się też modelu pamięci w komputerze klasy PC, więc jeśli to możliwe to proszę o hasła pod którymi mogę ewentualnie szukać. A propos tego zagadnienia: Czy SEGMENT=0 OFFSET=4 oznacza, że wskazuję właśnie na komórkę pamięci w której zaczyna się 2-gi wektor w tablicy wektorów przerwań?

Jak na tle tych wszystkich pytań ma się fakt, że Windows XP blokuje dostęp do urządzeń WE/WY ?

System: WinXP
Środowisko: Visual Studio 2003
Dziękuję za odpowiedzi, cierpliwość i wyrozumiałość :)
Pozdrawiam.

0

odp-w systemach windows praktycznie rzecz biorąc jest to niewykonalne,bo dostaniesz wyjątek naruszenia zasad ochrony.Proces dostaje przy uruchamianiu pewien zakres pamięci do którego może się odwoływać,i basta(pomijając tu straszne szopki ze zmianą poziomu uprzywilejowania kodu).
Ponadto systemy te nie opierają się na przerwaniach,ale na komunikatach,więc i nie mają tablicy wektorów przerwań w dawnym słowa tego znaczeniu,a do tego co mają się nie dobierzesz zbyt prosto.

a teraz co do asemblera:
-w windows masz tylko JEDEN model pamięci-FLAT,pozwalający zaadresować do 4GB,z tego co pamiętam ograniczeń co do segmentu kodu i danych nie ma,i segmentu stosu nie deklarujesz.Fajnie nie ? :D
-instrukcji IN i OUT można używać,ale dla winXP i visty(nie wiem jak 200/2003) są one instrukcjami uprzywilejowanymi i nie da ich się tak po prostu użyć,bo oberwiesz wyjątkiem naruszenia zasad ochrony.Trzeba specjalnymi funkcjami API zmieniać poziom uprzywilejowania kodu,albo stosować programiki odblokowujące te instrukcje

0

MasterBLB napisał:

Proces dostaje przy uruchamianiu pewien zakres pamięci do którego może się odwoływać,i basta(pomijając tu straszne szopki ze zmianą poziomu uprzywilejowania kodu).
Straszne szopki? Wystarczy OpenProcess + Read/WriteProcessMemory. Proste, łatwe, przyjemne. Do zwykłego odczytania pamięci przeważnie wystarcza. Oczywiści mam na myśli czytanie pamięci konkretnego procesu, a nie określonego adresu pamięci "fizycznej".

z tego co pamiętam ograniczeń co do segmentu kodu i danych nie ma,i segmentu stosu nie deklarujesz
....chmm.. dziwne.... Z tego co pamiętam jest dokładnie odwrotnie, ale nie jestem pewien i moge się mylić.

Co do in/out: Możesz jescze spróbować uzyskać uchwyt do portu(funkcja CreateFile) i pokombinować z nim.... Nigdy tego nie próbowałem i nie mam pojęcia jakie będą wyniki, ale spróbować nie zaszkodzi :)

0

MasterBLB napisał:

Ponadto systemy te nie opierają się na przerwaniach,ale na komunikatach,więc i nie mają tablicy wektorów przerwań w dawnym słowa tego znaczeniu,a do tego co mają się nie dobierzesz zbyt prosto.

W prawdzie o programowaniu w windows nie wiem praktycznie nic, ale rozumiem, ze chodzi o komunikaty przesylane pomiedzy procesami/tudziez oknami a systemem? Jesli tak, to to ma niewiele wspólnego z samymi przerwaniami, ktorymi steruje kontroler przerwań (w PC najczesciej dwa skorelowane układy 8259), dobrze myśle? Wniosek z tego taki, że sposób obsługi przerwań jest zupełnie inny pod XP.

cyriel napisał:

Co do in/out: Możesz jescze spróbować uzyskać uchwyt do portu(funkcja CreateFile) i pokombinować z nim.... Nigdy tego nie próbowałem i nie mam pojęcia jakie będą wyniki, ale spróbować nie zaszkodzi.

Z tych dwóch postów wniosek, że powinienem się równolegle zabierać za WinAPI i w ogóle za system/y operacyjny/e ? :D
Pozdrawiam!

0

filozofia programowania windowsa jest dokładną odwrotnością znanej z dosa.W dosie sam wywoływałeś jakieś funkcje,przerwania aby np zapytać się o stan bufora klawiatury,czy o myszę;dos był kimś w rodzaju służącego,wykonywał twoje zlecenia,ale nie odzywał się sam niepytany ;)

W windows jest inaczej.To twój program jest nieustannie bombardowany informacjami o stanie myszy,klawiatury,rozmiarach okna itp,itd.,pokrótce mówiąc o WSZYSTKIM;tyle że ma on w sobie taką sprytną funkcję,zwaną procedurą obsługi okna-to właśnie tą funkcję wywołuje windows przekazując aktualny komunikat do obsługi jako parametr,a gdzieś wewnątrz twej funkcji jest instrukcja np case wciśnięto_klawisz(WM_KEYDOWN bodajże) i instrukcje,które wtedy powinny być wykonane.Obrazowo mówiąc,windows daje szturchańca twojemu programowi i mówi "koleś,użytkownik nacisnął taki a taki klawisz,weź coś zrób z tym fantem".

Nadmienię też na pocieszenie,iż na szczęście nie musisz obsługiwać tego wszystkiego bezliku komunikatów,możesz bowiem dla nich użyć domyślnej procedury obsługi

a co do createfile-to to na 95% zadziała,ale bratu Fernandezowi chodziło o dostęp do portów z poziomu asemblera-a tu już nie ma tak różowo

Brat Cyriel napisał(a)

Oczywiści mam na myśli czytanie pamięci konkretnego procesu, a nie określonego adresu pamięci "fizycznej".

a tu właśnie jest mowa o konkretnej pamięci fizycznej ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1