|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Unrau Alexander 2:5010/70 15 Oct 2004 17:35:19 To : All Subject : Re: =?koi8-r?B?zsXJ09DPzM7Rxc3ZyiDT1NzLINcgMi40ID8=?= -------------------------------------------------------------------------------- >> Открываем книжку Орловского "Введение в архитектуру 80386" на 54 >> странице >> и читаем: "Дескриптор сегмента может быть помечен правами, >> ограничивающими множество операций, которые можно производить с его >> сегментом. Сегмент кодов может быть помечен как исполняемый или >> читаемый. >> Сегменты данных могут быть помечены как доступные только для чтения или >> для чтения и записи". То есть разместив стэк в сегменте, не имеющем >> разрешения на исполнение, - получим неисполняемый стэк. NG> Смотрим на ключевое слово "сегмент" и вспоминаем о flat 32-bit memory. Одноако это не мешает иметь одному процессу несколько "плоских" сегментов, отдельно для кода, данных и стека, в каждый из которых отмапленны соответствующие страницы памяти. > Т.е. при работе под управлением ядра Linux _один_ сегмент?! Hу тогда > разработчики linux ССЗБ... Может, конечно, побоялись проблем > совместимости с > другими аппаратными платформами, но это зря... Hе верю я, что нельзя было > обойти эту проблему. > Hо я сильно сомневаюсь, что при такой схеме возможно вообще эффективно > реализовать защиту памяти. Хотя в подробности не вдавался, так что > спорить не > буду. Применительно к x86 следующий код: -------------------------------------------------------- #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int global_int; int main() { char buf[256]; unsigned short ss, ds, is, cs; int fd; ssize_t ret; __asm__("mov %%ss,%0":"=r" (ss)); __asm__("mov %%ds,%0":"=r" (ds)); __asm__("mov %%ds,%0":"=r" (is)); __asm__("mov %%cs,%0":"=r" (cs)); printf("ss - 0x%04X\n", (unsigned int) ss); printf("ds - 0x%04X\n", (unsigned int) ds); printf("is - 0x%04X\n", (unsigned int) is); printf("cs - 0x%04X\n", (unsigned int) cs); printf("\n---------- /proc/self/maps ----------\n"); fd = open("/proc/self/maps", O_RDONLY); while( (ret = read(fd, buf, sizeof(buf)-1)) > 0) { printf("%.*s",ret, buf); } printf("\n-------------------------------------\n"); close(fd); printf("Addres of stack variable cs - %p\n", &cs); printf("Addres of global variable global_int - %p\n", &global_int); return 0; } -------------------------------------------------------- Выводит такое: ss - 0x002B ds - 0x002B is - 0x002B cs - 0x0023 ---------- /proc/self/maps ---------- 08048000-08049000 r-xp 00000000 03:04 34095 /home/user/test_seg 08049000-0804a000 rw-p 00000000 03:04 34095 /home/user/test_seg 40000000-40014000 r-xp 00000000 03:03 681412 /lib/ld-2.2.4.so 40014000-40015000 rw-p 00013000 03:03 681412 /lib/ld-2.2.4.so 40015000-40016000 rwxp 00000000 00:00 0 40016000-40017000 rw-p 00000000 00:00 0 40029000-4015b000 r-xp 00000000 03:03 681421 /lib/libc-2.2.4.so 4015b000-40161000 rw-p 00131000 03:03 681421 /lib/libc-2.2.4.so 40161000-40165000 rw-p 00000000 00:00 0 bfffe000-c0000000 rwxp fffff000 00:00 0 ------------------------------------- Addres of stack variable cs - 0xbffff4e8 Addres of global variable global_int - 0x8049910 То что сегмент данных и кода равны - в принципе понятно, но я не понимаю как тогда они делят в одном сегменте и rw-p и rwxp? И вообще зачем им `x` в rwxp (сегменте данных/стека). А ведь зачем-то нужен. -- Unrau Alexander --- ifmail v.2.15dev5 * Origin: Ye 'Ol Disorganized NNTPCache groupie (2:5010/70) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/137759b1f1503.html, оценка из 5, голосов 10
|