CN115599448A - 一种基于linux内核ko模块的加载方法及装置 - Google Patents

一种基于linux内核ko模块的加载方法及装置 Download PDF

Info

Publication number
CN115599448A
CN115599448A CN202110723379.9A CN202110723379A CN115599448A CN 115599448 A CN115599448 A CN 115599448A CN 202110723379 A CN202110723379 A CN 202110723379A CN 115599448 A CN115599448 A CN 115599448A
Authority
CN
China
Prior art keywords
page
loading
address
current
current address
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202110723379.9A
Other languages
English (en)
Inventor
彭磊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sanechips Technology Co Ltd
Original Assignee
Sanechips Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sanechips Technology Co Ltd filed Critical Sanechips Technology Co Ltd
Priority to CN202110723379.9A priority Critical patent/CN115599448A/zh
Priority to PCT/CN2022/081865 priority patent/WO2023273424A1/zh
Publication of CN115599448A publication Critical patent/CN115599448A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本申请实施例提供了一种基于linux内核ko模块的加载方法及装置,该方法包括:在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;若该当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对该当前地址进行动态加载;在当前制式切换为其他制式时,通过动态释放接口对该当前制式下动态加载到物理内存中的代码段进行动态释放,可以解决相关技术中Linux内核ko模块的加载是将ko文件整体载入到内存空间中,如果ko版本较大会出现ko模块占用内存过多的问题,通过动态加载与动态释放,减少了ko模块的占用内存。

Description

