提交 3e116d6f 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

开始注解 VDSO(Virtual Dynamic Shared Object,虚拟动态共享库)

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    oschina | https://my.oschina.net/weharmony
    博客园 | https://www.cnblogs.com/weharmony/
    知乎 | https://www.zhihu.com/people/weharmonyos
    csdn | https://blog.csdn.net/kuangyufei
    51cto | https://harmonyos.51cto.com/column/34
    掘金 | https://juejin.cn/user/756888642000808
    公众号 | 鸿蒙研究站 (weharmonyos)
上级 7de6ba31
......@@ -574,7 +574,7 @@ static int CpuClockGetres(const clockid_t clockID, struct timespec *tp)
return error;
}
#endif
/// 当用户程序进行特定系统调用时(例如clock_gettime(CLOCK_REALTIME_COARSE, &ts)),VDSO代码页会将其拦截;
int clock_gettime(clockid_t clockID, struct timespec *tp)
{
UINT32 intSave;
......@@ -1115,6 +1115,7 @@ int getitimer(int which, struct itimerval *value)
}
#ifdef LOSCFG_KERNEL_VDSO
//
VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)
{
UINT32 intSave;
......@@ -1125,10 +1126,10 @@ VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)
return;
}
OsGetHwTime(&hwTime);
OsGetHwTime(&hwTime);//获取硬件时间
LOS_SpinLockSave(&g_timeSpin, &intSave);
tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);
tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);//
vdsoDataPage->monoTimeSec = tmp.tv_sec;
vdsoDataPage->monoTimeNsec = tmp.tv_nsec;
......
......@@ -54,7 +54,7 @@ LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
#endif
#ifdef LOSCFG_KERNEL_VDSO
OsVdsoTimevalUpdate();
OsVdsoTimevalUpdate();//更新vdso数据页时间,vdso可以直接在用户进程空间绕过系统调用获取系统时间(例如:gettimeofday)
#endif
#ifdef LOSCFG_BASE_CORE_TICK_HW_TIME
......
......@@ -180,12 +180,19 @@ STATIC VOID UnlockVdsoDataPage(VdsoDataPage *vdsoDataPage)
DMB;
vdsoDataPage->lockCount = 0;
}
/// 更新时间,根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页;
/*!
* @brief OsVdsoTimevalUpdate
* 更新时间,根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页;
* @return
*
* @see OsTickHandler 函数
*/
VOID OsVdsoTimevalUpdate(VOID)
{
VdsoDataPage *kVdsoDataPage = (VdsoDataPage *)(&__vdso_data_start);//获取vdso 数据区
LockVdsoDataPage(kVdsoDataPage);//锁住数据页
OsVdsoTimeGet(kVdsoDataPage); //获取时间页时间
OsVdsoTimeGet(kVdsoDataPage); //更新数据页时间
UnlockVdsoDataPage(kVdsoDataPage);//解锁数据页
}
......@@ -281,7 +281,7 @@ int SysClockSettime(clockid_t clockID, const struct timespec *tp)
}
return ret;
}
/// 获取系统时间
int SysClockGettime(clockid_t clockID, struct timespec *tp)
{
int ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册