system_call 2.6

Тема в разделе "WASM.UNIX", создана пользователем mute, 7 авг 2006.

  1. mute

    mute New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2006
    Сообщения:
    8
    Привет.
    Я дезасемблировал функцию system_call в 2.6 и не обнаружил там обращения к system_call_table хотя в 2.4 все есть. Вопрос к спецам где теперь хранится адрес таблицы вызовов и как system_call обращается к ней?
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    наверное криво дизассемблировал ;)
    Смотри как надо:
    Код (Text):
    1.     # system call handler stub
    2. ENTRY(system_call)
    3.     pushl %eax          # save orig_eax
    4.     SAVE_ALL
    5.     GET_THREAD_INFO(%ebp)
    6.     testl $TF_MASK,EFLAGS(%esp)
    7.     jz no_singlestep
    8.     orl $_TIF_SINGLESTEP,TI_flags(%ebp)
    9. no_singlestep:
    10.                     # system call tracing in operation / emulation
    11.     /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
    12.     testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
    13.     jnz syscall_trace_entry
    14.     cmpl $(nr_syscalls), %eax
    15.     jae syscall_badsys
    16. syscall_call:
    17.     call *sys_call_table(,%eax,4)    # <--- ЗДЕСЬ <---
    18.     movl %eax,EAX(%esp)     # store the return value
    19. syscall_exit:
     
  3. mute

    mute New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2006
    Сообщения:
    8
    это что прямо из ядра взято? ;)
    я пробовал через (gdb) disasm system_call
     
  4. mute

    mute New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2006
    Сообщения:
    8
    Интерсная ситуевина оказывается.
    Код (Text):
    1. (gdb) disas system_call
    2. Dump of assembler code for function system_call:
    3. 0xc0103ed0 <system_call+0>: push %esax
    4. 0xc0103ed1 <system_call+1>: cld
    5. ...............
    6. 0xc0103ef6 <system_call+38>: testb $0x81, 0x8(%ebp)
    7. 0xc0103efa <system_call+42>:jne 0xc0103f64 <syscall_trace_entry>
    8. End of assembler dump.
    как видите вызова нет

    Код (Text):
    1. (gdb) disas syscall_call
    2. Dump of assembler code for function syscall_call:
    3. 0xc0103efc <syscall_call+0>: call *0xc036fd00(,%eax,4) # <==== вот он ====
    4. 0xc0103f03 <syscall_call+7>: mov %eax,0x18(%esp)
    5. End of assembler dump.
     
  5. Bert

    Bert New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    20
    Адрес:
    Russia
    По умолчанию, команда disassemble <arg> дизассемблирует функцию, окружающую arg. Однако здесь, похоже, gdb не может определить начало/конец функции. Всё-таки, system_call() - это не printf(). Да и отладочной информации в твоём ядре, возможно, нет.
    А вообще, use the source, Luke :) Это правильнее будет.
     
  6. azfox

    azfox New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    1
    Привет!
    Вопрос начинающего :)
    Помогите с сисколами:
    нужно прочитать символ с клавиатуры в регистр.
    Линукс. NASM.
    Всего навсего. но eax=3 int 80 ждет нажатия ентера
    для завершения ввода, а мне нужен только 1 символ!
    Плиз!
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Если терминал поддерживает установку атрибутов через RS232, то можно заюзать этот код:
    azfox
    Код (Text):
    1.     mov ebp,esp
    2.     xor edi,edi
    3.  
    4.     ; Get current terminal mode.
    5.     sub esp,9*4 ; make more space for termios
    6.     mov esi,esp ; <- pointer to termios
    7.     push esp
    8.     push edi
    9.     call tcgetattr
    10.  
    11.     ; Disable ICANON and ECHO.
    12.     and DWORD [esi + 12],~10
    13.     push esi
    14.     push edi
    15.     push edi
    16.     call tcsetattr
    17.  
    18.     ; Wait for user input.
    19.     push 1
    20.     push esp
    21.     push edi
    22.     call read
    23.  
    24.     ; Restore normal terminal mode.
    25.     or DWORD [esi + 12],10
    26.     push esi
    27.     push edi
    28.     push edi
    29.     call tcsetattr
    30.  
    31.     mov esp,ebp ; <- fix stack
    32.     push edi
    33.     call _exit
    tcgetattr и tcgetattr можно заменить сисколом ioctl, но формат termios на разных *никсах различается, так что код не будет портабельным.

    Следует заметить, что в эмуляторах консоли этот метод работать не будет.

    ЗЫ: Если всё-таки решите использовать этот метод (ну, другого всё равно нет) с ioctl, могу поискать готовый код, но, возможно, он был написан для GAS.
     
  8. Iceberg

    Iceberg New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    54
    Адрес:
    Санкт-Петербург
    Quantum
    а разве ioctl во всех *никсах одинаковый?
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Iceberg
    Теоретически. По крайней мере, в любом ядре Linux и в любом BSD - да. Но формат структуры различается.