13 Июл, 2003 г. - 18:45
Начало :: Статьи по темам :: Файлы/Примеры :: Обзоры программ
ФОРУМЫ :: Линки :: ЧАВО :: Поиск на сайте :: О нас 
Поиск по сайту:   
Войти
 Имя пользователя
 Пароль
 Запомнить меня


Все еще не зарегистрировались? Регистрация сделает комфортными Ваши посещения этого сайта, предоставит доступ ко многим дополнительным сервисам и настройкам, которые для анонимного пользователя недоступны.

Темы статей
· Все темы
· Графика (19 Дек, 2002)
· Разное (03 Июл, 2003)
· Обзоры (06 Мар, 2003)
· Проекты (10 Янв, 2003)
· Новости (13 Июл, 2003)
· СОМ (17 Янв, 2003)
· Сети (26 Июн, 2003)
· OS (11 Апр, 2003)
· Теория (27 Мая, 2003)
· Web (17 Мар, 2003)
· Драйвера (13 Июл, 2003)

Архив
· Архив статей

Общее
· Наша статистика
· Топ лист сайта
· Список участников


Rambler's Top100 MAFIA's Top100
Rambler's Top100

Форумы
 
Unix и другие :: Current process in Linux
Модерируется: grom
Перейти на страницу ( 1 | 2 Следующая страница )
Автор 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 кб за вычетом того, что занимают служебные структуры в самом низу.
 
Перейти на страницу ( 1 | 2 Следующая страница )