静态TLS的访问方法、装置、电子设备及存储介质与流程

文档序号:32967825发布日期:2023-01-17 19:42阅读:123来源:国知局
静态TLS的访问方法、装置、电子设备及存储介质与流程
静态tls的访问方法、装置、电子设备及存储介质
技术领域
1.本发明涉及互联网技术领域,尤其涉及一种静态tls的访问方法、装置、电子设备及存储介质。


背景技术:

2.windows xp系统对静态tls(thread local storage,线程局部存储)的支持存在如下问题,即:仅支持程序启动时静态依赖的模块使用静态tls。对动态加载的动态链接库dll只能使用tls api(application programming interface,应用程序接口)函数这种显式调用方式。但是例如chromium浏览器的主逻辑模块chrome.dll是动态加载的。chromium自m49之后不再支持windows xp系统,同时大量使用了c++11标准引入的局部静态变量线程安全初始化特性,而这个特性利用了静态tls来实现。因此,基于chromium项目的浏览器要兼容windows xp系统,需要解决动态加载下使用静态tls的问题,否则在windows xp下将无法加载运行。为了使其支持windows xp系统,常见的作法是通过编译开关(/zc:threadsafeinit-)关闭局部静态变量线程安全初始化特性,这样就规避了使用它带来的静态tls。但是这样做可能导致局部静态变量初始化出现竞争,从而需要在更新内核下修改大量的业务代码来解决竞争问题,给内核升级带来挑战并且人工成本高,并有可能对涉及的业务代码修改不彻底导致如崩溃等潜在的问题,运行的可靠性较差。


技术实现要素:

