http://lishiwen4.github.io/linux/vdso-and-syscall https://vvl.me/2019/06/linux-syscall-and-vsyscall-vdso-in-x86/ 更多...
函数 | |
LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage | __attribute__ ((__used__)) |
数据页提供内核映射给用户进程的内核时数据 更多... | |
UINT32 | OsVdsoInit (VOID) |
vdso初始化 更多... | |
LOS_MODULE_INIT (OsVdsoInit, LOS_INIT_LEVEL_KMOD_EXTENDED) | |
STATIC INT32 | OsVdsoMap (LosVmSpace *space, size_t len, PADDR_T paddr, VADDR_T vaddr, UINT32 flag) |
OsVdsoMap 映射,这里先通过内核地址找到 vdso的物理地址,再将物理地址映射到进程的线性区. 结论是每个进程都可以拥有自己的 vdso区,映射到同一个块物理地址. 更多... | |
vaddr_t | OsVdsoLoad (const LosProcessCB *processCB) |
OsVdsoLoad 为指定进程加载vdso 本质是将系统镜像中的vsdo部分映射到进程空间 更多... | |
STATIC VOID | LockVdsoDataPage (VdsoDataPage *vdsoDataPage) |
对数据页加锁 更多... | |
STATIC VOID | UnlockVdsoDataPage (VdsoDataPage *vdsoDataPage) |
对数据页加锁 更多... | |
VOID | OsVdsoTimevalUpdate (VOID) |
OsVdsoTimevalUpdate 更新时间,根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页; 更多... | |
变量 | |
STATIC size_t | g_vdsoSize |
http://lishiwen4.github.io/linux/vdso-and-syscall https://vvl.me/2019/06/linux-syscall-and-vsyscall-vdso-in-x86/
基本概念: VDSO(Virtual Dynamic Shared Object,虚拟动态共享库)相对于普通的动态共享库,区别在于 其so文件不保存在文件系统中,存在于系统镜像中,由内核在运行时确定并提供给应用程序,故称为虚拟动态共享库。 OpenHarmony系统通过VDSO机制实现上层用户态程序可以快速读取内核相关数据的一种通道方法, 可用于实现部分系统调用的加速,也可用于实现非系统敏感数据(硬件配置、软件配置)的快速读取。 运行机制: VDSO其核心思想就是内核看护一段内存,并将这段内存映射(只读)进用户态应用程序的地址空间, 应用程序通过链接vdso.so后,将某些系统调用替换为直接读取这段已映射的内存从而避免系统调用达到加速的效果。 VDSO总体可分为数据页与代码页两部分: 数据页提供内核映射给用户进程的内核时数据; 代码页提供屏蔽系统调用的主要逻辑; 如下图所示,当前VDSO机制有以下几个主要步骤: ① 内核初始化时进行VDSO数据页的创建; ② 内核初始化时进行VDSO代码页的创建; ③ 根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页; ④ 用户进程创建时将代码页映射进用户空间; ⑤ 用户程序在动态链接时对VDSO的符号进行绑定; ⑥ 当用户程序进行特定系统调用时(例如clock_gettime(CLOCK_REALTIME_COARSE, &ts)),VDSO代码页会将其拦截; ⑦ VDSO代码页将正常系统调用转为直接读取映射好的VDSO数据页; ⑧ 从VDSO数据页中将数据传回VDSO代码页; ⑨ 将从VDSO数据页获取到的数据作为结果返回给用户程序;
在文件 los_vdso.c 中定义.
LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage __attribute__ | ( | (__used__) | ) |
数据页提供内核映射给用户进程的内核时数据
STATIC VOID LockVdsoDataPage | ( | VdsoDataPage * | vdsoDataPage | ) |
LOS_MODULE_INIT | ( | OsVdsoInit | , |
LOS_INIT_LEVEL_KMOD_EXTENDED | |||
) |
UINT32 OsVdsoInit | ( | VOID | ) |
vdso初始化
在文件 los_vdso.c 第 96 行定义.
vaddr_t OsVdsoLoad | ( | const LosProcessCB * | processCB | ) |
OsVdsoLoad 为指定进程加载vdso
本质是将系统镜像中的vsdo部分映射到进程空间
processCB |
在文件 los_vdso.c 第 147 行定义.
STATIC INT32 OsVdsoMap | ( | LosVmSpace * | space, |
size_t | len, | ||
PADDR_T | paddr, | ||
VADDR_T | vaddr, | ||
UINT32 | flag | ||
) |
OsVdsoMap 映射,这里先通过内核地址找到 vdso的物理地址,再将物理地址映射到进程的线性区.
结论是每个进程都可以拥有自己的 vdso区,映射到同一个块物理地址.
flag | |
len | 映射长度 |
paddr | 物理地址 |
space | 进程空间 |
vaddr | 虚拟地址 |
在文件 los_vdso.c 第 122 行定义.
VOID OsVdsoTimevalUpdate | ( | VOID | ) |
OsVdsoTimevalUpdate
更新时间,根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页;
在文件 los_vdso.c 第 203 行定义.
STATIC VOID UnlockVdsoDataPage | ( | VdsoDataPage * | vdsoDataPage | ) |
STATIC size_t g_vdsoSize |
虚拟动态共享库大小
在文件 los_vdso.c 第 94 行定义.