[PATCH v7 7/9] ARM: add vdso user-space code
Nathan Lynch
Nathan_Lynch at mentor.com
Sat Jun 28 09:13:42 PDT 2014
On 06/28/2014 10:26 AM, Russell King - ARM Linux wrote:
> On Sun, Jun 22, 2014 at 10:11:56PM -0500, Nathan Lynch wrote:
>> Place vdso-related user-space code in arch/arm/kernel/vdso/.
>>
>> It is almost completely written in C with some assembly helpers to
>> load the data page address, sample the counter, and fall back to
>> system calls when necessary.
>>
>> If CONFIG_ARM_ARCH_TIMER is not enabled, the vdso cannot service
>> high-resolution clocks and falls back to syscalls. Low-resolution
>> clocks e.g. CLOCK_REALTIME_COARSE can be serviced regardless.
>
> Okay, how is this used by userspace?
Primarily it's intended to be transparent to userspace applications;
glibc -- with a patch -- detects the VDSO at startup and binds the
appropriate routines to the VDSO's.
However, even an unpatched glibc makes the VDSO symbols available for
lookup via dlsym, which has been convenient for testing.
> It seems that on ARM, we generate a dso with these symbols:
>
> DYNAMIC SYMBOL TABLE:
> 000001e4 l d .eh_frame_hdr 00000000 .eh_frame_hdr
> 00000000 g DO *ABS* 00000000 LINUX_3.17 LINUX_3.17
> 000003c4 g DF .text 00000080 LINUX_3.17 __kernel_clock_getres
> 00000444 g DF .text 0000002c LINUX_3.17 __kernel_gettimeofday
> 00000298 g DF .text 0000012c LINUX_3.17 __kernel_clock_gettime
>
> whereas, x86-64 generates this:
>
> DYNAMIC SYMBOL TABLE:
> ffffffffff700330 l d .eh_frame_hdr 0000000000000000 .eh_frame_hdr
> ffffffffff700600 w DF .text 00000000000002b9 LINUX_2.6 clock_gettime
> 0000000000000000 g DO *ABS* 0000000000000000 LINUX_2.6 LINUX_2.6
> ffffffffff7008c0 g DF .text 000000000000015a LINUX_2.6 __vdso_gettimeofday
> ffffffffff700a40 g DF .text 000000000000003d LINUX_2.6 __vdso_getcpu
> ffffffffff7008c0 w DF .text 000000000000015a LINUX_2.6 gettimeofday
> ffffffffff700a20 w DF .text 0000000000000016 LINUX_2.6 time
> ffffffffff700a40 w DF .text 000000000000003d LINUX_2.6 getcpu
> ffffffffff700600 g DF .text 00000000000002b9 LINUX_2.6 __vdso_clock_gettime
> ffffffffff700a20 g DF .text 0000000000000016 LINUX_2.6 __vdso_time
>
> hence references to gettimeofday automatically get resolved to the
> vdso version without needing C library updates.
Hmm, I'm not sure. I had wondered why x86-64's vdso has the aliases
(clock_gettime --> __vdso_clock_gettime). Most other architectures'
VDSOs don't.
> Or... do we need a glibc update to make use of this?
That is the idea, yes. You don't have to rebuild applications but glibc
needs to be updated to dispatch its gettimeofday and clock_gettime to
the VDSO.
I'm in the process of refreshing and re-testing that patch. I posted an
RFC to libc-alpha a few months back:
https://www.sourceware.org/ml/libc-alpha/2014-02/msg00680.html
I should have a new one posted within a couple days.
More information about the linux-arm-kernel
mailing list