CN110007923A - 一种shell的实现方法 - Google Patents
一种shell的实现方法 Download PDFInfo
- Publication number
- CN110007923A CN110007923A CN201910243881.2A CN201910243881A CN110007923A CN 110007923 A CN110007923 A CN 110007923A CN 201910243881 A CN201910243881 A CN 201910243881A CN 110007923 A CN110007923 A CN 110007923A
- Authority
- CN
- China
- Prior art keywords
- shell
- information
- command
- function
- elf file
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
Abstract
本发明公开了一种shell的实现方法,包含以下步骤:步骤a1,通过宏指定需要添加的shell信息的类型;步骤a2,通过链接脚本编译步骤a1中的shell信息到相应的段,并编译生成相应的elf文件;步骤a3,解析步骤a2中的elf文件,提取并删除所述elf文件中的所有shell信息,将shell信息添加等级并排序后再重新添加到elf文件中,然后利用elf文件生成相应的bin文件;步骤a4,调用执行相应的shell信息。本发明的有益效果是:查找速度快:该方法所添加的shell信息是有序的,所以查找可以通过二分法或其他方法快速定位,占用空间少,丰富了shell命令的多样性。
Description
技术领域
本发明涉及嵌入式系统软件开发技术领域,特别涉及一种shell的实现方法。
背景技术
Shell是指“提供使用者使用界面”的软件(命令解析器),它接收用户命令,然后调用相应的应用程序以满足用户的需求。Shell管理用户与系统之间的交互,可以简单的描述为:shell等待用户输入,向系统解释用户的输入,并且处理各种各样的系统输出结果。
而shell命令是嵌入式开发中常用的手段,目前shell的实现方式有:
1.通过链表的方式实现,该方法将shell信息填充在一个表格中,并将shell信息表通过链串起来,shell的函数查找通过遍历链表实现。
2.通过编译器直接生成相应的段实现,即通过将shell函数信息表编译到固定的段,在连接脚本中找到确定该段的起始结束地址,shell信息的获取也是通过遍历整个表格。
3.执行带符号表的elf文件,通过读取解析elf文件获取shell函数的信息。elf在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。
以上三种实现方式均存在缺点和不足:1.通过链表的方式实现,shell使用复杂,管理链表使用内存较多,shell函数比较单一,添加一个shell命令时,需要添加数组,还需要调用安装命令,使用起来很不方便;2.通过编译器生成相应的段实现,其中典型的u-boot就是这种方式实现的,缺点是函数单一,shell信息未经排序,shell函数查找需要遍历整个表格查找过程比较慢;3.通过查找elf文件符号表的方式占用空间大,不适合嵌入式开发。
发明内容
为克服上述背景技术shell实现方式中的缺陷和不足,本发明提出一种shell的实现方法,其功能是通过如下技术方案实现的。
一种shell的实现方法,包含以下步骤:步骤a1,通过宏指定需要添加的shell信息的类型;步骤a2,通过链接脚本编译步骤a1中的shell信息到相应的段,并编译生成相应的elf文件;步骤a3,解析步骤a2中的elf文件,提取并删除所述elf文件中的所有shell信息,将shell信息添加等级并排序后再重新添加到elf文件中,然后利用elf文件生成相应的bin文件;步骤a4,调用执行相应的shell信息。
进一步的,所述步骤a1中,shell信息分为常规shell命令,拓展shell和全局函数调用三个类型。
进一步的,所述常规shell的命令参数由命令执行者解释,具备固定的函数原型。
进一步的,所述拓展shell命令可以执行任何函数,拓展shell的命令参数由shell模块进行参数解析,调用拓展shell函数时需要按照一定格式输入参数。
进一步的,所述全局函数所述全局函数是程序中常规shell命令和扩展shell命令未涵盖的全部函数,调用全局函数时,参数由shell模块进行参数解析,shell命令行需要按照一定格式输入参数。
进一步的,在所述步骤a2中,将shell信息编译到不同的段中的具体过程为:首先设置常规shell的变量、函数、帮助信息和拓展shell的变量、函数、帮助信息,然后在链接脚本中指定保存的段。
进一步的,在步骤a3和步骤a4中,还包括系统分别根据步骤a3执行结果和步骤a4的执行结果,判定是否进行出错处理。
本发明的有益效果是:
1.查找速度快:该方法所添加的shell信息是有序的,所以查找可以通过二分法或其他方法快速定位。
2.占用空间少:该方法生成的shell信息都在只读数据段中,所以不会像链表一样浪费内存,达到减少内存占用的效果。
3.丰富shell的多样性:使用该方法实现的shell,不仅可以实现shell函数的调用,还可以实现shell变量显示及赋值,以及任意类型函数的调用,还可以根据平台丰富程度分级添加shell信息。
4.便利性:添加shell函数只需在相应的函数前加上相应的宏即可,如果是添加所有的全局函数和变量,只需指定添加等级即可,大大方便了shell的使用。
附图说明
图1是本发明的shell实现方法的方法流程图。
图2是本发明的shell命令编译到不同段的实施例。
图3是本发明的shell信息表格式的实施例。
图4是本发明的bin文件组成结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1至图4所示,一种shell的实现方法,包含以下步骤:步骤a1,通过宏指定需要添加的shell信息的类型;步骤a2,通过链接脚本编译步骤a1中的shell信息到相应的段,并编译生成相应的elf文件;步骤a3,解析步骤a2中的elf文件,提取并删除所述elf文件中的所有shell信息,将shell信息添加等级并排序后再重新添加到elf文件中,然后利用elf文件生成相应的bin文件;步骤a4,调用执行相应的shell信息。本发明通过对elf文件的二次加工,添加shell信息,同时实现任意函数的调用,以及对shell信息排序,快速查找。
为了方便进行对shell信息的裁剪,在所述步骤a1中,shell信息分为常规shell,拓展shell和全局函数调用三个类型。
在具体实施例中,所述常规shell的命令参数由命令执行者解释,具备固定的函数原型。在调用常规shell命令时,其命令的参数由命令执行者解释,常规shell命令的函数原型固定为:bool_tcmdname(char*param)。
在具体实施例中,所述拓展shell命令可以执行任何函数,拓展shell的命令参数由shell模块进行参数解析,调用拓展shell函数时需要按照一定格式输入参数。因为拓展shell命令虽然由shell模块进行参数解析,但是在程序中并没有保存参数类型,所以调用shell函数时需要按照一定格式输入参数。参数格式为:命令名参数1类型参数参数2类型参数2参数3类型参数3……其中参数类型请参考下表,
u8 | 无符号8位二进制数表示的数据类型 |
u16 | 无符号16位二进制数表示的数据类型 |
u32 | 无符号32位二进制数表示的数据类型 |
u64 | 无符号64位二进制数表示的数据类型 |
s8 | 有符号8位二进制数表示的数据类型 |
s16 | 有符号16位二进制数表示的数据类型 |
s32 | 有符号32位二进制数表示的数据类型 |
s64 | 有符号64位二进制数表示的数据类型 |
b | 布尔型参数bool_t |
f | 单精度浮点型float |
d | 双精度浮点型double |
参数设置默认为十进制表示,同时也支持其他C语言支持的数据表示形式,如十进制16可以表示为十六进制的0X10。命令与参数、参数类型与参数之间,须用空格隔开。Console控制台在收到字符串时,首先会分离出命令,然后按规则解析出参数,及参数类型。而数值解析则符合c语言规范,如十进制16可以写成十六进制的0X10……其中二进制以0b或0B开头;八进制以0开头;十六进制以0x或0X开头;负数前面加-;默认为10进制。在控制台console中直接输入变量名,回车即可查看变量的值。console也可直接给变量赋值,例如:u32var=100。在控制台console输入shell命令后,会先查找in_shell_cmd段或ex_shell_cmd段,如果找到则直接调用,如果找不到,则会进一步查找data段,找到则执行变量显示或变量赋值。
在具体实施例中,所述全局函数是程序中常规shell命令和扩展shell命令未涵盖的全部函数,调用全局函数时,参数由shell模块进行参数解析,shell命令行需要按照一定格式输入参数。
如图2所示,在所述步骤a2中,将shell信息编译到不同的段中的具体过程为:首先设置常规shell的变量、函数、帮助信息和拓展shell的变量、函数、帮助信息,然后在链接脚本中指定保存的段。图2为常规shell和拓展shell编译到不同段的一个实施例。
在具体实施例中,在步骤a3和步骤a4中,还包括系统分别根据步骤a3执行结果和步骤a4的执行结果,判定是否进行出错处理。
关于bin文件的映射,由于在不同的运行模式下,符号表内容不同,放置位置也不同。而符号表内容的多少,代表了可供使用的调试命令多少。但由于data段是全局变量,一般不会很多,并且在编码时难于决定哪个变量需要查看,哪个不需要查看,因此在IDE中配置时一般将其全部加入或者全部不加入。以下以flash和RAM的SI模式和DLSP模式为例,分别叙述。
在flash中运行的SI模式:只有在极少flash的情况下,将不配置shell模块,因此符号表也就没有用处。当flash内存不足时,只需把.in_shell_cmd与.ex_shell_cmd段加入符号表。当flash内存时,可以把全部函数都加入符号表。在RAM中运行SI模式,对于shell实现来说,与在flash中运行是一样的。
对于DLSP模式,由于其内存空间较大,不考虑没有配置shell模块的情景,直接装入全符号表。如果是在flash中运行,则OS的符号表仍然在flash中,但APP的符号表会在RAM中;如果在RAM中运行,则所有符号表都在RAM中。DLSP模式下,由于OS和APP不是同时加载的,且多模块的APP可能还存在多次加载的情况,导致符号表并不连续,此时需要使用一个链表将其连接起来。
关于shell的实现过程,源码文件经过编译链接生成的elf文件包含有,函数,变量的地址,及其名字对应的字符串等信息。Shell的实现需要修改根据elf文件生成新的elf文件,其修改包括添加字符串表,内部shell函数,外部shell函数,shell变量信息表。其中,对于内部shell函数参数解析逻辑在函数内部实现,对于外部函数参数解析由shell模块实现。内部shell函数原型为:
typedefbool_t(*in_shell_func)(char*param);
Shell信息表格式如图3所示,图3中的参数说明,Cmdname:指向该命令对应的名字。Cmdaddr:该shell命令对应的地址,如果是函数则为函数地址,如果是变量则为变量地址,如果是帮助信息,则为帮助信息指针所在地址。Cmdtype:命令对应的类型,对应以上宏定义中的几项。如图4所示的bin文件的组成结构图,其中Shell_info结构体已包含shell信息表的起始结束地址,而shell信息表已将根据命令名进行排序,因此shell查找就会相当方便。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
Claims (6)
1.一种shell的实现方法,其特征在于,包含以下步骤:
步骤a1,通过宏指定需要添加的shell信息的类型;
步骤a2,通过链接脚本编译步骤a1中的shell信息到相应的段,并编译生成相应的elf文件;
步骤a3,解析步骤a2中的elf文件,提取并删除所述elf文件中的所有shell信息,将shell信息添加等级并排序后再重新添加到elf文件中,然后利用elf文件生成相应的bin文件;
步骤a4,调用执行相应的shell信息。
2.根据权利要求1所述的一种shell的实现方法,其特征在于,所述步骤a1中,shell信息分为常规shell命令,拓展shell命令和全局函数调用三个类型。
3.根据权利要求2所述的一种shell的实现方法,其特征在于,所述常规shell的命令参数由命令执行者解释,具备固定的函数原型。
4.根据权利要求2所述的一种shell的实现方法,其特征在于,所述拓展shell命令可在shell中调用指定的函数,拓展shell的命令参数由shell模块进行参数解析,shell命令行需要按照一定格式输入参数。
5.根据权利要求2所述的一种shell的实现方法,其特征在于,所述全局函数是程序中常规shell命令和扩展shell命令未涵盖的全部函数,调用全局函数时,参数由shell模块进行参数解析,shell命令行需要按照一定格式输入参数。
6.根据权利要求3—5任意一项所述的一种shell的实现方法,其特征在于,在所述步骤a2中,将shell信息编译到不同的段中的具体过程为:首先设置常规shell的变量、函数、帮助信息和拓展shell的变量、函数、帮助信息,然后在链接脚本中指定保存的段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910243881.2A CN110007923B (zh) | 2019-03-28 | 2019-03-28 | 一种shell的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910243881.2A CN110007923B (zh) | 2019-03-28 | 2019-03-28 | 一种shell的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110007923A true CN110007923A (zh) | 2019-07-12 |
CN110007923B CN110007923B (zh) | 2022-12-06 |
Family
ID=67168656
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910243881.2A Active CN110007923B (zh) | 2019-03-28 | 2019-03-28 | 一种shell的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110007923B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5923878A (en) * | 1996-11-13 | 1999-07-13 | Sun Microsystems, Inc. | System, method and apparatus of directly executing an architecture-independent binary program |
US6360280B1 (en) * | 1994-12-13 | 2002-03-19 | Microsoft Corporation | Method and system for accessing shell folder capabilities by an application program |
US20040040016A1 (en) * | 2002-05-29 | 2004-02-26 | Andrew Pearce | Method and system for providing a command-line interface syntax from an XML specification |
US6904424B1 (en) * | 1999-10-21 | 2005-06-07 | International Business Machines Corporation | Method and a system for managing shell script file development and execution |
US7003765B1 (en) * | 2001-12-12 | 2006-02-21 | Oracle International Corporation | Computer-based pre-execution analysis and verification utility for shell scripts |
CN101697135A (zh) * | 2009-10-28 | 2010-04-21 | 北京东方网力科技有限公司 | 一种编译程序的方法及装置 |
CN102447585A (zh) * | 2012-01-04 | 2012-05-09 | 迈普通信技术股份有限公司 | 将网络配置协议响应报文转换为命令行的方法及装置 |
CN104572238A (zh) * | 2015-01-23 | 2015-04-29 | 烽火通信科技股份有限公司 | 一种高效的生成可执行软件包的方法及系统 |
CN108804921A (zh) * | 2018-05-29 | 2018-11-13 | 中国科学院信息工程研究所 | 一种PowerShell代码的去混淆方法及装置 |
-
2019
- 2019-03-28 CN CN201910243881.2A patent/CN110007923B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6360280B1 (en) * | 1994-12-13 | 2002-03-19 | Microsoft Corporation | Method and system for accessing shell folder capabilities by an application program |
US5923878A (en) * | 1996-11-13 | 1999-07-13 | Sun Microsystems, Inc. | System, method and apparatus of directly executing an architecture-independent binary program |
US6904424B1 (en) * | 1999-10-21 | 2005-06-07 | International Business Machines Corporation | Method and a system for managing shell script file development and execution |
US7003765B1 (en) * | 2001-12-12 | 2006-02-21 | Oracle International Corporation | Computer-based pre-execution analysis and verification utility for shell scripts |
US20040040016A1 (en) * | 2002-05-29 | 2004-02-26 | Andrew Pearce | Method and system for providing a command-line interface syntax from an XML specification |
CN101697135A (zh) * | 2009-10-28 | 2010-04-21 | 北京东方网力科技有限公司 | 一种编译程序的方法及装置 |
CN102447585A (zh) * | 2012-01-04 | 2012-05-09 | 迈普通信技术股份有限公司 | 将网络配置协议响应报文转换为命令行的方法及装置 |
CN104572238A (zh) * | 2015-01-23 | 2015-04-29 | 烽火通信科技股份有限公司 | 一种高效的生成可执行软件包的方法及系统 |
CN108804921A (zh) * | 2018-05-29 | 2018-11-13 | 中国科学院信息工程研究所 | 一种PowerShell代码的去混淆方法及装置 |
Non-Patent Citations (1)
Title |
---|
曲波: "Qutenix加载运行ELF文件研究与实现", 《南京晓庄学院学报》 * |
Also Published As
Publication number | Publication date |
---|---|
CN110007923B (zh) | 2022-12-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6243835B1 (en) | Test specification generation system and storage medium storing a test specification generation program | |
CN105793818A (zh) | 源代码翻译 | |
CN111399853A (zh) | 机器学习模型与自定义算子的模板化部署方法 | |
CN109614329B (zh) | 一种基于接口控制文件的软件测试用例辅助设计方法 | |
US20210365258A1 (en) | Method and system for updating legacy software | |
CN115543290A (zh) | 可视化编程方法及系统 | |
JP2000029674A (ja) | アプリケ―ションソフトウェア構成方法 | |
US10048953B2 (en) | Compiler program, compiling method, and compiling device | |
CN111930359B (zh) | 一种异构嵌入式系统上进行算法开发的系统及方法 | |
US7194479B1 (en) | Data generator system and method | |
CN110007923A (zh) | 一种shell的实现方法 | |
US20230113783A1 (en) | Cross-platform code conversion method and device | |
KR101578119B1 (ko) | 구조 해석 장치 및 프로그램 | |
JP3045286B2 (ja) | 回路設計方法および装置、情報記憶媒体 | |
CN112232003B (zh) | 对设计进行仿真的方法、电子设备及存储介质 | |
CN112148746B (zh) | 生成数据库表结构文档的方法、装置、电子装置和存储介质 | |
CN111767033B (zh) | 用于机械臂程序开发的编程系统及功能扩展方法 | |
CN114756219A (zh) | 一种基于c++的fpga硬件构造语言实现系统 | |
CN113391806A (zh) | 一种将颜色代码进行转换的方法、装置、设备和可读介质 | |
CN113296786A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
JP2006338190A (ja) | 実装コード開発システム、及び実装コード開発プログラム | |
KR101705254B1 (ko) | 장치 및 프로그램 | |
CN111597323B (zh) | 关键字段过滤方法、装置、存储介质及电子设备 | |
WO2022000371A1 (zh) | 接口生成方法、装置及计算机可读存储介质 | |
CN113900658A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |