Привет. Я дезасемблировал функцию system_call в 2.6 и не обнаружил там обращения к system_call_table хотя в 2.4 все есть. Вопрос к спецам где теперь хранится адрес таблицы вызовов и как system_call обращается к ней?
наверное криво дизассемблировал Смотри как надо: Код (Text): # system call handler stub ENTRY(system_call) pushl %eax # save orig_eax SAVE_ALL GET_THREAD_INFO(%ebp) testl $TF_MASK,EFLAGS(%esp) jz no_singlestep orl $_TIF_SINGLESTEP,TI_flags(%ebp) no_singlestep: # system call tracing in operation / emulation /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */ testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp) jnz syscall_trace_entry cmpl $(nr_syscalls), %eax jae syscall_badsys syscall_call: call *sys_call_table(,%eax,4) # <--- ЗДЕСЬ <--- movl %eax,EAX(%esp) # store the return value syscall_exit:
Интерсная ситуевина оказывается. Код (Text): (gdb) disas system_call Dump of assembler code for function system_call: 0xc0103ed0 <system_call+0>: push %esax 0xc0103ed1 <system_call+1>: cld ............... 0xc0103ef6 <system_call+38>: testb $0x81, 0x8(%ebp) 0xc0103efa <system_call+42>:jne 0xc0103f64 <syscall_trace_entry> End of assembler dump. как видите вызова нет Код (Text): (gdb) disas syscall_call Dump of assembler code for function syscall_call: 0xc0103efc <syscall_call+0>: call *0xc036fd00(,%eax,4) # <==== вот он ==== 0xc0103f03 <syscall_call+7>: mov %eax,0x18(%esp) End of assembler dump.
По умолчанию, команда disassemble <arg> дизассемблирует функцию, окружающую arg. Однако здесь, похоже, gdb не может определить начало/конец функции. Всё-таки, system_call() - это не printf(). Да и отладочной информации в твоём ядре, возможно, нет. А вообще, use the source, Luke Это правильнее будет.
Привет! Вопрос начинающего Помогите с сисколами: нужно прочитать символ с клавиатуры в регистр. Линукс. NASM. Всего навсего. но eax=3 int 80 ждет нажатия ентера для завершения ввода, а мне нужен только 1 символ! Плиз!
Если терминал поддерживает установку атрибутов через RS232, то можно заюзать этот код: azfox Код (Text): mov ebp,esp xor edi,edi ; Get current terminal mode. sub esp,9*4 ; make more space for termios mov esi,esp ; <- pointer to termios push esp push edi call tcgetattr ; Disable ICANON and ECHO. and DWORD [esi + 12],~10 push esi push edi push edi call tcsetattr ; Wait for user input. push 1 push esp push edi call read ; Restore normal terminal mode. or DWORD [esi + 12],10 push esi push edi push edi call tcsetattr mov esp,ebp ; <- fix stack push edi call _exit tcgetattr и tcgetattr можно заменить сисколом ioctl, но формат termios на разных *никсах различается, так что код не будет портабельным. Следует заметить, что в эмуляторах консоли этот метод работать не будет. ЗЫ: Если всё-таки решите использовать этот метод (ну, другого всё равно нет) с ioctl, могу поискать готовый код, но, возможно, он был написан для GAS.
Iceberg Теоретически. По крайней мере, в любом ядре Linux и в любом BSD - да. Но формат структуры различается.