Поиск:

Ответ в темуСоздание новой темы Создание опроса
> system_call 
:(
    Опции темы
cupper
Дата 5.3.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



 system_call

Всем снова сдрасте. У меня новая проблема smile Мне нужно модифицировать (клонировать) обработчик 80 прерывания, она же функция system_call. Но он везде где я находил описан очень и очень хренова. Обычно все описание заключается в том что сказано: в eax передается номер вызываемой функции, он проверяется, далее запускается, если чтото не так то производются сложные действия для коректного возврата. Без каких либо подробностей. Мне нужно сделать практически аналогичный обработчик за некими маленькими отклонениями. А чтобы понять где эти маленькие поправления должны быть нужно понять как там все это работает, до последнего винтика. Прошу вашей помощи в разборе. Начнем по порядку.

Во первых сделаем для простоты такое упущение: ничего лишнего кроме как посмотреть номер вызываемой функции, вызвать ее и вернуть результат, ни надо, пока нужен самый минимум чтобы работал в идеальных условиях. И второе: нужно четко осознать те моменты где прямым образом фигурируют какие либо опоминания об пользовательском пространстве (дескрипторы GDT, DPL = 3, процесс вызвавший прерывание).

 
Код

   .pushsection .kprobes.text, "ax" # это относиться к обработчику или нет ? 
   # system call handler stub 
ENTRY(system_call) 
   RING0_INT_FRAME         # подготавливается стек ядра? Но как оно работает 
   pushl %eax         # save orig_eax 
   CFI_ADJUST_CFA_OFFSET 4 # не понял что это ? 
   SAVE_ALL # сохраняем в стек все необходимые регистры 
   GET_THREAD_INFO(%ebp) # получаем инфу о треде вызвавшем прерывание ? Но кукую и для чего она ? 
               # system call tracing in operation / emulation 
   testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) # проверка чего ?) Того что из данного треда можно делать системные вызовы ? 
   jnz syscall_trace_entry # сюда попадем если проверка не прошла, но в этой метке все равно может произойти вызов (см. ниже) 
   cmpl $(nr_syscalls), %eax 
   jae syscall_badsys # сюда прыгаем если номер системного переданный в eax неправильны, и далее возвращается ENOSYS 
syscall_call: 
   call *sys_call_table(,%eax,4) # самое суть 
   movl %eax,PT_EAX(%esp)      # кладем результат работы обратно в eax 
syscall_exit: 
   LOCKDEP_SYS_EXIT # нах это ? 
   DISABLE_INTERRUPTS(CLBR_ANY)   # make sure we don't miss an interrupt 
               # setting need_resched or sigpending 
               # between sampling and the iret 
                                        # На сколько я понял это некий аналог "For DISABLE_INTERRUPTS/ENABLE_INTERRUPTS (aka "cli"/"sti")" 
   TRACE_IRQS_OFF # не понял что это 
   movl TI_flags(%ebp), %ecx # кладем в ecx то чем можно идентифицировать тред который запустил прерывания, или его отдельное значение 
   testl $_TIF_ALLWORK_MASK, %ecx   # current->work 
                                        # смотрим работаетли еще тред вызвавший прерывание ? 
   jne syscall_exit_work # сюда пошли если процесс уже не работает ? 
 
restore_all: # а сюда для выхода в прерывания при работающем процессе ? 
   TRACE_IRQS_IRET # посмотрели что прерывание уже неработает ? Оо 
restore_all_notrace: # подготовка в козврату в юзерспейс 
   movl PT_EFLAGS(%esp), %eax   # mix EFLAGS, SS and CS 
   # Warning: PT_OLDSS(%esp) contains the wrong/random values if we 
   # are returning to the kernel. 
   # See comments in process.c:copy_thread() for details. 
   movb PT_OLDSS(%esp), %ah 
   movb PT_CS(%esp), %al 
   andl $(X86_EFLAGS_VM | (SEGMENT_TI_MASK << 8) | SEGMENT_RPL_MASK), %eax # макросы однозначно образую число 20403h, оно кладеться в eax 
   cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax # тут макросы образую также однозначно число 403h и эта проверка пройдет всегда, зачем она тогда О_о 
   CFI_REMEMBER_STATE # ??? 
   je ldt_ss         # returning to user-space with LDT SS 
                                        # какая то махинация со стеком 
restore_nocheck: 
   RESTORE_REGS 4         # skip orig_eax/error_code 
                                        # восстанавливаем значения регистров (см. ниже) 
   CFI_ADJUST_CFA_OFFSET -4 # этот макрос на сколько я понял что то вроде метки на стеке откудова брать куда класть значения регистров 
irq_return: 
   INTERRUPT_RETURN # вот тут то мы вызовем заветную инструкцию iret с помощью которой перейдем в usep space и произведем понижение привелегий (вот только я незаметил момента когда мы клали в стек необходимые ей параметры ?) 
/* а все что дальше идет зачем ? */ 

 
Код

