Stavo guardando un po' il kernel e mi stavo chiedendo se è possibile chiamare delle syscall all'interno di un modulo. Per esempio mi chiedevo se è possibile ottenere il pid del processo senza usare la struttura current (giusto per fare un esempio: so che questo non è di nessuna utilità pratica
).Nel kernel 2.6 il simbolo sys_call_table non è esportato, mentre la chiamata sys_getpid() lo è. Allora ho provato a scrivere questo modulo:
- Codice: Seleziona tutto
/*** PROVA.C ***/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/version.h>
#include <asm/unistd.h> // contiene i numeri delle chiamate __NR_xxx
#include <asm/page.h> // per avere le funzioni per la memoria come virt_to_page
#include <asm/linkage.h>
#include <linux/syscalls.h> // x syscall sys_xxx
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Calzo");
int __init repsys_init_module(void);
void repsys_clenup_module(void);
/* Inizializzazione */
int __init prova_init_module(void)
{
printk("PID: %d\n", (int)sys_getpid());
return 0;
}
void prova_clenup_module()
{
}
module_init(prova_init_module);
module_exit(prova_clenup_module);
Compilandolo il risultato è questo:
- Codice: Seleziona tutto
make -C /lib/modules/2.6.35.6/build -I /lib/modules/2.6.35.6/build/include M=/home/calzo/kernel modules
make[1]: Entering directory `/usr/src/linux-2.6.35.6'
CC [M] /home/calzo/kernel/prova.o
/home/calzo/kernel/prova.c:57: warning: function declaration isn't a prototype
Building modules, stage 2.
MODPOST 1 modules
WARNING: "sys_getpid" [/home/calzo/kernel/prova.ko] undefined!
LD [M] /home/calzo/kernel/prova.ko
make[1]: Leaving directory `/usr/src/linux-2.6.35.6'
Ok, mi dice che sys_getpid() non è definita. Però io non me ne curo perchè da /proc/kallsyms vedo che questa funzione è esportata, e quindi dovrebbe essere noto al kernel dove essa si trova: c102405e T sys_getpid.
Quindi carico il modulo, ma il risultato è questo:
- Codice: Seleziona tutto
insmod prova.ko
insmod: error inserting 'prova.ko': -1 Unknown symbol in module
- Codice: Seleziona tutto
Oct 2 15:14:18 SkyNet kernel: prova: Unknown symbol sys_getpid (err 0)
Quindi la domanda: dov'è che sbaglio? se il kernel conosce il l'indirizzo della funzione, non dovrebbe assegnarglielo in fase di caricamento del modulo?
grazie


...o sbaglio (bhè sicuramente sbaglio visto che non lo fa, ma non capisco perchè)