Como você sabe como declarar uma variável compartilhada e acessá-la do kernel e do vDSO, é possível usar isso: declarar uma nova variável e incrementá-la a partir do vDSO sempre que ela for chamada.
Atualmente, estou tentando implementar meu próprio VDSO. Eu usei este tutorial que explica como fazer isso para um kernel 2.6. p>
Eu testei e consegui isso funcionar. (Consegui criar uma variável do kernel e acessá-la da userland).
Existe uma maneira de ser conhecido no kernel quando o vdso é chamado? Eu suponho que isso não pode ser feito de forma síncrona (como o vdso é tratado no userland). Mas existe alguma possibilidade (mesmo suja) do kernel para saber se a função foi chamada (talvez com um ponto de interrupção de hardware ou algo assim)?
O que eu gostaria de fazer é algo como a função my_vdso_has_been_called()
) neste código:
void update_vsyscall(/* […] */) {
// […]
if(my_vdso_has_been_called())
do_something();
}
Nota: a função update_vsyscall
pode ser encontrada em arch/x86/kernel/vsyscall_64.c
Como você sabe como declarar uma variável compartilhada e acessá-la do kernel e do vDSO, é possível usar isso: declarar uma nova variável e incrementá-la a partir do vDSO sempre que ela for chamada.