Multitasking, a ochrona pamięci
| neodemon | 17.12.2006 22:42:41 | |
![]() | W jaki sposób realizowana jest ochrona pamięci w systemach wielozadaniowych i wielowątkowych? Dręczy mnie to jak np zabezpieczyć się przed programem który skacze w losowe miejsce w pamięci, poza obszar w którym powinien działać. Chyba wiadomo jakie to może mieć konsekwencje. Wiem że dodając deskryptor GDT dla każdego zadania dało by się zabezpieczyć, ale współczesne systemy operacyjne używają chyba tylko kilku deskryptorów, chyba że ja coś pomyliłem. | |
| Fr3m3n | 21.12.2006 22:49:20 | |
![]() | Wspolczesne systemy uzywaja stron i wirtualnej pamieci (wirtualne adresy). Programy sie po prostu nawzajem nie widza. Natomiast jesli chodzi o zabezpieczenie 'program skacze w swoja przestrzen adresowa, ale tam gdzie sa dane' to nie da sie tego prosto zrobic - w nowszych prockach jest cos takiego jak bit NX (jest tez od pentium pro w PAE, ale to jest nieuzywane). Bez tego jedyne mozliwe prawa to read/write... Dlatego powstało w ogóle cos takiego jak stack overflow - kod na stosie jest po prostu wykonywany (przynajmniej w najprostszym ataku). W systemach z specjalna ochrona (Openbsd, xp sp2 (DEP), cos tam innego), jest to niemozliwe, ale wolne. Natomiast w systemach wykorzystujacych bit NX w nowych prockach jest to szybkie i tak samo bezpieczne. | |
| neodemon | 23.12.2006 23:18:42 | |
![]() | Dzięki wielkie za rozjaśnienie sprawy, a wiesz moze w jaki sposób za pomocą mechanizmu stronicowania sprawić aby programy na wzajem nie weszły sobie w paradę? Czy kiedy proces jest przełączany to w tablicy stron są ustawiane jakieś flagi które sprawiają że program który ma być wykonywany nie będzie mógł zapisać do pamięci w miejsce poza stronami pamięci należącymi do niego? | |
| Fr3m3n | 24.12.2006 01:40:09 | |
![]() | Programy NIE WIDZA sie nawzajem. Adres wirtualny 0x00300000 (np.) dla procesu A oznacza adres linearny (wspólny dla całego systemu) 0xAABBCCDD, ale dla procesu B może oznaczać 0x11223344. Tak samo adres wirtualny 0x33445566 dla procesu A moze oznaczac adres linearny 0x8899AABB, a dla procesu B nic - proba odczytu/zapisu spowoduje wystapienie błędu. Za jakies dwa tygodnie powinna się pojawić czesc druga kursu pisania os (zobacz w OS Programming 1, jak chcesz), tam dokładnie opisze stronicowanie. | |
| MrKaktus | 25.12.2006 13:29:28 | |
![]() | @neodemon - caly mechanizm stronicowania opisalem w kursie o Memory Menedzeze na tej stronie :) polecam. | |

