Nie jestem ekspertem z takich zagadnień niskopoziomowych, więc proszę
się nie śmiać jeśli napiszę jakąś głupotę. Chętnie się doedukuję, jeśli
ktoś zechce mnie poprawić :)
On Sun, May 14, 2006 at 12:51:35PM +0200, majess wrote:
program działa dobrze do momentu pojawienia się w kodzie odwołań do tych
funkcji (InPort i OutPort). Gdy je już napotka............to nie wykonuje
już pozostałych instruckji, ktore sa poniżej tylko kończy wykonywanie
programu(wiec dostęp do tej przestrzeni powoduje jakiś "fatal error" i
zakończenie wykonywania programu).
Ten "fatal error" to właśnie najbardziej istotna część problemu.
Nie wiem czy to może miec związek z tym ze Debian ma jakieś restrykcje
odnośnie dostępu do przestrzeni I/O komputera? Sytuacja jest taka sama
gdy próbuje napisać funkcje odczytujące i zapisujące słowo do pamięci.
We wspóczesnych systemach UNIX/Linux procesor pracuje w tzw. trybie
chronionym, w związku z czym niektóre rozkazy (dotyczące zarządzania
pamięcią, dostępu I/O i inne, np. instrukcja hlt) nie są dostępne z
procesów pracujących w trybie użytkownika.
W przypadku próby ich wykonania sterowanie jest przekazywane do jądra,
które zazwyczaj po prostu przerywa działanie danego procesu (fatal
error).
Może ktoś z was spotkał sie z podobnym problemem albo ma więcej
doświadczenia w pisaniu wstawek asemblerowych Unix dla GCC?
Nie żebym miał doświadczenie, ale wydaje mi się, że da się "odblokować"
I/O dla pewnego procesu, jeśli pracuje z uprawnieniami nadzorcy (UID=0).
Być może dzieje się to automatycznie, albo trzeba wywołać jakiś syscall,
ale zdaje się właśnie z tego mechanizmu korzysta np. X server.
Oczywiścia osobną kwestią są ewentualne konflikty pomiędzy sterownikiem
portów COM w jądrze, a Twoim programem, ale to się da ominąć choćby
wyłączając ten sterownik.
Marcin