I'm trying to do a vDSO using latest kernel source code. I was following this tutorial https://www.linuxjournal.com/content/creating-vdso-colonels-other-chicken?page=0,0 However I didn't find some functions like update_vsyscall() and vdso directory in linux-4.20.13/arch/x86/vdso. My question is: is there a way to make a virtual syscall, like gettimeofday(), using the new kernel codes?
Asked
Active
Viewed 517 times
2 Answers
4
vdso directory in
arch/x86/entry/vdso
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/x86/entry/vdso?h=v4.20.13
For example, add a function directly to vclock_gettime.c, rebuild the kernel, and reboot
diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c
index 007b3fe9d727..a49bef48a9dc 100644
--- a/arch/x86/entry/vdso/vclock_gettime.c
+++ b/arch/x86/entry/vdso/vclock_gettime.c
@@ -238,3 +238,8 @@ notrace time_t __vdso_time(time_t *t)
}
time_t time(time_t *t)
__attribute__((weak, alias("__vdso_time")));
+
+notrace int __vdso_add(int x, int y)
+{
+ return x + y;
+}
diff --git a/arch/x86/entry/vdso/vdso.lds.S b/arch/x86/entry/vdso/vdso.lds.S
index d3a2dce4cfa9..4b976c119845 100644
--- a/arch/x86/entry/vdso/vdso.lds.S
+++ b/arch/x86/entry/vdso/vdso.lds.S
@@ -25,6 +25,7 @@ VERSION {
__vdso_getcpu;
time;
__vdso_time;
+ __vdso_add;
local: *;
};
}
Write a test case in user mode
gcc -otest test.c vdso64.so
#include <stdio.h>
extern int __vdso_add(int x, int y);
int main()
{
printf("vdso_add: %d\n", __vdso_add(1, 3));
return 0;
}

ccxxshow
- 844
- 6
- 5
-
Thanks Done, but how can I declare my variable in arch/x86/include/asm/vvar.h and then read it in my function? – Massimiliano Di Cavio Mar 29 '19 at 09:45
0
Please see example in linux kernel /src/Documentation/vDSO/vdso_test.c.
not sure how the main() above will work without call vdso_sym()
for example, in vdso_test.c to use gettimeofday:
gtod_t gtod = (gtod_t)vdso_sym("LINUX_2.6", "__vdso_gettimeofday");

Ben Maoz
- 1