一种基于linux内核ko模块的加载方法及装置
技术领域
本申请实施例涉及通信领域,具体而言,涉及一种基于linux内核ko模块的加载方法及装置。
背景技术
现有内核ko模块的加载技术是在Linux内核启动时完成对该ko中所有涉及的函数、变量相关汇编代码的重定位处理。目前Linux内核ko模块的加载都是整体载入到内存空间中,如果ko版本较大的情况下,会出现ko模块占用内存过多的情况。
针对相关技术中Linux内核ko模块的加载是将ko文件整体载入到内存空间中,如果ko版本较大会出现ko模块占用内存过多的问题,尚未提出解决方案。
发明内容
本申请实施例提供了一种基于linux内核ko模块的加载方法及装置,以至少解决相关技术中Linux内核ko模块的加载是将ko文件整体载入到内存空间中,如果ko版本较大会出现ko模块占用内存过多的问题。
根据本申请的一个实施例,提供了一种基于linux内核ko模块的加载方法,包括:
在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;
若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;
在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放。
根据本申请的另一个实施例,还提供了一种基于linux内核ko模块的加载装置,包括:
检测模块,用于在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;
加载模块,用于若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;
第一释放模块,用于在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放。
根据本申请的又一个实施例,还提供了一种计算机可读的存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
根据本申请的又一个实施例,还提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
本申请实施例,在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放,可以解决相关技术中Linux内核ko模块的加载是将ko文件整体载入到内存空间中,如果ko版本较大会出现ko模块占用内存过多的问题,当前地址还未映射到物理地址上产生数据异常或者预取指令异常缺页时,进入到Linux内核的缺页异常处理流程中完成动态加载,在Linux内核中设置动态释放的接口,以达到内核ko模块不被卸载的情况下能够对动态加载到内存中的代码段进行动态释放的目的,通过动态加载与动态释放,减少了ko模块的占用内存。
附图说明
图1是本申请实施例的基于linux内核ko模块的加载方法的移动终端的硬件结构框图;
图2是根据本申请实施例的基于linux内核ko模块的加载方法的流程图;
图3是根据本实施例的基于Linux内核ko模块的动态加载的流程图;
图4是根据本实施例的ko动态加载缺页异常流程的示意图;
图5是根据本实施例的linux内核ko动态加载的释放流程图;
图6是根据本实施例的基于linux内核ko模块的加载装置的框图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本申请的实施例。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
本申请实施例中所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,图1是本申请实施例的基于linux内核ko模块的加载方法的移动终端的硬件结构框图,如图1所示,移动终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)和用于存储数据的存储器104,其中,上述移动终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本申请实施例中的基于linux内核ko模块的加载方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及业务链地址池切片处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
在本实施例中提供了一种运行于上述移动终端或网络架构的基于linux内核ko模块的加载方法,应用于终端,所述终端通过双连接(Dual Connection,简称为DC)接入源区域的当前主节点MN小区与当前辅节点SN小区,图2是根据本申请实施例的基于linux内核ko模块的加载方法的流程图,如图2所示,该流程包括如下步骤:
步骤S202,在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;
步骤S204,若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;
步骤S206,在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放。
本实施例中,上述步骤S204具体可以包括:
S11,在linux内核的缺页异常处理流程中新增对内核ko模块的代码段进行动态加载的动态加载流程;
S12,在所述动态加载流程中以第一预定大小的page对所述当前地址的代码段进行动态加载,进一步的,步骤S12具体可以通过以下方式实现:若确定引起异常的所述当前地址在动态加载的链接地址范围之内,判断所述当前地址对应的页表项是否已在存在内核的页表项中;在判断结果为是的情况下,将所述当前地址对应的内核页表项同步到当前进程的页表项中,完成对所述当前地址的动态加载;在判断结果为否的情况下,若所述当前地址对应的page正在进行映射,当前动态加载流程阻塞等待,待同page的其它动态加载流程完成映射后唤醒当前流程之后,将所述当前地址对应的内核页表项同步到所述当前进程的页表项中,完成对所述当前地址的动态加载;若所述当前地址对应的page不是正在进行映射,则首先设置page的状态为正在进行映射的标记,然后根据所述当前地址计算出其在ko代码段中的page页偏移,以预定大小的page开始进行加载,将读取出的page大小数据存储在申请的临时内存空间中,并同时申请内存空间作为page对应的内存管理节点,用于记录动态加载页的临时存储内存地址和所述当前地址,添加当前内存管理节点到链表中;将所述当前地址映射到动态加载页对应的物理内存上;将所述当前地址对应的内核页表项同步到所述当前进程的页表项中,同时进行无效cache和BTB(Branch Target Buffer,分支目标缓冲)的操作;若检测到等待队列为空,完成对所述当前地址的动态加载。若检测到等待队列不为空,需首先唤醒等待映射完成的流程,然后完成对所述当前地址的动态加载。
在linux内核的缺页异常机制中实现ko的动态加载流程,当执行ko中的代码段地址时如果发现未映射到物理地址上时则触发缺页异常处理流程,每次触发加载一个page的代码段,对于未执行到的代码段则不载入到内存空间中。
本实施例中,上述步骤S206具体可以包括:
S21,将要释放的链表拷贝到临时链表中;
S22,对所述临时链表进行遍历释放,进一步的,步骤S22具体可以通过以下方式实现:
从所述临时链表中删除page对应的内存管理节点,并清除page的状态标记,包括映射的标记位清除及复位完成量;断开内存管理节点中的所述当前地址addr和动态加载页对应的物理地址的映射关系;对TLB(Translation Lookaside Buffer,地址转换后援缓冲器,简称为快表)缓存进行清除操作;释放内存管理节点中记录的动态加载页临时内存地址空间,同时释放内存管理节点占用的内存空间。
在不卸载ko模块的情况下,在制式(LTE/W/GSM)切换时对之前一个制式动态加载的代码段进行动态释放,以节省内存空间,其中,LTE为长期演进(Long Term Evaluation),GSM为全球移动通信系统(Global System for Mobile Communication)。
在一示例性实施例中,在为所述ko文件分配固定的起始地址,通过PC(PersonalComputer,个人计算机)侧完成所述ko文件中所有涉及的函数、变量汇编代码的重定位处理之后,将所述ko文件中需要动态加载的代码段在系统启动阶段全部释放。
进一步的,在上述步骤S202之前,通过PC侧,在生成所述ko文件的链接脚本中通过预定义符号标记各个应用场景的代码段地址范围,并对所述各个应用场景中需要动态加载的代码段进行重新排序。
在另一示例性实施例中,所述ko文件是固定第一个加载运行的,且所述ko文件不被卸载,所述ko文件是在PC侧上完成重定位处理的,即在上述步骤S202之前,通过PC侧固定第一个加载运行的ko文件,且不被卸载,这样内核为所述ko分配的起始地址就是固定的,因此可在PC上完成所述ko文件中所有涉及的函数、变量地址及汇编代码的重定位处理,其中,所述ko文件包括代码段、数据段、bss段、rodata段等多个段。
本实施例对内核ko模块的动态加载和动态释放。在ko加载时text段都是不加载到内存中的,只有执行到ko中的代码段地址时,如果发现当前地址还未映射到物理地址上就会产生数据异常或者预取指令异常缺页,进入到Linux内核的缺页异常处理流程中完成动态加载的动作。在linux内核的缺页流程中新增了对内核ko模块代码段动态加载的流程支持,每次触发缺页异常时都以固定大小的page进行一次加载,达到节省内存的目的。在Linux内核中实现了动态释放的接口,以达到内核ko模块不被卸载的情况下能够对动态加载到内存中的代码段进行动态释放的目的。在本实施例的一个应用实例中是选择在制式(LTE/W/GSM)切换的时候对之前制式的代码段进行释放,可以节省3M左右的内存空间,对于DDR内存配置较小的项目起到很好的内存压缩作用,促进了项目成本的降低。
由于协议栈是整体编译成一个内核ko模块,所以导致内核ko模块较大,针对该内核ko模块应用ko的动态加载和动态释放技术。其具体流程可如下图所示,在多模设备启动时会驻留到某一个制式环境下,在当前制式下的业务流程中,如果执行到ko中的代码时发现未做物理映射则触发缺页异常进入ko的动态加载流程完成本次映射过程。当制式进行切换的时候,就需要把之前制式动态加载的代码段进行动态释放操作,然后在完成本次制式驻留所需代码段的动态加载。
应用产品的实施包括但不限于协议栈ko模块,任何内核ko模块都可以采用该技术进行实施来达到省内存空间,节约设备成本的目的。图3是根据本实施例的基于Linux内核ko模块的动态加载的流程图,如图3所示,包括:
步骤S301,LTE多模设备启动,包括LTE制式驻留、W制式驻留以及GSM制式驻留;
步骤S302,选择制式驻留;
步骤S303,执行协议栈业务流程;
步骤S304,制式切换;
步骤S305,内核ko动态释放,释放的是之前制式的代码段,之后进入步骤S303进行循环操作;
S306,判断执行ko中函数是否(备注:释放修改为是否,图中也要修改)载入内存,在判断结果为是的情况下,返回步骤S303,否则执行步骤S307;
步骤S307,触发缺页异常处理流程;
步骤S308,内核ko动态加载,以page为单位;
步骤S309,完成动态加载。
本实施例中Linux内核ko动态加载,具体可以包括:
1,ko模块PC侧处理;
现有内核ko模块中的函数、变量的地址都是在加载运行时确定的。当该ko文件被加载时,由Linux内核完成对该ko中所有涉及的函数、变量相关汇编代码的重定位处理,即如果一个ko被加载/卸载多次,每次加载中的函数、变量的地址都可能不一样。本方案处理的协议栈ko是固定第一个加载运行的ko文件,且不被卸载,这种场景下,内核为该ko分配起始地址是固定的,因此可以在PC侧完成该ko文件中所有涉及的函数、变量及汇编代码进行重定位处理(参考Linux内核ko正常加载的处理流程),这样的话后续动态加载时可以直接从该ko文件中读取代码段。
2,ko链接脚本的实现;
链接脚本主要目的是对动态加载的内核ko模块的text代码段进行重新排序,并根据实际应用场景执行到的函数做集中收集排序,以达到把频繁执行的函数收集在一个段中进行动态加载的目的,这样能够有效提高动态加载页的利用率,减少加载的次数。对于不能进行动态加载的.o文件的text段放在一起,这就需要使用EXCLUDE_FILE语句来剔除不需要链接进其余text段的.o文件,举例说明:比如下面ps_2g_func的段就是收集gsm制式驻留下所有频繁执行到的函数,如下所示:
Figure BDA0003137185380000051
在链接脚本中自定义符号标记来区分各个应用场景的地址范围,方便内核在动态加载的时候能够区分所加载的地址属于哪一个根据应用场景的text代码段中,这样在释放的时候可以根据应用场景的变换进行释放。举例说明:比如cpko_text_start变量就是在链接脚本中定义的ko模块代码段的起始符号,modem_text_end变量是要释放代码段的结束符号,这些都需要注册进内核中,方便内核使用该标记判断动态代码段加载开始及结束的地址。
3,动态加载的ko代码段全释放;
在Linux内核insomod加载ko的正常流程中,整个ko会完全加载进内存中,在ko完成加载后,需要在ko的初始化入口处把要动态加载的代码段全部释放掉,同时获取ko文件的句柄以及注册内核需要的各个应用场景的text代码段开始的变量标记,过程实例如下所示:
void ko加载初始化函数(void)
{
获取ko文件的打开句柄
注册内核要使用的符号标记(链接脚本中定义的)
释放代码段区间
return 0;
}
4,ko动态加载缺页异常流程。
系统启动后,当内核执行到动态代码加载的地址范围的时候,由于该地址空间在ko模块初始化入口处已经全部释放过,所以目前是未映射到任何具体的物理地址上的,这时系统就会产生数据异常和预取指令异常缺页,分别调用do_DataAbort和do_PrefetchAbort函数进行缺页异常的处理流程。而动态代码加载的实现主要就是在该流程中。图4是根据本实施例的ko动态加载缺页异常流程的示意图,如图4所示,包括:
步骤S401,根据传入参数来判断引起失效的虚拟地址addr是否在动态加载的地址范围之内,在判断结果为否的情况下,执行步骤S402,在判断结果为是的情况下,执行步骤S403,;
步骤S402,从内核的原始失效状态对应的方案进行处理;
步骤S403,判断addr是否已经映射到init_mm.pgd指向的内核页表项中,在判断结果为是的情况下,执行步骤S404,否则执行步骤S405;
步骤S404,将addr对应的内核页表项同步到当前进程页表项中,完成本流程的动态加载;(备注:内核页表中有很多项,只同步当前地址的映射页表项)
步骤S405,判断addr所在的page是否正在做映射,在判断结果为是的情况下,执行步骤S406,否则执行步骤S407(备注:addr减去ko代码起始地址,然后除以page大小,就是addr所在的page);
步骤S406,当前动态加载流程阻塞等待,待同page的其它动态加载流程完成映射后唤醒当前流程,之后进入步骤S404;
步骤S407,计算addr在ko文件中的代码段页偏移,根据页偏移的值以预定大小的page读取ko文件进行动态加载,将读取出的page数据存储在申请的临时内存空间中,建立内存管理节点,记录动态加载页的临时内存空间及addr,并添加内存管理节点到链表中;
步骤S408,将addr对应的内核页表项同步到当前进程页表项中,做无效cache和BTB的操作;
步骤S409,判断等待队列是否为空,在判断结果为否的情况下,执行步骤S410,在判断结果为是的情况下,执行步骤S411;
步骤S410,触发唤醒等待同page映射的其他流程;(备注:要唤醒其他等待流程,不是等待)
步骤S411,本次动态加载异常流程处理结束。
ko模块的加载地址是由内核页目录表管理,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,所以每次做映射的时候都是依照原始方案直接使用内核的页表基地址init_mm.pgd先进行映射的。在缺页异常流程处理中要首先判断addr对应的page是否已经映射到“内核的页表项”中,如已经做了映射,只需要同步该页的“内核的页表项”到“当前进程(current->actinve_mm->pgd)的页表项”中即可完成本次地址映射异常流程。
对动态加载到内存中的所有代码段按照页进行管理,定义两个全局变量,一个管理page的映射状态的数组,比如设置page正在映射的标记位;一个用于管理page映射同步的完成量数组,这样每个页的映射都独立的通过完成量completion来进行同步,因为同一个页的映射可能会同时由不同的流程触发缺页的异常处理,这样就需要做同步处理,只允许一个缺页流程进行虚拟地址映射,同时置位正在映射的标记,其他触发该页的缺页异常流程如发现该页正在映射的标记已置位的情况下,需要调用wait_for_completion(&page_completion[page_index])等待该页的映射结束才能返回,返回前要“同步页表项”。
函数read_code_file是用来从文件系统中读取重定位好的ko模块文件的接口。传入的读取参数是addr相对于ko文件的代码段页偏移(以页为单位进行读取)。读取的代码段临时存储在get_zeroed_page(GFP_KERNEL)申请的内存空间,同时申请内存作为内存管理节点用于记录动态加载页的存储地址和addr。
本实施例采用四个链表来管理内存管理节点,分别为GSM/W/LTE/公共代码段,各个制式在动态加载代码段到内存的时候会把相应的内存管理节点添加到链表中,方便制式切换的时候释放其他制式下的动态加载的内存空间。
代码段已经动态加载进get_zeroed_page申请的内存空间,这时就需要把addr对应的虚拟地址映射到代码段对应的物理内存中,调用ioremap_page(addr&PAGE_MASK,__pa(vir_codebuf),mtype)可以完成该步骤。
同步“内核的页表项”到“当前进程的页表项”中,同时做无效cache和BTB的操作,防止cache不一致导致的问题。
映射流程结束后,需要调用waitqueue_active(&page_completion[page_index].wait)来判断在等待该页映射的进程队列是否存在,存在的话需要调用complete_all全部触发完成量的等待唤醒。
本实施例中的linux内核ko动态加载的释放,具体包括:
在系统启动后,随着测试场景的变化,最终都会把所有代码动态加载到内存中,这就和ko完全加载占用的内存是一样的,没有达到节约内存的目的,所以需要考虑内存释放的情况。本方案中选择在制式切换的时候来进行内存的释放,因为在链接的时候对GSM/W/LTE/modem公共代码分别链接进单独的地址区间中,动态加载的时候根据链接地址范围已经加入到相应的链表中,这样在制式切换的时候才能对已加载其它制式及公共的代码进行释放操作,同时也可以在系统内存紧张的情况下,对这部分内存进行临时释放,以缓解系统内存压力。图5是根据本实施例的linux内核ko动态加载的释放流程图,如图5所示,包括:
步骤S501,将要释放的链表拷贝到临时链表tmp_page_list中,从临时链表进行遍历释放。这样可以减少对链表资源占用的时间。
步骤S502,从临时链表中遍历删除链表中记录的内存管理节点。
步骤S503,清除在全局变量中记录的页映射状态标记,并复位完成量。由于在缺页映射的时候已经置位了映射的标记,所以在释放的时候要记得对该page页的标记进行清除,同时也要对该page的完成量page_completion进行复位操作。
步骤S504,断开内存管理节点中记录的所述当前地址addr和动态加载页对应的物理地址的映射关系,对tlb缓存进行flush操作。
步骤S505,释放内存管理节点记录的动态加载页的临时存储内存,同时释放内存管理节点空间。
根据本申请的另一个实施例,还提供了一种基于linux内核ko模块的加载装置,图6是根据本实施例的基于linux内核ko模块的加载装置的框图,如图6所示,包括:
检测模块62,用于在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;
加载模块64,用于若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;
第一释放模块66,用于在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放。
在一示例性实施例中,所述加载模块64包括:
新增子模块,用于在linux内核的缺页异常处理流程中新增对内核ko模块的代码段进行动态加载的动态加载流程;
加载子模块,用于在所述动态加载流程中以第一预定大小的page对所述当前地址的代码段进行动态加载。
在一示例性实施例中,所述加载子模块,还用于
若确定引起异常的所述当前地址在动态加载的链接地址范围之内,判断所述当前地址对应的page是否已映射到内核的页表项中;
在判断结果为是的情况下,将所述当前地址对应的内核页表项同步到当前进程的页表项中,完成对所述当前地址的动态加载;
在判断结果为否的情况下,若所述当前地址对应的page正在进行映射,控制当前动态加载流程进入阻塞等待,待所述page的其它动态加载流程完成映射后唤醒所述当前动态加载流程之后,将所述当前地址对应的内核页表项同步到所述当前进程的页表项中,完成对所述当前地址的动态加载;
若所述当前地址对应的page不是正在进行映射,根据所述当前地址计算出所述page在ko代码段中的page页偏移,并根据所述page页偏移对所述当前地址进行动态加载。
在一示例性实施例中,所述加载子模块,还用于
将所述page的状态标记设置为正在进行映射,根据所述page页偏移开始进行加载,将所述page页偏移读取出的数据存储在申请的临时内存空间中,并同时申请第二预定大小的内存作为记录动态加载页的临时存储内存地址和所述当前地址的内存管理节点,将所述内存管理节点添加到链表中;
将所述当前地址映射到所述临时内存空间对应的物理地址上,并将所述当前地址对应的内核页表项同步到所述当前进程的页表项中,同时进行无效cache和BTB的操作;
若检测到所述等待队列不为空,唤醒所述阻塞等待的流程,完成对所述当前地址的动态加载;
若检测到等待队列为空,完成对所述当前地址的动态加载。
在一示例性实施例中,所述第一释放模块66包括:
拷贝子模块,用于将要释放的链表拷贝到临时链表中;
释放子模块,用于对所述临时链表进行遍历释放。
在一示例性实施例中,所述释放子模块,还用于
从所述临时链表中删除page对应的内存管理节点,并清除所述page的状态标记;
断开内存管理节点中的所述当前地址和临时内存空间对应的物理地址的映射关系;
对TLB缓存进行清除操作;
释放所述内存管理节点中记录的临时内存空间,同时释放所述内存管理节点占用的内存。
在一示例性实施例中,所述装置还包括:
第二释放模块,用于将所述ko文件中需要动态加载的代码段在系统启动阶段全部释放。
在另一示例性实施例中,所述装置还包括:
排序模块,用于通过PC侧,在生成所述ko文件的链接脚本中通过预定义符号标记各个应用场景的代码段地址范围,并对所述各个应用场景中需要动态加载的代码段进行重新排序。
在本实施例中,所述ko文件是固定第一个加载运行的,且所述ko文件不被卸载,所述ko文件是在PC侧上完成重定位处理的。
本申请的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
在一个示例性实施例中,上述计算机可读存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,简称为ROM)、随机存取存储器(Random Access Memory,简称为RAM)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
本申请的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
在一个示例性实施例中,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (12)