syscall_trace_entry: # проверка не прошла прыгнули сюда и тут еще один шанс 
   movl $-ENOSYS,PT_EAX(%esp) 
   movl %esp, %eax 
   call syscall_trace_enter # что делает функция ? 
   /* What it returned is what we'll actually use.  */ 
   cmpl $(nr_syscalls), %eax 
   jnae syscall_call # и бац все равно можем сделать то что хотели, проделав какуюто преобработку, какую ? 
   jmp syscall_exit 
END(syscall_trace_entry) 

При таком вызове макроса

 
Код

restore_nocheck: 
   RESTORE_REGS 4 

как он будет выполнятся ? Сначала выполнится чертвертая метка, потом 1-3 и он закончит свою работу выполнив POP_GS \pop ?

 
Код

.macro RESTORE_REGS pop=0 
   RESTORE_INT_REGS 
1:   popl %ds 
   CFI_ADJUST_CFA_OFFSET -4 
   /*CFI_RESTORE ds;*/ 
2:   popl %es 
   CFI_ADJUST_CFA_OFFSET -4 
   /*CFI_RESTORE es;*/ 
3:   popl %fs 
   CFI_ADJUST_CFA_OFFSET -4 
   /*CFI_RESTORE fs;*/ 
   POP_GS \pop 
.pushsection .fixup, "ax" 
4:   movl $0, (%esp) 
   jmp 1b 
5:   movl $0, (%esp) 
   jmp 2b 
6:   movl $0, (%esp) 
   jmp 3b 
.section __ex_table, "a" 
   .align 4 
   .long 1b, 4b 
   .long 2b, 5b 
   .long 3b, 6b 
.popsection 
   POP_GS_EX 
.endm 

 
Код

.macro POP_GS pop=0 # что оно делает ?) 
   addl $(4 + \pop), %esp 
   CFI_ADJUST_CFA_OFFSET -(4 + \pop) 
.endm 

фух, несколько часов пост делал. Простите за мноо букф и еще больше вопросов, просто нужно все это понять %) Отвечайте по возможности лучше кусочками, так проще мазайку будет сложить.

PS. И кстати если получится сложить все это в единую картину с хорошим описание то это будет очень хороший мануал, коих нету на белом свете. 
PM MAIL   Вверх
MAKCim
Дата 5.3.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# подготавливается стек ядра? Но как оно работает

http://lxr.linux.no/linux+v2.6.19/arch/i38...el/entry.S#L184


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# не понял что это ? 

читать про формат dwarf2
необходим для создания отладочной инфы


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# получаем инфу о треде вызвавшем прерывание ? Но кукую и для чего она ? 

в ebp помещаем _адрес_ структуры thread_info текущего процесса


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# проверка чего ?) Того что из данного треда можно делать системные вызовы ? 

проверка, включена ли для процесса трассировка системных вызовов


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# На сколько я понял это некий аналог "For DISABLE_INTERRUPTS/ENABLE_INTERRUPTS (aka "cli"/"sti")"

да


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# смотрим работаетли еще тред вызвавший прерывание ? 

смотрим, нужно ли обрабатывать спец. случаи (ака если процессу доставлен сигнал)


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# сюда пошли если процесс уже не работает ? 

если нужно обработать спец. случай


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
cupper
Дата 7.3.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(MAKCim @ 5.3.2010,  17:44)
Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# смотрим работаетли еще тред вызвавший прерывание ? 

смотрим, нужно ли обрабатывать спец. случаи (ака если процессу доставлен сигнал)


Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# сюда пошли если процесс уже не работает ? 

если нужно обработать спец. случай

а можно чуть более поподробней а спец. случаях ? не совсем понял о чем речь

Добавлено через 3 минуты
Цитата(MAKCim @ 5.3.2010,  17:44)
Цитата(cupper @  5.3.2010,  15:19 Найти цитируемый пост)
# подготавливается стек ядра? Но как оно работает

http://lxr.linux.no/linux+v2.6.19/arch/i38...el/entry.S#L184

хе smile
Код

#define RING0_INT_FRAME \
        CFI_STARTPROC simple;\
        CFI_SIGNAL_FRAME;\
        CFI_DEF_CFA esp, 3*4;\
        /*CFI_OFFSET cs, -2*4;*/\
        CFI_OFFSET eip, -3*4

макросы то я все смотрел smile хотелось бы механику их понять. Че за магические числа 3*4, -2*4, -3*4 ...
PM MAIL   Вверх
MAKCim
Дата 9.3.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(cupper @  7.3.2010,  21:30 Найти цитируемый пост)
а можно чуть более поподробней а спец. случаях ? не совсем понял о чем речь

TIF* флаги
http://tomoyo.sourceforge.jp/cgi-bin/lxr/s...read_info.h#L76


Цитата(cupper @  7.3.2010,  21:30 Найти цитируемый пост)
макросы то я все смотрел  хотелось бы механику их понять. Че за магические числа 3*4, -2*4, -3*4 ... 

я ж написал, читайте про dwarf2 и реализацию в gcc


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Linux/Unix"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Linux/Unix | Следующая тема »


 




[ Время генерации скрипта: 0.1317 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.