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);
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'
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)
grazie