2011-12-07 13 views
20

ho creato due nuove chiamate di sistema, ma quando provo a testarli ottengo il seguente errore:Nuovo syscall non trovato (linux kernel 3.0.0) dove dovrei iniziare a cercare?

[email protected]:~/test$ gcc test.c 
test.c: In function ‘newcall’: 
test.c:6:17: error: ‘sys_get_slob_amnt_free’ undeclared (first use in this function) 
test.c:6:17: note: each undeclared identifier is reported only once for each function it appears in 
[email protected]:~/test$ 

Ho provato anche questo con syscall (sys_get_slob_amnt_free) con lo stesso risultato.

Ecco il codice di prova:

#include <unistd.h> 
#include <stdio.h> 

unsigned long newcall() 
{ 
     return syscall(__NR_get_slob_amnt_free); 
} 
int main() 
{ 
     printf("%d\n", newcall()); 
     return 0; 
} 

Per aggiungere questi li ho messi nella tabella syscall (/usr/src/linux-3.0/include/asm-generic/unistd.h)

#define __NR_sendmmsg 269 
__SC_COMP(__NR_sendmmsg, sys_ sendmmsg, compat_sys_sendmmsg) 
/** my changes here **/ 
#define __NR_get_slob_amnt_free 270 
__SYSCALL(__NR__get_slob_amnt_free, sys_get_slob_amnt_free) 
#define __NR_get_slob_amnt_claimed 271) 
__SYSCALL(__NR_get_slob_amnt_claimed, sys_get_slob_amnt_claimed) 
/** /my changes **/ 

#undef __NR_syscalls 
#define __NR_syscalls 272 

E qui è il codice per le chiamate stesse (../linux-3.0/mm/slob.c)

asmlinkage unsigned int sys_get_slob_amnt_claimed() 
{ 
    return memClaimed; 
} 

asmlinkage unsigned int sys_get_slob_amnt_free() 
{ 
    return memClaimed - memUsed; 
} 

Sto cercando di capire se sto eseguendo il billing del codice di test (forse devo includere qualcosa di più? o collegare qualcosa?) O se ho trascurato qualcosa nell'aggiunta di syscall in primo luogo. Con il tempo necessario per ricompilare il kernel, mi aiuterebbe davvero sapere dove iniziare a cercare.

Certo, si tratta di un compito a casa. L'incarico riguarda la modifica di slob.c, su cui ho una buona idea. Lo sto facendo solo per capire se le modifiche che ho apportato finora vanno ovunque. Apprezzo qualsiasi consiglio che puoi dare. Grazie!

Modifica: risolto (o almeno risolto abbastanza per me).

Mille grazie a bdonlan! Sebbene lo syscall(270) non lo facesse direttamente, mi ha trascinato nella memoria - c'è un altro insieme di numeri rilevanti che stavo trascurando del tutto. Il file /linux-3.0/arch/x86/kernel/syscall_table_32.c doveva essere modificato anche per aggiungere correttamente il syscall.

Una volta ho aggiunto .long sys_get_slob_amnt_free e .long sys_get_slob_amnt_claimed a tale file e ricostruito il kernel, ho potuto colpire le mie chiamate di sistema utilizzando syscall(###) dove ### è la numerazione in syscall_table_32.c (non la numerazione in unistd.h). Mi sento come se dovessero corrispondere - ma dal momento che questo è solo glorificato informazioni di debug penso che lascerò quel mistero per un'altra volta e lo chiamerò semplicemente.

+1

È davvero lo stesso codice che hai compilato? Non vedo alcuna chiamata a sys_get_slob_amnt_free nel tuo codice di test. – bdonlan

+0

Forse hai bisogno di aggiungere linee per le tue funzioni di syscall a linux-3.0/mm/slob.h? –

+0

@RobinGreen, che non influisce sulla compilazione dello spazio utente (e comunque è il percorso sbagliato) – bdonlan

risposta

2

C'è un altro insieme di numeri rilevanti che era necessario aggiungere. Anche il file /linux-3.0/arch/x86/kernel/syscall_table_32.c doveva essere modificato per poter aggiungere correttamente syscall.

Una volta ho aggiunto .long sys_get_slob_amnt_free e .long sys_get_slob_amnt_claimed a tale file e ricostruito il kernel, ho potuto colpire le mie chiamate di sistema utilizzando syscall (###), dove ### è la numerazione in syscall_table_32.c (non la numerazione in unistd.h)

Problemi correlati