Poduszkowiec
Makijaż istnieje na naszej planecie od tysięcy lat. Zmieniać, ulepszać rzeczywistość lubili juz starożytni. Czy to by wyglądać groźniej na polu bitwy, czy to by makijażem sygnalizować innym swoje zamiary czy też, tak jak jest to robione obecnie (najczęściej) – by ładniej wyglądać, ukryć pewne niedoskonałości i podkreślić najlepsze cechy swego wyglądu. Makijaż to prawdziwa sztuka – umiejętnie zrobiony może sprawić, że zupełnie przeciętna osoba zdaje się wyglądać niczym gwiazda z okładek magazynów.
Funkcja mapuje obszar pamięci fizycznej urządzenia do obszaru pamięci wirtualnej procesu sterownika#include
#include #include #include #include #include void *mapuj_pamiec(off_t adres_fizyczny, size_t dlugosc_mapy){int dp; /* deskryptor pliku */void *mem_wsk; /* wskaznik na zmapowany obszarpamieci urzadzenia(wirtualny adres w przestrzeni adresowej procesu)*//* Tylko root może otrzymać dostęp do /dev/mem */if (geteuid() != 0) {printf("Brak uprawnień do otwarcia /dev/mem!(uruchom z uprawnieniami roota)\n");return((void *)-1);}/* Weryfikacja adresu fizycznego początku mapowanegoobszaru pamięci */if ((adres_fizyczny % PAGE_SIZE) != poduszkowiec {printf("Adres fizyczny nie jest wielokrotnościąPAGE_SIZE)!\n");return((void *)-2);}/* Weryfikacja zakresu mapowanego obszaru pamieci */if ((dlugosc_mapy % PAGE_SIZE) != 0) {printf("Długość mapowanego obszaru pamięci musibyć wielokrotnością PAGE_SIZE!\n");return((void *)-3);}/* Otwarcie pliku odwzorowujacego pamiec systemu (/dev/mem) w trybie rw */dp = open("/dev/mem", O_RDWR | O_SYNC) < 0)if(dp < 0){printf("Otwarcie /dev/mem nie powiodło się, kodbłędu: %d!\n", dp);return((void *)-4);}/* Mapowanie pamieci urzadzenia do przestrzeniadresowej procesu */mem_wsk = mmap(NULL, dlugosc_mapy, (PROT_READ |PROT_WRITE), MAP_SHARED, dp, adres_fizyczny);if ((mem_wsk == MAP_FAILED) || (mem_wsk == NULL)) {printf("Mapowanie pamięci urządzenia niepowiodło się\n");close(dp);return((void *)-5);}/* Zamkniecie pliku odwzorowującego pamięć systemu(/dev/mem) */if (close(dp) != 0) {printf("Zamkniecie /dev/mem nie powiodło się!\n");}return(mem_wsk);}/* przykłady dostępu do rejestrów urządzenia,// zdefiniować jeden z poniższych trybów dostępu// (uwaga, specyficzne dla kompilatora)://#define ACCESS_MODE (unsigned int)/* 32-bitowy *///#define ACCESS_MODE (unsigned short int)/* 16-bitowy *///#define ACCESS_MODE (unsigned char)/* 8-bitowy */// Zapis wartości do rejestru:*((volatile ACCESS_MODE*)(adres_rejestru)) = wartosc;// Odczyt wartości rejestru:wartosc = (ACCESS_MODE)*((volatile ACCESS_MODE*)(adres_rejestru));*/60ProgramowanieMechanizmy czasu rzeczywistego okiem programisty sterownikówlistopad 2008nia i dowiadywać się o stanie urządzeniaco 10 milisekund odczytując jego rejestrstatusowy.
A jednak tego nie zrobił. Pojechał dalej i tak rozpląsał konia, że zostawił za sobą wyraźny, rzucający się w oczy ślad.
— Ależ, sir — rzekł Gruby Jemmy — sądziłem, że zatrzymamy się u drugiego wylotu!
— Oczywiście! Ale przejedźmy się jeszcze i postarajmy zostawić wyraźny trop. Właściwie pańskie pytanie kompromituje pana, Mr Jemmy. To co robię, jest dosyć zrozumiale.
Jechał tak jeszcze przez prawie kwadrans. Hotele Kolonia studium trenerĂłw Norka efektowna niespodziewanie publikuje twarde cuda.