3.针对现有技术中的问题,本发明实施例提供一种静态tls的访问方法、装置、电子设备及存储介质。
4.具体地,本发明实施例提供了以下技术方案:
5.第一方面,本发明实施例提供了一种静态tls的访问方法,包括:
6.可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括tls数据块;
7.所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
8.在一些示例中,在所述可执行文件启动后静态加载预先创建的库文件之前,还包括:
9.创建所述库文件,并安装所述库文件以通过所述库文件导出的lib文件实现所述库文件与所述可执行文件的链接。
10.在一些示例中,所述可执行文件启动后静态加载预先创建的库文件,包括:
11.所述可执行文件启动后,静态加载所述库文件,并基于所述库文件的tls数据块为所述库文件分配tls索引和各线程对应的tls数据空间。
12.在一些示例中,所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls,包括:
13.在所述可执行文件运行过程动态加载所述目标动态链接库或创建所述线程后,通过dllmain入口函数,为所述目标动态链接库或所述线程分配所述tls索引和对应的tls数据空间。
14.在一些示例中,在为所述目标动态链接库或所述线程分配所述tls索引和对应的tls数据空间之后,还包括:
15.调用tls全局变量的初始化函数对tls变量进行初始化。
16.在一些示例中,还包括:
17.检测系统版本;
18.如果所述系统版本高于预设版本,则卸载所述库文件。
19.第二方面,本发明实施例还提供了一种静态tls的访问装置,包括:
20.库文件加载模块,用于在可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括tls数据块;
21.静态tls访问模块,用于在所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
22.第三方面,本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述的静态tls的访问方法的步骤。
23.第四方面,本发明实施例还提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所述的静态tls的访问方法的步骤。
24.第五方面,本发明实施例还提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现如第一方面所述的静态tls的访问方法的步骤。
25.由上面技术方案可知,本发明实施例提供的静态tls的访问方法、装置、电子设备及存储介质,可执行文件启动后静态加载预先创建好的并且与可执行文件预先链接的库文件,当可执行文件运行过程中动态加载目标动态链接库或创建线程后,便可以根据库文件中分配的tls数据块为目标动态链接库或线程分配访问的静态tls。这样,可以以较小的代价解决一些不支持动态加载的动态链接库使用静态tls变量的问题,相比于现有技术中需要修改大量代码的方式解决一些不支持动态加载的动态链接库使用静态tls变量的问题,具有风险小、人力成本低、简单易行的优点,还可以减少冲突,提升程序运行的稳定性。
附图说明
26.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
27.图1为本发明一实施例提供的静态tls的访问方法的流程图;
28.图2为本发明一实施例提供的静态tls的访问装置的结构框图;
29.图3为本发明一实施例提供的电子设备的结构示意图。
具体实施方式
30.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
31.图1示出了本发明实施例提供的静态tls的访问方法的流程图。如图1所示,本发明实施例提供的静态tls的访问方法,包括如下步骤:
32.步骤101:可执行文件启动后静态加载预先创建的库文件,其中,库文件与可执行文件预先链接,库文件包括tls数据块。
33.其中,tls(thread local storage)指线程局部存储,静态tls是使用微软vc扩展__declspec(thread)或者关键字thread_local(c++11)声明的变量,由编译器和系统加载器协同为其提供特别的支持,主要是在teb中维护相应的数据结构,teb(thread environment block)为线程环境块,是操作系统维护的线程相关信息的数据结构。
34.在本发明的一个实施例中,可执行文件通常为.exe文件。库文件可以是.dll文件。其中,库文件是预先创建好的,并与可执行文件预先链接。这样,可执行文件启动后,静态加载所述库文件,并基于所述库文件的tls数据块为所述库文件分配tls索引和各线程对应的tls数据空间。
35.具体来说,在可执行文件启动后静态加载预先创建的库文件之前,创建库文件,并安装库文件以通过所述库文件导出的lib文件实现库文件与所述可执行文件的链接,即,让可执行文件静态依赖所述库文件。比如,创建一个占位用的动态链接库模块作为库文件(.dll),xpsup.dll,并为其定义足够的tls数据块,这样,可执行文件启动后,可以静态加载该xpsup.dll,系统加载器会为其分配tls slot(即:tls索引)和各线程的tls数据空间。其中,tls slot指为每个库文件分配的访问tls数据的索引。
36.步骤102:所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
37.在本发明的一个实施例中,可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls,包括:在所述可执行文件运行过程动态加载所述目标动态链接库或创建所述线程后,通过dllmain入口函数,为所述目标动态链接库或所述线程分配所述tls索引和对应的tls数据空间。
38.该示例中,在为所述目标动态链接库或所述线程分配所述tls索引和对应的tls数据空间之后,还包括:调用tls全局变量的初始化函数对tls变量进行初始化。
39.具体来说,在目标动态链接库加载过程中,以及在新线程创建后,会通过dllmain入口函数的通知事件(如dll_process_attach/dll_thread_attatch等),在这个时机调整目标动态链接库的tls slot与xpsup.dll的tls slot相同,并调用tls全局变量的初始化函数,这样,tls相关的支持设施就已经完全准备好,tls变量就能被目标动态链接库安全的访问和使用。
40.以windows xp系统为例,目标动态链接库以chromium的浏览器的主逻辑模块chrome.dll为例,通过一个占位的壳模块xpsup.dll,使它在进程启动时作为静态依赖模块
被加载,可以利用windows xp已有的能力解决tls相关数据的分配和维护工作,chrome.dll加载之后直接使用其提供的tls数据块的数据空间,从而可以解决chrome.dll中使用静态tls在xp下运行的问题。
41.本发明的实施例,有效地解决了基于开源chromium项目的浏览器在继续支持windows xp前提下需要升级内核代码的情况,即:不再需要修改任何需要线程安全初始化的静态变量的代码,从而可以减少冲突,也不必再关心内核中的静态变量是否需要进行额外保证线程安全的初始化。因此,解决了此类问题导致的崩溃和数据破坏。
42.本发明的实施例中,创建一个占位用的动态链接库模块(dll)作为库文件xpsup.dll,并为其分配足够的tls数据块,保证大于chrome.dll模块中的tls数据块大小即可。在xpsup.dll可以仅提供简单的逻辑,如获取其tls slot的接口函数等。保证xpsup.dll本身不使用这些tls变量。
43.在chrome.exe(或其他浏览器进程启动模块,即exe)对xpsup.dll模块进行静态依赖,使得其在进程启动过程中即静态加载,则系统加载器(loader)会为它分配tls slot和各线程的tls数据空间,并维护他们。
44.在chrome.dll加载过程中,以及在新线程创建后,会通过dllmain入口函数通知事件(dll_process_attach/dll_thread_attatch等),在这个时机调整chrome.dll的tls slot与xpsup.dll的相同,并调用tls全局变量的初始化函数。之后tls相关的支持设施就已经完全准备好,tls变量就能被安全的访问和使用。
45.需要说明的是,本发明实施例中的库文件的tls数据块可以认为成是一个占位模块,即:该tls数据块作为一个占位模块,不允许其访问静态tls,这样,进而,可以避免chrome.dll模块对tls数据块进行争抢或者数据的互相覆盖而导致数据被破坏的可能。而现有技术中的tls数据块是通常是允许其自身访问静态tls。
46.在本发明的一个实施例中,该静态tls的访问方法,还包括:检测系统版本;如果所述系统版本高于预设版本,则卸载所述库文件。即:对windows xp的后续操作系统,静态tls支持已经完善,此时可以卸载xpsup.dll以节省其相关的开销。
47.根据本发明实施例的静态tls的访问方法,可执行文件启动后静态加载预先创建好的并且与可执行文件预先链接的库文件,当可执行文件运行过程中动态加载目标动态链接库或创建线程后,便可以根据库文件中分配的tls数据块为目标动态链接库或线程分配访问的静态tls。这样,可以以较小的代价解决一些不支持动态加载的动态链接库使用静态tls变量的问题,相比于现有技术中需要修改大量代码的方式解决一些不支持动态加载的动态链接库使用静态tls变量的问题,具有风险小、人力成本低、简单易行的优点,还可以减少冲突,提升程序运行的稳定性。
48.图2示出了本发明实施例提供的静态tls的访问装置的结构示意图。如图2所示,本实施例提供的静态tls的访问装置,包括:库文件加载模块210和静态tls访问模块220,其中:
49.库文件加载模块210,用于在可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括tls数据块;静态tls访问模块220,用于在所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
50.基于上述各实施例的内容,在本实施例中,在所述可执行文件启动后静态加载预先创建的库文件之前,还包括:
51.创建所述库文件,并安装所述库文件以通过所述库文件导出的lib文件实现所述库文件与所述可执行文件的链接。
52.基于上述各实施例的内容,在本实施例中,所述可执行文件启动后静态加载预先创建的库文件,包括:
53.所述可执行文件启动后,静态加载所述库文件,并基于所述库文件的tls数据块为所述库文件分配tls索引和各线程对应的tls数据空间。
54.基于上述各实施例的内容,在本实施例中,所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls,包括:
55.在所述可执行文件运行过程动态加载所述目标动态链接库或创建所述线程后,通过dllmain入口函数,为所述目标动态链接库或所述线程分配所述tls索引和对应的tls数据空间。
56.基于上述各实施例的内容,在本实施例中,在为所述目标动态链接库或所述线程分配所述tls索引和对应的tls数据空间之后,还包括:
57.调用tls全局变量的初始化函数对tls变量进行初始化。
58.基于上述各实施例的内容,在本实施例中,还包括:
59.检测系统版本;
60.如果所述系统版本高于预设版本,则卸载所述库文件。
61.根据本发明实施例的静态tls的访问装置,可执行文件启动后静态加载预先创建好的并且与可执行文件预先链接的库文件,当可执行文件运行过程中动态加载目标动态链接库或创建线程后,便可以根据库文件中分配的tls数据块为目标动态链接库或线程分配访问的静态tls。这样,可以以较小的代价解决一些不支持动态加载的动态链接库使用静态tls变量的问题,相比于现有技术中需要修改大量代码的方式解决一些不支持动态加载的动态链接库使用静态tls变量的问题,具有风险小、人力成本低、简单易行的优点,还可以减少冲突,提升程序运行的稳定性。
62.由于本发明实施例提供的静态tls的访问装置,可以用于执行上述实施例所述的静态tls的访问方法,其工作原理和有益效果类似,故此处不再详述,具体内容可参见上述实施例的介绍。
63.在本实施例中,需要说明的是,本发明实施例的装置中的各个模块可以集成于一体,也可以分离部署。上述模块可以合并为一个模块,也可以进一步拆分成多个子模块。
64.基于相同的发明构思,本发明又一实施例提供了一种电子设备,参见图3,所述电子设备具体包括如下内容:处理器301、存储器302、通信接口303和通信总线304;
65.其中,所述处理器301、存储器302、通信接口303通过所述通信总线304完成相互间的通信;
66.所述处理器301用于调用所述存储器302中的计算机程序,所述处理器执行所述计算机程序时实现上述静态tls的访问方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所
述可执行文件预先链接,所述库文件包括tls数据块;所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
67.可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
68.基于相同的发明构思,本发明又一实施例提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述静态tls的访问方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括tls数据块;所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
69.可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
70.基于相同的发明构思,本发明又一实施例提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现上述静态tls的访问方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括tls数据块;所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述tls数据块为所述目标动态链接库或所述线程分配访问的静态tls。
71.可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
72.此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
73.以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
74.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指
令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的流量审计方法。
75.此外,在本发明中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
76.此外,在本发明中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
77.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1