Есть ли способ создать vDSO с последним ядром? - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь сделать vDSO, используя последний исходный код ядра. Я следовал этому уроку https://www.linuxjournal.com/content/creating-vdso-colonels-other-chicken?page=0,0 Однако я не нашел некоторых функций, таких как update_vsyscall () и каталог vdso в linux-4.20.13 / arch / x86 / vdso. Мой вопрос: есть ли способ сделать виртуальный системный вызов, как gettimeofday (), используя новые коды ядра?

1 Ответ

0 голосов
/ 28 марта 2019

каталог vdso в

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

Например, добавить функцию непосредственно в vclock_gettime.c, пересобрать ядро ​​и перезагрузить

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: *;
    };
 }

Написать тестовый пример в пользовательском режиме

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;
}
...