1.一种基于linux内核ko模块的加载方法,其特征在于,包括:
在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;
若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;
在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放。
2.根据权利要求1所述的方法,其特征在于,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载包括:
在所述linux内核的缺页异常处理流程中新增对内核ko模块的代码段进行动态加载的动态加载流程;
在所述动态加载流程中以第一预定大小的page对所述当前地址的代码段进行动态加载。
3.根据权利要求2所述的方法,其特征在于,在所述动态加载流程中以第一预定大小的page对所述当前地址的代码段进行动态加载包括:
若确定引起异常的所述当前地址在动态加载的链接地址范围之内,判断所述当前地址对应的page是否已映射到内核的页表项中;
在判断结果为是的情况下,将所述当前地址对应的内核页表项同步到当前进程的页表项中,完成对所述当前地址的动态加载;
在判断结果为否的情况下,若所述当前地址对应的page正在进行映射,控制当前动态加载流程进入阻塞等待,待所述page的其它动态加载流程完成映射后唤醒所述当前动态加载流程之后,将所述当前地址对应的内核页表项同步到所述当前进程的页表项中,完成对所述当前地址的动态加载;
若所述当前地址对应的page不是正在进行映射,根据所述当前地址计算出所述page在ko代码段中的page页偏移,并根据所述page页偏移对所述当前地址进行动态加载。
4.根据权利要求3所述的方法,其特征在于,根据所述page页偏移对所述当前地址进行动态加载包括:
将所述page的状态标记设置为正在进行映射,根据所述page页偏移开始进行加载,将所述page页偏移读取出的数据存储在申请的临时内存空间中,并同时申请第二预定大小的内存作为记录动态加载页的临时存储内存地址和所述当前地址的内存管理节点,将所述内存管理节点添加到链表中;
将所述当前地址映射到所述临时内存空间对应的物理地址上,并将所述当前地址对应的内核页表项同步到所述当前进程的页表项中,同时进行无效cache和分支目标缓冲BTB的操作;
若检测到所述等待队列不为空,唤醒所述阻塞等待的流程,完成对所述当前地址的动态加载;
若检测到等待队列为空,完成对所述当前地址的动态加载。
5.根据权利要求1所述的方法,其特征在于,通过所述动态释放接口对动态加载到所述物理内存中的代码段进行动态释放包括:
将要释放的链表拷贝到临时链表中;
对所述临时链表进行遍历释放。
6.根据权利要求5所述的方法,其特征在于,对所述临时链表进行遍历释放包括:
从所述临时链表中删除page对应的内存管理节点,并清除所述page的状态标记;
断开内存管理节点中的所述当前地址和临时内存空间对应的物理地址的映射关系;
对地址转换后援缓冲器TLB缓存进行清除操作;
释放所述内存管理节点中记录的临时内存空间,同时释放所述内存管理节点占用的内存。
7.根据权利要求1至6中任一项所述的方法,其特征在于,在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内之前,所述方法还包括:
将所述ko文件中需要动态加载的代码段在系统启动阶段全部释放。
8.根据权利要求7所述的方法,其特征在于,在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内之前,所述方法还包括:
通过PC侧,在生成所述ko文件的链接脚本中通过预定义符号标记各个应用场景的代码段地址范围,并对所述各个应用场景中需要动态加载的代码段进行重新排序。
9.根据权利要求8所述的方法,其特征在于,
所述ko文件是固定第一个加载运行的,且所述ko文件不被卸载,所述ko文件是在PC侧上完成重定位处理的。
10.一种基于linux内核ko模块的加载装置,其特征在于,包括:
检测模块,用于在linux内核的缺页异常处理流程中检测当前地址是否在动态加载地址范围之内;
加载模块,用于若所述当前地址在动态加载地址范围之内,通过Linux内核的缺页异常处理流程对所述当前地址进行动态加载;
第一释放模块,用于在当前制式切换为其他制式时,通过动态释放接口对所述当前制式下动态加载到物理内存中的代码段进行动态释放。
11.一种计算机可读的存储介质,其特征在于,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行所述权利要求1至9任一项中所述的方法。
12.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行所述权利要求1至9任一项中所述的方法。
CN202110723379.9A 2021-06-28 2021-06-28 一种基于linux内核ko模块的加载方法及装置 Pending CN115599448A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202110723379.9A CN115599448A (zh) 2021-06-28 2021-06-28 一种基于linux内核ko模块的加载方法及装置
PCT/CN2022/081865 WO2023273424A1 (zh) 2021-06-28 2022-03-19 一种基于linux内核ko模块的加载方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110723379.9A CN115599448A (zh) 2021-06-28 2021-06-28 一种基于linux内核ko模块的加载方法及装置

