Автор |
Current process in Linux |
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 11 Мар, 2003 г. - 10:32   |
Я этот вопрос уже задавал на других форумах- в ответ тишина, может кто знает, почему в ядре Linux указатель на структутру, описывающую текущий процесс получают так
movl esp,reg;
andl $-8192,reg;
Тут надо копать менеджера памяти, а времени нет, но интересно.
|
|
PSD
 Не бог, но тоже небожитель
 Сообщений: 598 | Отправлено: 11 Мар, 2003 г. - 13:04   |
У верености нет но
movl esp,reg;
andl $-8192,reg;
очень похоже на получение адреса страницы по указателю на некоторую ячейкув ней.
Что находися в reg?
_________________ Да да нет нет все остальное от лукавого
|
|
grom
 Бог средней руки
 Сообщений: 1154 | Отправлено: 11 Мар, 2003 г. - 14:05   |
8192 - это в двоичной системе 10000000000000.
1 старшего разряда для адресса - смещение из DATA в програмную область? _________________ Мы строили строили и на...
|
|
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 11 Мар, 2003 г. - 14:24   |
Только учтите, что синтаксис там AT&T, то есть в том коде movl esp, reg, по интелловски означает mov reg, esp; а $-8192- как я понимаю, в этом синтаксисе, это не смещение от текущей инструкции назад, это число (-8192).
Логика кода вроде такая- запихать в регистр reg указатель на стек нулевого кольца для текущего процесса, потом сравнить при помощи and с числом (-8192)==FFFFE000, и получим указатель на структуру, описывающую текущий процесс.
Я уже полгода не смотрел коды Linux, а вчера влез- и вот не могу понять, многое забылось.
Вот я и говорю, надо разбираться в менеджере памяти.
Может QNX'ники нам помогут, там вроде у ассемблера тоже применяют этот синтаксис AT&T.
|
|
grom
 Бог средней руки
 Сообщений: 1154 | Отправлено: 11 Мар, 2003 г. - 14:35   |
А что - это разве сравнение? В данном случае тогда получается что регистре исполняемый адрес накладвается - если не брать в расчет FF по многу раз на E000, что дает обнуление трех правых байтов адресса и оставляет 1 в верхнем разряде второго.
Или and уже сравнение??? Там должно быть другое при сравнении... если мне память не изменяет.
А так Olej надо ждать - напишу ему вечером. _________________ Мы строили строили и на...
|
|
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 11 Мар, 2003 г. - 15:32   |
Ну не сравнение - оперрация and, в итоге получается что-то, что лежит на следующей странице за текущей стековой, обычно это так называемая сторожевая страница. Вот я и не пойму- почему такое выходит?
|
|
PSD
 Не бог, но тоже небожитель
 Сообщений: 598 | Отправлено: 11 Мар, 2003 г. - 15:52   |
А система не 64 битная ? а то тогда это получится не следующая страница а начало этой. _________________ Да да нет нет все остальное от лукавого
|
|
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 11 Мар, 2003 г. - 16:21   |
Не- система для архитектуры IA-32, то есть i386 и выше.
|
|
RXL
 Новичок Сообщений: 23 | Отправлено: 11 Мар, 2003 г. - 16:49   |
Что здесь такого особенного? Ну отвели под стек и описатель процесса 8к в одном месте - кернель стек слабо использует, а чтобы не хранить адрес делают простые пычисления.
В исходниках я такое нашел только в arch/i386/lib/getuser.S . Там находятся функции __get_user_[124] - чтение 1, 2 или 4 байт из блока esp&(-8192). Стоит вспомнить так же о том, что у ядра и у пользователя разные адресные пространства и возможно что эти 2-ве страницы у них общие, а виртуальные адреса могут быть разные. Тут-то и подходит адесация с esp - стек всегда в нужном месте.
|
|
grom
 Бог средней руки
 Сообщений: 1154 | Отправлено: 11 Мар, 2003 г. - 16:51   |
