101 PRINT_ERR(
"VDSO Init Failed!\n");
129 PRINT_ERR(
"VDSO Load Failed! : LOS_ArchMmuMap!\n");
151 UINT32 flag = VM_MAP_REGION_FLAG_PERM_USER | VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_EXECUTE;
153 if ((processCB == NULL) || (processCB->
vmSpace == NULL)) {
160 if (vdsoRegion == NULL) {
161 PRINT_ERR(
"%s %d, region alloc failed in vdso load\n", __FUNCTION__, __LINE__);
164 vdsoRegion->
regionFlags |= VM_MAP_REGION_FLAG_VDSO;
171 PRINT_ERR(
"%s %d, free region failed, ret = %d\n", __FUNCTION__, __LINE__, ret);
179 return (vdsoRegion->
range.
base + PAGE_SIZE);
STATUS_T LOS_ArchMmuMap(LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T paddr, size_t count, UINT32 flags)
LOS_ArchMmuMap 映射进程空间虚拟地址区间与物理地址区间 所谓的map就是生成L1,L2页表项的过程
STATIC INT32 OsVdsoMap(LosVmSpace *space, size_t len, PADDR_T paddr, VADDR_T vaddr, UINT32 flag)
OsVdsoMap 映射,这里先通过内核地址找到 vdso的物理地址,再将物理地址映射到进程的线性区. 结论是每个进程都可以拥有自己的 vdso区,映射到同一个块物理地址.
UINT32 OsVdsoInit(VOID)
vdso初始化
VOID OsVdsoTimevalUpdate(VOID)
OsVdsoTimevalUpdate 更新时间,根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页;
vaddr_t OsVdsoLoad(const LosProcessCB *processCB)
OsVdsoLoad 为指定进程加载vdso 本质是将系统镜像中的vsdo部分映射到进程空间
LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage __attribute__((__used__))
数据页提供内核映射给用户进程的内核时数据
LOS_MODULE_INIT(OsVdsoInit, LOS_INIT_LEVEL_KMOD_EXTENDED)
STATIC VOID LockVdsoDataPage(VdsoDataPage *vdsoDataPage)
对数据页加锁
STATIC VOID UnlockVdsoDataPage(VdsoDataPage *vdsoDataPage)
对数据页加锁
CHAR __vdso_data_start
数据区起始地址 __vdso_data_start < __vdso_text_start
CHAR __vdso_text_end
代码区结束地址
CHAR __vdso_text_start
代码区起始地址
STATIC INLINE STATUS_T LOS_MuxAcquire(LosMux *m)
STATIC INLINE STATUS_T LOS_MuxRelease(LosMux *m)
PADDR_T LOS_PaddrQuery(VOID *vaddr)
通过虚拟地址查询映射的物理地址
STATUS_T LOS_RegionFree(LosVmSpace *space, LosVmMapRegion *region)
释放进程空间指定线性区
LosVmMapRegion * LOS_RegionAlloc(LosVmSpace *vmSpace, VADDR_T vaddr, size_t len, UINT32 regionFlags, VM_OFFSET_T pgoff)
int memcmp(const void *str1, const void *str2, size_t n)
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间
VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)
将最新的时间刷进数据页