Publications (1)

Publication Number Publication Date
CN115599448A true CN115599448A (zh) 2023-01-13

Family

ID=84691131

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110723379.9A Pending CN115599448A (zh) 2021-06-28 2021-06-28 一种基于linux内核ko模块的加载方法及装置

Country Status (2)

Country Link
CN (1) CN115599448A (zh)
WO (1) WO2023273424A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117149499A (zh) * 2023-10-30 2023-12-01 北京麟卓信息科技有限公司 一种基于动态符号表的内核模块内存占用优化方法

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116243971B (zh) * 2023-05-10 2023-07-28 北京麟卓信息科技有限公司 一种基于静态依赖自举的内核无关的模块构建方法
CN117251216B (zh) * 2023-09-15 2024-04-05 上海合芯数字科技有限公司 一种服务器固件启动优化方法、系统、服务器及存储介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101324850B (zh) * 2007-06-12 2011-04-06 中兴通讯股份有限公司 Linux内核动态加载方法
CN102938035B (zh) * 2012-11-08 2015-05-27 西安交通大学 一种在虚拟机内部的驱动隔离系统与方法
US10025722B2 (en) * 2015-10-28 2018-07-17 International Business Machines Corporation Efficient translation reloads for page faults with host accelerator directly accessing process address space without setting up DMA with driver and kernel by process inheriting hardware context from the host accelerator

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117149499A (zh) * 2023-10-30 2023-12-01 北京麟卓信息科技有限公司 一种基于动态符号表的内核模块内存占用优化方法
CN117149499B (zh) * 2023-10-30 2024-01-19 北京麟卓信息科技有限公司 一种基于动态符号表的内核模块内存占用优化方法