Возможно, а по подробнее ? _________________ Мы строили строили и на...
|
|
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 11 Мар, 2003 г. - 17:16   |
Quote:
| Что здесь такого особенного? Ну отвели под стек и описатель процесса 8к в одном месте - кернель стек слабо использует, а чтобы не хранить адрес делают простые пычисления.
В исходниках я такое нашел только в arch/i386/lib/getuser.S . Там находятся функции __get_user_[124] - чтение 1, 2 или 4 байт из блока esp&(-8192). Стоит вспомнить так же о том, что у ядра и у пользователя разные адресные пространства и возможно что эти 2-ве страницы у них общие, а виртуальные адреса могут быть разные. Тут-то и подходит адесация с esp - стек всегда в нужном месте. |
|
Вот - давай поподробнее. А то задолбало самому разбираться, да еще отягощенному виндой. Я так понял ты Linux занят, я то просто виндой и время на Linux не так много.
То есть, где все таки указатель? Я правильно предположил или нет, что он на сторожевой странице, то есть на той которую не используют.
|
|
RXL
 Новичок Сообщений: 23 | Отправлено: 12 Мар, 2003 г. - 00:45   |
На столько глубоко я не копал. Как верно было подмечено: исходники ядра такая вещь, что вернувшись к ним через пару месяцев все приходится вспоминать заново. Посмотрев внимательнее нашел что я немного ошибся.
Как я уже упоминал, конструкция esp&(-8192) есть только в функиях __get_user_[124] - gcc такой код врятли создаст, а значит больше он ни где не встречается. Эти функции через макрос get_user(x,ptr) используются для безопасного доступа в область пользователя.
По адресу (esp&0xffffe000)+12 хранится некое число используемое для проверки границ области пользователя. Для пользователя граница 0xbfffffff, для ядра 0xffffffff - т.е., из просесса нельзя доступиться к области >3Gb, используемой обычно для периферии.
; сокращенный вариант __get_user_1
; eax=адрес переменной
addr_limit = 12
; ^^^ константа
movl %esp,%edx
andl $0xffffe000,%edx
cmpl addr_limit(%edx),%eax ; [edx+12]>eax
jae bad_user
movzbl (%eax),%edx ; unsigned char => unsigned long => edx
xor; %eax,%eax ; return 0
ret
Похоже что там находится структура task_struct (include/linux/sched.h).
Т.е., в начале этого блока task_struct, а в конце стек.
По вопросу "есть ли guardpage" - в не нашел. В описании библиотеки POSIX threads это есть, но это просто принудительное увеличение стека пользователя для новой нити. В ядре это делается функцией copy_thread() (arch/i386/kernel/process.c).
Так же рекомендую функцию do_execve() (fs/exec.c) и do_fork() (kernel/fork.c).
P.S.: тег CODE жутко глючный
|
|
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 12 Мар, 2003 г. - 09:06   |
Интересно. А guardpage- это у меня от винды. Там же тактика - при обращении к этой странице расширить стек.
|
|
RXL
 Новичок Сообщений: 23 | Отправлено: 12 Мар, 2003 г. - 15:08   |
Возможно guardpage есть ву стека пользователя. При создании нити задается его адрес и размер (округленный до страницы) - и вполне может что первая страница защищена от записи.
Для х86 стек кольца 0 не имеет смысла защищать - ведь в него должен быть записан SS:ESP (и возможно CS:EIP - точно не помню) для возврата, и если он переполнится, то процессу кирдык. Этот стек используется только когда процесс вызывает syscall (int 80h).
|
|
SlavaI
 Хороший работник
 Сообщений: 494 | Отправлено: 12 Мар, 2003 г. - 15:33   |
Как то я не понял, это что-же максимальный стек ядра текущего процесса не более 8 кб за вычетом того, что занимают служебные структуры в самом низу.
|
|