CN117311821A - 一种基于动态加载机制的国产操作系统启动优化方法 - Google Patents
一种基于动态加载机制的国产操作系统启动优化方法 Download PDFInfo
- Publication number
- CN117311821A CN117311821A CN202311135272.8A CN202311135272A CN117311821A CN 117311821 A CN117311821 A CN 117311821A CN 202311135272 A CN202311135272 A CN 202311135272A CN 117311821 A CN117311821 A CN 117311821A
- Authority
- CN
- China
- Prior art keywords
- module
- target
- file
- operating system
- kernel
- 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
Links
- 238000011068 loading method Methods 0.000 title claims abstract description 81
- 238000000034 method Methods 0.000 title claims abstract description 47
- 230000007246 mechanism Effects 0.000 title claims abstract description 46
- 238000005457 optimization Methods 0.000 title claims abstract description 15
- 238000004458 analytical method Methods 0.000 claims abstract description 50
- 238000003860 storage Methods 0.000 claims abstract description 7
- 238000004891 communication Methods 0.000 claims abstract description 6
- 230000000007 visual effect Effects 0.000 claims abstract description 5
- 230000006870 function Effects 0.000 claims description 41
- 238000012545 processing Methods 0.000 claims description 21
- 238000000354 decomposition reaction Methods 0.000 claims description 9
- 238000000605 extraction Methods 0.000 claims description 8
- 238000007781 pre-processing Methods 0.000 claims description 8
- 230000008520 organization Effects 0.000 claims description 6
- 230000008569 process Effects 0.000 claims description 6
- 238000005520 cutting process Methods 0.000 claims description 5
- 238000012546 transfer Methods 0.000 claims description 5
- 230000004913 activation Effects 0.000 claims description 3
- 238000012937 correction Methods 0.000 claims description 3
- 230000009191 jumping Effects 0.000 claims description 3
- 230000008878 coupling Effects 0.000 abstract description 9
- 238000010168 coupling process Methods 0.000 abstract description 9
- 238000005859 coupling reaction Methods 0.000 abstract description 9
- 230000006399 behavior Effects 0.000 abstract description 4
- 238000013461 design Methods 0.000 description 7
- 239000002699 waste material Substances 0.000 description 5
- 230000001133 acceleration Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 230000003068 static effect Effects 0.000 description 4
- 230000006978 adaptation Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012803 optimization experiment Methods 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 238000001228 spectrum Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
- G06F9/4406—Loading of operating system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/34—Network arrangements or protocols for supporting network services or applications involving the movement of software or configuration parameters
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于动态加载机制的国产操作系统启动优化方法,包括步骤:对操作系统内核进行模块级裁剪,使用Linux自身提供的可视化图形配置界面进行功能模块的整体裁剪,确定动态加载机制下最小操作系统内核的配置项;设计目标模块与中断服务例程的动态加载方式,通过通信机制将已加载模块链中未检索到的模块下载至本地;通过目标模块的依赖关系分析方法、符号解析和重定位方法,完成目标文件读入内存后的动态链接操作;设计指定模块的动态卸载方法,收回该模块在操作系统中分配的存储空间并取消其外部引用,实现动态链接的逆操作。本发明能够明确操作系统中模块启动和运行时需要加载的耦合数据与行为,缩短启动时间。
Description
技术领域
本发明涉及操作系统的启动技术领域,尤其涉及一种基于动态加载机制的国产操作系统启动优化方法。
背景技术
Linux操作系统以其源代码开放且免费、持续更新和硬件支持丰富等优势被越来越多的嵌入式系统所采用。由于Linux内核的不断更新与完善,系统软件的体量不断变大,庞大的代码量造成了较长的启动时间。对于如今广泛应用的移动消费类电子产品(如手机、平板电脑等)、车载信息系统和物联网设备而言,冗长的系统建立时间无疑是难以忍受的。一个快速启动的Linux系统不仅有利于增加用户的良好使用体验,而且对提高系统的稳定性和可靠性也有很大的帮助。快速的启动不仅能够优化用户体验从而增强市场竞争力,在作为网络终端或工业应用时更能迅速重启,从而减小事故率或事故损失,因此需要研究操作系统的快速可靠启动方法。
目前以银河麒麟为代表的国产操作系统都是基于Linux内核开发而来的通用操作系统,因此继承了Linux内核模块化的特点。该操作系统的Linux内核文件体积较大,包含的各类驱动也更为全面。然而,当搭载该类操作系统的嵌入式设备作为控制核心时,其功能往往具有较强的专用性。因此通用操作系统中存在的大量扩展驱动未被使用,造成了内核体积的浪费,并显著拖慢启动时间。
为加快启动速度,目前主流的做法是利用Linux内核易裁剪的特性,通过针对性地裁剪内核,移除非必要的驱动来缩减内核体积。然而裁剪内核对启动时间的优化程度有限,当内核裁剪至测试任务所需的最小体积后,启动速度难以进一步提升。
发明内容
发明目的:本发明的目的是提供一种能实现异步处理的能力、缩短启动时间的基于动态加载机制的国产操作系统启动优化方法。
技术方案:本发明的国产操作系统启动优化方法,包括如下步骤:
S1,对操作系统内核进行模块级裁剪,使用Linux自身提供的可视化图形配置界面进行功能模块的整体裁剪,确定动态加载机制下最小操作系统内核的配置项;
S2,设计目标模块与中断服务例程的动态加载方式,通过通信机制将已加载模块链中未检索到的模块下载至本地;
S3,通过设计目标模块的依赖关系分析方法、符号解析和重定位方法,完成目标文件读入内存后的动态链接操作;
S4,设计指定模块的动态卸载方法,收回该模块在操作系统中分配的存储空间并取消其外部引用,实现动态链接的逆操作。
进一步,步骤S1中,对操作系统内核进行模块级裁剪的具体步骤如下:
S11,通过make menuconfig命令生成图形配置界面,根据需求选择是否将应用模块编译到内核中;
S12,通过修改config配置文件对通用的Bootloader代码进行裁剪,减少不必要的初始化流程,优化操作系统的引导加载程序;
S13,对Linux内核中的文件系统和设备驱动部分进行针对性裁剪,将系统启动必要的功能与设备编译进内核,其余的功能与设备编译为非初始化模块。
进一步,步骤S2中,目标模块与中断服务例程的动态加载方式的具体实现步骤如下:
S21,确定目标模块的格式信息,得到可加载模块的组织方式,实现内核模块与应用模块的动态加载;
其中,所述目标模块格式信息确定的具体步骤包括如下:
S211,将目标文件的概述信息设置为头信息,所述概述信息包括代码的大小、源文件名和创建日期;
S212,将由编译器或汇编器产生的二进制指令和数据,设置为目标文件的目标代码;
S213,链接器在修改目标代码的地址时,会对目标代码的位置列表进行调整,将地址的位置列表设置为目标文件的重定位信息;
S214,将目标模块中定义的全局符号,以及从其它模块导入的或者由链接器定义的符号,设置为目标文件的符号信息;
S215,将目标代码中与链接无关但会被调试器使用到的其它信息,设置为目标文件的调试信息,所述其他信息包括源代码文件和行号、本地符号、被目标代码使用的数据结构描述;
S22,设计基于动态加载机制的中断服务例程加载方法,具体实现步骤如下:
S221,建立中断向量表,获取中断服务程序的入口地址偏移量和段地址,分别装入IP及CS中,以转入中断服务程序;
S222,将中断服务程序的入口地址填写到中断向量表中,以便产生中断时能转入中断程序服务程序去执行;
S223,定义一个中断激活函数,调用中断向量值执行中断服务程序;
S224,在程序结束后,恢复被修改的中断向量,使中断服务程序入口地址指向原来的中断服务程序。
进一步,步骤S3中,完成目标文件读入内存后的动态链接操作的具体实现步骤如下:
S31,设计一种基于Makefile文件编译链接规则的模块依赖关系分析方法,从内容预处理、文件关键信息分析提取和递归分析处理三方面进行分析;
其中,所述模块依赖关系分析方法的具体步骤包括如下:
S311,对内核文件进行内容预处理,保留非注释并且完整的文件内容;
S312,解析的配置文件遇到变量引用语句时,遍历保存的变量,找到匹配的变量名进而获取其变量值;
S313,根据分支判断语句的编写格式,准确识别语句块并进行如下操作:判断条件是否成立、跳过或直接处理非分支判断语句和每层分支判断语句的结束符匹配;
S314,分析内核文件的内置函数,通过相同功能的程序代码来解析和描述每个内置函数的功能步骤,并在遇到相应的内置函数调用语句时跳转到case分支语句块加以处理,得到对应函数的返回值作为原内置函数调用的解析结果;
S315,从规则语句中提取内核文件依赖信息,对依赖信息进行变量引用和内置函数调用的处理操作,将依赖目标、生成命令保存在数据结构中;
S316,从include语句、规则语句块的生成命令和目标变量值中,不断提取子层的文件路径进行自上而下的递归分析处理;
S317,设计依赖信息数据结构,保存Linux内核文件或内核模块之间的依赖关系描述信息,所述依赖信息包括目标、依赖目标、生成目标的命令以及目标所在文件路径;
S318,利用树形控件,查找结构体数组中保存的依赖关系,将所有依赖关系描述成树形结构并展示给用户;
S32,建立系统符号表,通过目标模块的符号解析和重定位方法,实现对目标模块外部接口的识别、链接;
所述目标模块的符号解析和重定位方法的具体步骤包括如下:
S321,扫描目标模块得到相应的符号,将符号名、内存中的物理地址、模块链写入动态加载机制创建的系统符号表中;
S322,设计符号名与物理内存地址的弱绑定方法:使符号不直接指向实际的内存地址,而是指向符号表的入口地址,直到实际应用需要时才正式绑定;
S323,遍历依赖模块和系统模块的符号表,读取关键的地址信息和重定位信息,修改符号解析过程中建立的中间数据结构,完成加载模块中未解决引用的符号地址的修正。
进一步,步骤S4中,指定模块的动态卸载方法的实现包括如下步骤:
S41,设置模块分解函数tlclose(char*string,int hard),其中,string表示一个符号或者文件的名字,char*表示一个指向字符的指针,hard是布尔参数,int表示整数数据;
S42,设计模块硬分解方式,当参数hard非零时,将该指定模块从存储器中无条件地移出;
S43,设计模块软分解方式,当参数hard为零时,调用无用单元收集程序,来移出不被引用的指定模块,在需要卸载的指定模块不被任何其它模块引用时将其移出存储器。
本发明与现有技术相比,其显著效果如下:
1、对Bootloader引导加载程序和Linux内核初始化程序进行模块级裁剪,有效解决了大量扩展驱动未被使用导致的内核体积浪费问题,优化操作系统启动时间;
2、考虑到裁剪内核对启动时间的优化程度有限,设计基于动态加载机制的启动加速架构,解决内核裁剪至任务所需的最小体积后,操作系统启动速度难以进一步提升的问题;
3、在目标模块的动态加载设计中引入中断服务例程的加载,任务的切换不再仅仅依靠优先级和时间片轮转来实现,使得操作系统具有快速实现异步处理的能力;
4、本发明设计的模块依赖关系分析方法,能够明确操作系统中模块启动和运行时需要加载的耦合数据与行为,完善动态加载机制以进一步缩短操作系统的启动时间,能够直接用于国产操作系统的启动优化。
附图说明
图1为本发明的结构流程图;
图2为本发明中Linux内核整体架构;
图3为本发明中操作系统的裁剪界面;
图4为本发明中操作系统的内核裁剪结果;
图5为本发明中搭载动态加载机制后的系统结构图;
图6为本发明中内核文件依赖关系分析的流程。
具体实施方式
下面结合说明书附图和具体实施方式对本发明做进一步详细描述。
为加快操作系统的启动速度,本发明通过动态加载机制能够依据当前任务对内核模块与应用模块进行加载与卸载,系统启动时仅加载动态加载机制,再根据测试任务需求加载相应的内核模块与应用模块,以此减少操作系统本身的启动时间。
本发明的操作系统启动优化方法中,对Bootloader引导加载程序和Linux内核初始化程序进行模块级裁剪,有效解决大量扩展驱动未被使用导致的内核体积浪费问题。利用模块级内核裁剪技术实现操作系统内核的最小化裁剪,得到最小体积的操作系统内核代码,以此减少内核的内存占用,同时增加启动速度。
考虑到裁剪内核对启动时间的优化程度有限,本发明设计了基于动态加载机制的启动加速架构,解决内核裁剪至任务所需的最小体积后,操作系统启动速度难以进一步提升的问题。计算机各项任务所需的内核支持不同,并非所有内核模块与应用模块都长时间工作,因此需引入动态加载机制以实现内核的动态裁剪。本发明通过分析动态加载流程所需的下载、链接和分解操作,形成基于动态加载机制的操作系统启动优化策略,并针对加载模块格式、模块依赖、符号解析与重定位以及加载中断等关键技术,依次进行了方案设计,以此确保动态加载分层启动加速架构的稳定可靠。
此外,本发明在目标模块的动态加载设计中引入中断服务例程的加载,任务的切换不再仅仅依靠优先级和时间片轮转来实现,使得操作系统具有快速实现异步处理的能力。
特别地,本发明还设计了基于编译链接规则的Linux内核文件间耦合关系分析方法,明确操作系统中内核模块或应用模块之间的引用关系。目前模块文件的依赖关系往往采用静态代码分析工具获得,考虑到国产操作系统的Linux内核源码文件数量庞大、组织结构复杂,并且引入新的模块加载机制后不同目录下会出现较多同名的文件、函数、数据结构,静态代码分析方式会导致模块与文件、模块与函数之间调用关系的解析精度下降,影响加载器对于依赖模块的自动确定与完整加载。
当动态加载机制加载与卸载设备驱动、网络协议等内核与应用模块时,会与其他模块的服务、函数、通信协议等公共信息链接。这种模块耦合的现象,会导致模块加载时需要全局搜索与之依赖的模块文件,影响内核加载调度并造成时间的浪费。本发明设计的模块文件的依赖关系量化表示方法,能够明确操作系统中模块启动和运行时需要加载的耦合数据与行为,进一步完善动态加载机制以缩短操作系统的启动时间。
如图1所示,为操作系统启动优化方法的流程图,包括如下步骤:
步骤1,对操作系统内核进行模块级裁剪,使用Linux自身提供的可视化图形配置界面进行功能模块的整体裁剪,通过make menuconfig命令生成操作系统裁剪界面,根据需求选择是否将应用模块编译到内核中,确定动态加载机制下最小操作系统内核的配置项(即系统启动必要的功能与设备);
对操作系统内核进行模块级裁剪的具体步骤如下:
步骤11,通过make menuconfig命令生成图形配置界面,根据需求选择是否将应用模块编译到内核中;
步骤12,通过修改config配置文件对通用的Bootloader代码进行裁剪,减少不必要的初始化流程,优化操作系统的引导加载程序;
步骤13,对Linux内核中的文件系统和设备驱动部分进行针对性裁剪,将系统启动必要的功能与设备编译进内核,其余的功能与设备编译为非初始化模块,非初始化模块待需要时加载,缩短内核初始化的时间。
步骤2,设计目标模块与中断服务例程的动态加载方式,通过通信机制将已加载模块链中未检索到的模块下载至本地;
目标模块与中断服务例程的动态加载方式具体包含如下步骤:
步骤21,确定目标模块的格式信息,得到可加载模块的组织方式,实现内核模块与应用模块的动态加载;
其中,目标模块格式信息确定的具体步骤包括如下:
步骤211,将目标文件的概述信息,例如代码的大小、源文件名、创建日期等,设置为头信息。
步骤212,将由编译器或汇编器产生的二进制指令和数据,设置为目标文件的目标代码;
步骤213,链接器在修改目标代码的地址时,会对目标代码的位置列表进行调整,将地址的位置列表设置为目标文件的重定位信息;
步骤214,将目标模块中定义的全局符号,以及从其它模块导入的或者由链接器定义的符号,设置为目标文件的符号信息;
步骤215,将目标代码中与链接无关但会被调试器使用到的其它信息,包括源代码文件和行号、本地符号、被目标代码使用的数据结构描述等,设置为目标文件的调试信息。
步骤22,设计基于动态加载机制的中断服务例程加载方法,具体实现步骤包括如下:
步骤221,建立中断向量表,获取中断服务程序的入口地址偏移量和段地址,分别装入IP(代码段寄存器)及CS(指令指针寄存器)中,以转入中断服务程序;
步骤222,将中断服务程序的入口地址填写到中断向量表中,以便产生中断时能转入中断程序服务程序去执行;
步骤223,定义一个中断激活函数,调用中断向量值执行中断服务程序;
步骤224,在程序结束后,恢复被修改的中断向量,使中断服务程序入口地址指向原来的中断服务程序。
步骤3,设计目标模块的依赖关系分析方法,通过符号解析和重定位方法,完成目标文件读入内存后的动态链接操作;包括步骤如下:
步骤31,设计一种基于Makefile文件编译链接规则的内核文件间耦合关系分析方法(即模块依赖关系分析方法),从内容预处理、文件关键信息分析提取和递归分析处理三方面进行分析;
其中,所述模块依赖关系分析方法的具体步骤包括如下:
步骤311,对内核文件进行内容预处理,保留非注释并且完整的文件内容;
步骤312,解析的配置文件遇到变量引用语句时,遍历保存的变量,找到匹配的变量名,进而获取其变量值;
步骤313,根据分支判断语句的编写格式,准确识别语句块并进行如下操作:包括判断条件是否成立、跳过或直接处理非分支判断语句和每层分支判断语句的结束符匹配等;
步骤314,分析内核文件的内置函数,通过相同功能的程序代码来解析和描述每个内置函数的功能步骤,并在遇到相应的内置函数调用语句时跳转到case分支语句块加以处理,得到对应函数的返回值作为原内置函数调用的解析结果;
步骤315,从规则语句中提取内核文件依赖信息,对依赖信息进行变量引用和内置函数调用等处理操作,将依赖目标、生成命令等关键信息保存在数据结构中;依赖信息包括目标、依赖目标、生成目标的命令以及目标所在文件路径的所有信息,目标为当前文件,依赖目标为当前文件所依赖的文件;
步骤316,从include语句、规则语句块的生成命令和目标变量值中,不断提取子层的文件路径进行自上而下的递归分析处理;
步骤317,设计依赖信息数据结构,保存目标、依赖目标、生成目标的命令以及目标所在文件路径等Linux内核文件或内核模块之间的依赖关系描述信息;
步骤318,利用树形控件,查找结构体数组中保存的依赖关系,将所有依赖关系描述成树形结构并展示给用户。
步骤32,建立系统符号表,通过目标模块的符号解析和重定位方法,实现对目标模块外部接口的识别、链接;
系统符号表用来存放系统各个模块中的所有符号,同时每个模块也分别建立自己的符号表来存放各自模块里的符号,以备加载后面模块时可能要使用和该模块卸载时从系统符号表里删除该模块的符号。当新加载一个模块M时,扫描M模块的所有符号建立起M模块的符号表,同时将这些符号写入系统符号表,卸载时需要把系统符号表里的M模块的符号也删除。
模块的符号表是在加载机制扫描模块的过程中建立起来的。扫描每个模块得到相应的符号,把它写入到相应的符号表里,动态加载机制创建一个段用来存放所有的输出符号。每个模块都有一个符号表,遍历本模块中的符号表就可以得到本模块中的所有符号名及其在内存中的物理地址,遍历模块链就可以得到系统中加载模块的所有的符号名及其在内存中的物理地址。
符号表建立的过程,也就是符号及其内存地址写入符号表的过程。符号表写入可以有多种方法如顺序查找法和哈希法。基于小内存空间考虑,理想状态下希望用规模为N的符号表来存放N个符号。
目标模块的符号解析和重定位方法的具体步骤包括如下:
步骤321,扫描目标模块得到相应的符号,将符号名、内存中的物理地址、模块链写入动态加载机制创建的系统符号表中;
步骤322,设计符号名与物理内存地址的弱绑定方法:使符号不直接指向实际的内存地址,而是指向符号表的入口地址,直到实际应用需要时才正式绑定,从而减少加载模块初始化的时间;
步骤323,遍历依赖模块和系统模块的符号表,读取关键的地址信息和重定位信息,修改符号解析过程中建立的中间数据结构,完成加载模块中未解决引用的符号地址的修正。
步骤4,设计指定模块的动态卸载方法,收回该指定模块在操作系统中分配的存储空间,并取消该指定模块外部引用,实现动态链接的逆操作。
指定模块的动态卸载方法包括如下步骤:
步骤41,设置模块分解函数tlclose(char*string,int hard),其中,string表示一个符号或者文件的名字,char*表示一个指向字符的指针,hard是布尔参数,int表示整数数据;
步骤42,设计模块硬分解方式,当参数hard非零时,将该指定模块从存储器中无条件地移出;
步骤43,设计模块软分解方式,当参数hard为零时,调用无用单元收集程序来移出不被引用的指定模块,在需要卸载的指定模块不被任何其它模块引用时将其移出存储器。
本实施例选择在银河麒麟桌面操作系统V10上进行了启动优化实验。该操作系统基于Linux内核开发,与主流Linux系统兼容,其性能指标能达到国内外同类Linux系统的水平,部分指标甚至高于国外成熟Linux系统的水平。同时该操作系统对国产软件的兼容性较强,同源支持飞腾、鲲鹏、兆芯、海光、龙芯、申威、海思麒麟等国产处理器平台。该操作系统采用的Linux内核版本为kernel-5.4,其内核架构如图2所示。
对操作系统内核进行模块级裁剪,使用Linux自身提供的可视化图形配置界面进行功能模块的整体裁剪,通过make menuconfig命令生成图形配置界面如图3所示,根据需求选择是否将应用模块编译到内核中。在Linux内核的模块级裁剪图形化配置中可以方便地对内核模块的配置文件进行修改,同时自动处理所裁剪模块与其他模块之间的依赖关系。Linux内核中make menuconfig命令提供的可裁剪模块如表1所示。
表1
利用模块级内核裁剪技术实现操作系统内核的最小化裁剪,得到最小体积的操作系统内核代码,以此减少内核的内存占用,同时增加启动速度,内核裁剪结果如图4所示。
然而考虑到计算机各项任务所需的内核支持不同,并非所有内核模块与应用模块都长时间工作,因此引入动态加载机制以实现内核的动态裁剪,搭载动态加载机制的系统结构如图5所示。通过分析动态加载流程所需的下载、链接和分解操作,形成基于动态加载机制的操作系统启动优化策略,并针对加载模块格式、模块依赖、符号解析与重定位以及加载中断等关键技术,依次按照本发明的方法进行了方案设计,以此确保动态加载分层启动加速架构的稳定可靠。
特别地,本发明还设计了基于编译链接规则的Linux内核文件间耦合关系分析方法,明确操作系统中内核模块或应用模块之间的引用关系(即依赖关系)。目前模块文件的依赖关系往往采用静态代码分析工具获得,考虑到银河麒麟操作系统的Linux内核源码文件数量庞大、组织结构复杂,并且引入新的模块加载机制后不同目录下会出现较多同名的文件、函数、数据结构,静态代码分析方式会导致模块与文件、模块与函数之间调用关系的解析精度下降,影响加载器对于依赖模块的自动确定与完整加载。
当动态加载机制加载与卸载设备驱动、网络协议等内核模块与应用模块时,会与其他模块的服务、函数、通信协议等公共信息链接。这种模块耦合的现象,会导致模块加载时需要全局搜索与之依赖的模块文件,影响内核加载调度并造成时间的浪费。因此需研究模块文件的依赖关系量化表示方法,明确操作系统中模块启动和运行时需要加载的所有耦合数据与行为,完善动态加载机制以缩短操作系统的启动时间。内核文件依赖关系分析的流程如图6所示,内核文件依赖关系分析主要包括三大部分,即文件内容预处理、文件关键信息分析与提取和文件递归分析处理。其中,文件内容预处理包括注释行清除处理及include语句替换处理,进而得到所需要的文件内容。文件关键信息分析与提取主要包括变量赋值信息提取、文件间依赖关系信息提取,在信息提取过程中需要分析分支判断语句以便确定执行的文件内容,还需分析内置函数调用语句获取返回值。由于各类语句可以相互嵌套编写,因此需要分析这类复杂的关系获得所需信息。文件递归分析处理,Linux内核中Makefile类文件是一个完整的文件组织体系,各层Makefile文件之间存在联系,解析各层Makefile文件可以提取其子目录的Makefile文件路径,路径信息可以从规则语句中的生成命令中获取,例如make命令、cd命令。
由上述可知,本发明通过引入动态加载机制,操作系统可以实现内核体积与应用模块的动态裁剪,减少了操作系统启动时所需加载的模块负载,利用模块的动态加载与卸载机制,保证操作系统的简洁高效,在确保任务执行的前提下,最大限度提升启动速度。
以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离不发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (5)
1.一种基于动态加载机制的国产操作系统启动优化方法,其特征在于,包括如下步骤:
S1,对操作系统内核进行模块级裁剪,使用Linux自身提供的可视化图形配置界面进行功能模块的整体裁剪,确定动态加载机制下最小操作系统内核的配置项;
S2,设计目标模块与中断服务例程的动态加载方式,通过通信机制将已加载模块链中未检索到的模块下载至本地;
S3,通过设计目标模块的依赖关系分析方法、符号解析和重定位方法,完成目标文件读入内存后的动态链接操作;
S4,设计指定模块的动态卸载方法,收回该模块在操作系统中分配的存储空间并取消其外部引用,实现动态链接的逆操作。
2.根据权利要求1所述基于动态加载机制的国产操作系统启动优化方法,其特征在于,步骤S1中,对操作系统内核进行模块级裁剪的具体步骤如下:
S11,通过make menuconfig命令生成图形配置界面,根据需求选择是否将应用模块编译到内核中;
S12,通过修改config配置文件对通用的Bootloader代码进行裁剪,减少不必要的初始化流程,优化操作系统的引导加载程序;
S13,对Linux内核中的文件系统和设备驱动部分进行针对性裁剪,将系统启动必要的功能与设备编译进内核,其余的功能与设备编译为非初始化模块。
3.根据权利要求1所述基于动态加载机制的国产操作系统启动优化方法,其特征在于,步骤S2中,目标模块与中断服务例程的动态加载方式的具体实现步骤如下:
S21,确定目标模块的格式信息,得到可加载模块的组织方式,实现内核模块与应用模块的动态加载;
其中,所述目标模块格式信息确定的具体步骤包括如下:
S211,将目标文件的概述信息设置为头信息,所述概述信息包括代码的大小、源文件名和创建日期;
S212,将由编译器或汇编器产生的二进制指令和数据,设置为目标文件的目标代码;
S213,链接器在修改目标代码的地址时,会对目标代码的位置列表进行调整,将地址的位置列表设置为目标文件的重定位信息;
S214,将目标模块中定义的全局符号,以及从其它模块导入的或者由链接器定义的符号,设置为目标文件的符号信息;
S215,将目标代码中与链接无关但会被调试器使用到的其它信息,设置为目标文件的调试信息,所述其他信息包括源代码文件和行号、本地符号、被目标代码使用的数据结构描述;
S22,设计基于动态加载机制的中断服务例程加载方法,具体实现步骤如下:
S221,建立中断向量表,获取中断服务程序的入口地址偏移量和段地址,分别装入IP及CS中,以转入中断服务程序;
S222,将中断服务程序的入口地址填写到中断向量表中,以便产生中断时能转入中断程序服务程序去执行;
S223,定义一个中断激活函数,调用中断向量值执行中断服务程序;
S224,在程序结束后,恢复被修改的中断向量,使中断服务程序入口地址指向原来的中断服务程序。
4.根据权利要求1所述基于动态加载机制的国产操作系统启动优化方法,其特征在于,步骤S3中,完成目标文件读入内存后的动态链接操作的具体实现步骤如下:
S31,设计一种基于Makefile文件编译链接规则的模块依赖关系分析方法,从内容预处理、文件关键信息分析提取和递归分析处理三方面进行分析;
其中,所述模块依赖关系分析方法的具体步骤包括如下:
S311,对内核文件进行内容预处理,保留非注释并且完整的文件内容;
S312,解析的配置文件遇到变量引用语句时,遍历保存的变量,找到匹配的变量名进而获取其变量值;
S313,根据分支判断语句的编写格式,准确识别语句块并进行如下操作:判断条件是否成立、跳过或直接处理非分支判断语句和每层分支判断语句的结束符匹配;
S314,分析内核文件的内置函数,通过相同功能的程序代码来解析和描述每个内置函数的功能步骤,并在遇到相应的内置函数调用语句时跳转到case分支语句块加以处理,得到对应函数的返回值作为原内置函数调用的解析结果;
S315,从规则语句中提取内核文件依赖信息,对依赖信息进行变量引用和内置函数调用的处理操作,将依赖目标、生成命令保存在数据结构中;
S316,从include语句、规则语句块的生成命令和目标变量值中,不断提取子层的文件路径进行自上而下的递归分析处理;
S317,设计依赖信息数据结构,保存Linux内核文件或内核模块之间的依赖关系描述信息,所述依赖信息包括目标、依赖目标、生成目标的命令以及目标所在文件路径;
S318,利用树形控件,查找结构体数组中保存的依赖关系,将所有依赖关系描述成树形结构并展示给用户;
S32,建立系统符号表,通过目标模块的符号解析和重定位方法,实现对目标模块外部接口的识别、链接;
所述目标模块的符号解析和重定位方法的具体步骤包括如下:
S321,扫描目标模块得到相应的符号,将符号名、内存中的物理地址、模块链写入动态加载机制创建的系统符号表中;
S322,设计符号名与物理内存地址的弱绑定方法:使符号不直接指向实际的内存地址,而是指向符号表的入口地址,直到实际应用需要时才正式绑定;
S323,遍历依赖模块和系统模块的符号表,读取关键的地址信息和重定位信息,修改符号解析过程中建立的中间数据结构,完成加载模块中未解决引用的符号地址的修正。
5.根据权利要求1所述基于动态加载机制的国产操作系统启动优化方法,其特征在于,步骤S4中,指定模块的动态卸载方法的实现包括如下步骤:
S41,设置模块分解函数tlclose(char*string,int hard),其中,string表示一个符号或者文件的名字,char*表示一个指向字符的指针,hard是布尔参数,int表示整数数据;
S42,设计模块硬分解方式,当参数hard非零时,将该指定模块从存储器中无条件地移出;
S43,设计模块软分解方式,当参数hard为零时,调用无用单元收集程序,来移出不被引用的指定模块,在需要卸载的指定模块不被任何其它模块引用时将其移出存储器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311135272.8A CN117311821A (zh) | 2023-09-04 | 2023-09-04 | 一种基于动态加载机制的国产操作系统启动优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311135272.8A CN117311821A (zh) | 2023-09-04 | 2023-09-04 | 一种基于动态加载机制的国产操作系统启动优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117311821A true CN117311821A (zh) | 2023-12-29 |
Family
ID=89287469
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311135272.8A Pending CN117311821A (zh) | 2023-09-04 | 2023-09-04 | 一种基于动态加载机制的国产操作系统启动优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117311821A (zh) |
-
2023
- 2023-09-04 CN CN202311135272.8A patent/CN117311821A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105100191B (zh) | 一种云编译实现Java应用安装的方法、装置及系统 | |
US20230004368A1 (en) | Multi-chip compatible compiling method and device | |
CN1149470C (zh) | 一种分析面向对象的程序的执行的方法和设备 | |
JP5208350B2 (ja) | 自己記述型ソフトウェアイメージ更新コンポーネント | |
CN1134731C (zh) | 在计算机系统中编译指令的方法 | |
US7398523B2 (en) | Adaptive class loading | |
US7689979B1 (en) | Methods and apparatus to improve application launch time | |
US20070157178A1 (en) | Cross-module program restructuring | |
JP2000040084A (ja) | モジュラ―記憶方法及びその装置 | |
CN114816417B (zh) | 一种交叉编译方法、装置、计算设备及存储介质 | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
US10248409B1 (en) | Limiting the effects of source code patches on corresponding native-code patches | |
CN115017516A (zh) | 一种基于符号执行的模糊测试方法 | |
CN110109671A (zh) | 一种webpack标签尺寸样式转换方法及装置 | |
CN114138376B (zh) | 一种在应用中加载插件的方法、计算设备及存储介质 | |
CN113485712B (zh) | 一种内核裁剪方法及计算设备 | |
CN113721928B (zh) | 一种基于二进制分析的动态库裁剪方法 | |
CN111596970B (zh) | 动态库延迟加载方法、装置、设备和存储介质 | |
CN111949303A (zh) | 升级包处理方法、装置、电子设备及存储介质 | |
CN117311821A (zh) | 一种基于动态加载机制的国产操作系统启动优化方法 | |
CN111796832B (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN112379885B (zh) | 小程序编译方法、装置、设备及可读存储介质 | |
CN114816435A (zh) | 一种基于逆向技术的软件开发方法 | |
CN101382892B (zh) | 下载.Net程序的方法和装置 | |
CN112667283B (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 |