2012-04-08 4 views
1

Ich arbeite an einem selbst kompilierten Linux-Kernel. Die Person, die den Kernel geändert hat, hat einige Systemaufrufe hinzugefügt. Was ich tun möchte, ist zu wissen, wo die tatsächliche Routine (.c-Datei) für die spezifische Nummer ist, d. H. Syscall (300), also wie würde ich wissen, wo die Routine für die 300 ist?wie finde ich wo syscall (einige nummer) routine?

Weitere Ausarbeitung: Syscall sollte wissen, welche Datei, die eine kompilierte .c-Datei ist, aufrufen, wenn ich syscall (300), möchte ich diese .c-Datei anzeigen.

Ich usuing Ubuntu 9.10 Freuen Sie sich auf Ihre Eingabe,

+0

Können Sie dies umschreiben: * Was ich tun möchte, ist zu wissen, wo ist die eigentliche Routine für die bestimmte Anzahl ist zB syscall (300), wie würde ich wissen, wo ist die Routine für die 300? gemein mit "wo ist"? Meinst du, was .c-Datei im Kernel enthält seine Implementierung? Oder welche .h-Datei müssen Sie in Ihr Userspace-Programm aufnehmen, um diesen Syscall zu verwenden? –

+0

Fertig, ich hoffe es ist jetzt klarer. Danke, George. – Louis

Antwort

0

Mal sehen, wie der Systemaufruf auf x86_32 implementiert (aussehen there):

500 ENTRY(system_call) 
501  RING0_INT_FRAME     # can't unwind into user space anyway 
502  pushl_cfi %eax     # save orig_eax 
503  SAVE_ALL 
504  GET_THREAD_INFO(%ebp) 
505          # system call tracing in operation/emulation 
506  testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) 
507  jnz syscall_trace_entry 
508  cmpl $(NR_syscalls), %eax 
509  jae syscall_badsys 
510 syscall_call: 
511  call *sys_call_table(,%eax,4) 
512  movl %eax,PT_EAX(%esp)   # store the return value 
[...] 

Wie Sie dort sehen, ist ein Versand Anweisung hier Systemaufruf in Zeile 511:

call *sys_call_table(,%eax,4) 

Also, die Das erste, was Sie tun müssen, ist die sys_call_table Adresse zu bekommen. Die nächste Sache ist, $(NR_syscalls) Wert zu erhalten. Und das letzte ist einfach - Iterieren über alle sys_call_table Werte.

Wenn Sie gdb, vmlinux und /proc/kcore Sie können folgendes tun:

# gdb vmlinux /proc/kcore 

Außerdem Sie objdump -rd vmlinux können die Demontage des Kernels zu entleeren.

0

Die Datei syscall_table.S sollte die Liste enthalten.