Also Published As

Publication number Publication date
WO2023273424A1 (zh) 2023-01-05

Similar Documents

Publication Publication Date Title
US11531625B2 (en) Memory management method and apparatus
CN115599448A (zh) 一种基于linux内核ko模块的加载方法及装置
US9471342B2 (en) Register mapping
US10083113B2 (en) Scheme for determining data object usage in a memory region
US8732430B2 (en) Method and apparatus for using unused bits in a memory pointer
US10838857B2 (en) Multi-section garbage collection
US20140325043A1 (en) Network Switching Method, Version Upgrade Method, and Terminal Device
US20230136649A1 (en) Method and apparatus for restoring running status of application, and storage medium
WO2020238245A1 (zh) 实现函数跳转的方法、装置及计算机存储介质
US20190087208A1 (en) Method and apparatus for loading elf file of linux system in windows system
KR100493893B1 (ko) 자바 프로그램에서 클래스 로딩 과정을 단축시키는 시스템및 방법
US20070033371A1 (en) Method and apparatus for establishing a cache footprint for shared processor logical partitions
EP4375836A1 (en) Memory paging method and system, and storage medium
CN110618946A (zh) 堆栈内存分配方法、装置、设备和存储介质
CN113572747B (zh) 一种ip地址的处理方法、装置、存储介质和处理器
CN115617504A (zh) 一种内存管理系统、泄露检测方法及存储介质
CN113342270A (zh) 卷卸载方法、装置和电子设备
WO2023030173A1 (zh) 一种管理动态库的方法及相应装置
US20160266960A1 (en) Information processing apparatus and kernel dump method
CN116467315A (zh) 行为数据的分析方法、装置、设备及存储介质
Caldwell FluidMem: Open source full memory disaggregation
JP2006260395A (ja) プログラムローディング方法及びその装置
CN115934174A (zh) 设备的启动方法及装置
KR20240057652A (ko) 가비지 컬렉션 방법 및 장치
CN115408105A (zh) 一种缺页异常处理方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination