CN108958814A - 一种多模冗余的嵌入式操作系统启动方法 - Google Patents
一种多模冗余的嵌入式操作系统启动方法 Download PDFInfo
- Publication number
- CN108958814A CN108958814A CN201810608848.0A CN201810608848A CN108958814A CN 108958814 A CN108958814 A CN 108958814A CN 201810608848 A CN201810608848 A CN 201810608848A CN 108958814 A CN108958814 A CN 108958814A
- Authority
- CN
- China
- Prior art keywords
- operating system
- starting
- subregion
- bootloader
- embedded
- 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
- 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
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
- G06F11/0706—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
- G06F11/0736—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in functional embedded systems, i.e. in a data processing system designed as a combination of hardware and software dedicated to performing a certain function
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/08—Error detection or correction by redundancy in data representation, e.g. by using checking codes
- G06F11/10—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's
- G06F11/1004—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's to protect a block of data words, e.g. CRC or checksum
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种多模冗余的嵌入式操作系统启动方法,属于计算机体系结构领域。首先将使用的星载操作系统进行压缩,根据操作系统的个数以及星载嵌入式计算机的存储器大小,对存储器进行分区。星载计算机启动时使用bootloader手动选择或是自动选择当前使用的操作系统,并根据分区表内对应操作系统分区的校验信息进行CRC校验;按照对该操作系统的压缩方式对应的解压方式进行解压;将解压完成的操作系统装载至内存指定位置,并且将地址传入CPU,开始启动操作系统并运行。按顺序选择下一个分区的操作系统,进行校验与解压,以此类推直到进行到最后一个操作系统分区。本发明利用多模冗余的思想提高了嵌入式系统的可靠性,对存储器进行了充分利用。
Description
技术领域
本发明涉及一种多模冗余的嵌入式操作系统启动方法,属于计算机体系结构领域。
背景技术
随着集成电路的快速发展,计算机技术也得到了飞速提升,与此同时,作为应用广泛的计算机技术之一——嵌入式系统在IT业的地位也得到了快速提升,逐步成为了业界内的一个焦点。
嵌入式系统的使用,需要嵌入式操作系统的配合,因为嵌入式系统常常用于机械自动化、航空航天、军工领域、工业领域和家用数码等方面,因此对嵌入式操作系统的稳定性有着较高的要求。
目前常用的嵌入式系统多采用单嵌入式操作系统,包括μC/OS-II、嵌入式Linux、Vxworks等,此类嵌入式系统因为只有一个操作系统,因此如果操作系统启动失败或者遭到了破坏,那么整个嵌入式系统则会陷入瘫痪,无法工作,可靠性不足。
发明内容
本发明针对单嵌入式操作系统的可靠性不足,通过多操作系统冗余的方式来换取可靠性,提出了一种多模冗余的嵌入式操作系统启动方法,利用在同样的存储空间内放置多个冗余的操作系统,嵌入式系统进行工作时对所选择使用的操作系统进行校验与启动,提高了整个嵌入式系统的可靠性。
具体步骤如下:
步骤一、针对星载嵌入式计算机,将使用的星载操作系统进行压缩;
步骤二、根据操作系统的个数以及星载嵌入式计算机的存储器大小,对存储器进行分区,每一个分区存储一个操作系统。
将原本存储一个操作系统的存储器划分为多个分区,每个分区有自己的起始地址,每个分区存储一个操作系统;
存储器包括分区表区域,操作系统镜像区域和其他数据区;分区表区域包括分区信息;按顺序排列的各操作系统的起始地址,大小和校验信息;分区信息包括操作系统的个数以及编号;操作系统镜像区域包括按顺序排列的各操作系统的镜像;
步骤三、星载计算机启动时首先使用bootloader手动选择或是自动选择当前使用的操作系统,并根据分区表内对应操作系统分区的校验信息进行CRC校验,判断该分区的操作系统是否正常启动,如果是,进入步骤四;否则,进入步骤五;
使用的操作系统默认初始值为第一分区中存储的操作系统;
本方法使用不同的存储设备存放bootloader,并通过继电设备选择使用哪个存储设备中的bootloader。通常模式下bootloader存放在nor flash当中,并从norflash中启动。当用户发现norflash bootloader无法启动时,通过给继电设备发送特有命令,使跳线切换到EEPROM设备中,加载并启动EEPROM设备中的bootloader,并在此bootloader中管理操作系统分区或加载操作系统。
步骤四、按照对该操作系统的压缩方式对应的解压方式进行解压;将解压完成的操作系统装载至内存指定位置,并且将地址传入CPU,开始启动操作系统并运行。
在操作系统启动后,利用启动的操作系统的文件系统对其余分区的操作系统镜像进行管理,进行操作系统镜像的在线更新或者进行校验失败的镜像修复和替换。
步骤五、按顺序选择下一个分区的操作系统,返回步骤三,进行校验与解压,以此类推直到进行到最后一个操作系统分区。
本发明的优点在于:
(1)一种基于多模冗余容错思想的多嵌入式操作系统启动方法,在一个存储器上存储多个操作系统,利用多模冗余的思想提高了嵌入式系统的可靠性;
(2)一种基于多模冗余容错思想的多嵌入式操作系统启动方法,对嵌入式操作系统进行压缩,对存储器进行了充分利用。
附图说明
图1是本发明一种多模冗余的嵌入式操作系统启动方法的整体流程图;
图2是本发明对星载嵌入式计算机的存储器进行分区存储的示意图;
图3是本发明bootloade冗余备份示意图;
图4是现有技术中常见的操作系统启动流程图;
图5是本发明操作系统启动后利用分区信息对其余操作系统镜像进行更新的示意图。
具体实施方式
下面结合附图对本发明作进一步的详细说明。
本发明针对嵌入式操作系统,提出了一种基于多模冗余容错思想的多嵌入式操作系统启动方法,嵌入式操作系统的特点是体积要求较高,启动速度要求较快,稳定性要求较高。本发明的目的在于使用同样大小的启动介质存储多个操作系统,通过资源冗余的思想来提高嵌入式系统的整体可靠性。
本发明过程如下:如图1所示,第一步、打包压缩操作系统镜像;第二步、存储器分区固化操作系统;第三步、bootloader选择分区校验;校验通过,进行第四步解压缩并加载操作系统启动。校验不通过,则进行第五步、选择其他分区操作系统。
其中,操作系统压缩采用LZO压缩方法;操作系统的冗余存储按照分区进行,将原本存储一个操作系统的存储器划分为多个分区,每个分区有自己的起始地址,每个分区存储一个操作系统;这两步骤在嵌入式系统投入使用前完成。而后续步骤:操作系统的校验采用CRC校验,解压采用LZO对应的解压算法,操作系统的启动由Bootloader手动选择或是自动选择,包含在bootloader的功能中。
具体步骤如下:
步骤一、针对星载嵌入式计算机,将使用的星载操作系统进行压缩;
受限于嵌入式系统整体尺寸要求,其存储器如NORFLASH的大小一般比较小,所以每一点存储器都应该得到合理使用。当多个操作系统放在与单个操作系统同样大小的嵌入式存储器中时,为了保证嵌入式系统的存储器空间的利用充分合理,能够容纳多个操作系统,需要将操作系统的镜像进行压缩。
常用的压缩算法有GZIP、LZO、Zippy/Snappy。GZIP的压缩算法压缩率最高,但是对CPU的消耗较高,解压非常费时,Zippy/Snappy的算法解压速度最快,但是压缩率比较低,因此采用LZO压缩算法是最合理的压缩算法。
LZO压缩算法是一种开源的压缩算法,其特点是无损且线程安全,CPU与内存占用少。LZO算法测试数据如表1所示,可以看出,LZO压缩算法的解压速度极快。从压缩率来讲,LZO算法解压缩测试数据如表2所示,LZO的压缩率虽然不是最优,但是已经达到需求。
表1
测试文件编号 | 原始大小(B) | 压缩后大小(B) | 压缩率 |
1 | 5292054 | 159395 | 3.01% |
2 | 6912056 | 33806 | 0.489% |
3 | 6645760 | 2457890 | 36.98% |
4 | 16660480 | 6987402 | 41.93% |
表2
测试文件编号 | 压缩时间 | 解压缩时间 |
1 | 9.174ms | 23.037ms |
2 | 8.33ms | 36.17ms |
3 | 34.68ms | 38.62ms |
4 | 102.86ms | 108.2ms |
由于嵌入式操作系统的启动不仅仅要从存储空间来进行考虑,更加需要从启动速度考虑,显然,解压速度极快的LZO算法,是目前最适合用来做嵌入式操作系统镜像的算法。
步骤二、根据操作系统的个数以及星载嵌入式计算机的存储器大小,对存储器进行分区,每一个分区存储一个操作系统。
在完成操作系统的压缩之后,下一个步骤是对原来存储一个操作系统的存储器进行分区。按照传统的嵌入式系统设计,一个嵌入式系统只会拥有一个嵌入式操作系统,因此只会在存储器中存储一份操作系统。本发明的多模冗余思想即是:按照需要的操作系统的个数以及大小要求,对原本存储一份操作系统的存储器划分为多个区域,每一个分区存储一个操作系统。于此同时,需要在某个固定地址存储一张分区表以提供给bootloader选择操作系统。
如图2所示,嵌入式系统存储器分别为分区表区域和操作系统镜像区域;
分区表区域包含了分区信息与校验信息等信息,用来在操作系统启动的时候进行校验与启动。包括分区信息、操作系统1的起始地址、操作系统1的大小和操作系统1的校验信息;操作系统2的起始地址,操作系统2的大小和操作系统2的校验信息;……。分区信息包括操作系统的个数以及编号;分区表本身的地址由设计人员与用户进行约定。
操作系统镜像区域包括按顺序排列的操作系统1的镜像,操作系统2的镜像,操作系统3的镜像,……以及其他数据区。
其他数据区包括文件系统(file system)、应用程序等非内核区的统称。
每一个分区存储的操作系统都是一致的,可以视作为一份操作系统的多个拷贝,这样就相当于拥有了冗余资源,当其中一个操作系统无法启动时,可以依靠其他分区的操作系统进行启动,保证嵌入式系统的正常工作。
分区存储的操作应该放在嵌入式系统投入使用之前完成;每个分区有自己的起始地址,每个分区存储一个操作系统。
步骤三、星载计算机启动时首先使用Bootloader手动选择或是自动选择当前使用的操作系统,星载嵌入式计算机采用根据分区表内对应操作系统分区的校验信息进行CRC校验,判断该分区的操作系统是否正常启动,如果是,进入步骤四;否则,进入步骤五;
使用的操作系统默认初始值为第一分区中的操作系统;
在完成操作系统的拷贝与分区存储之后,准备工作就算完成了,但是嵌入式操作系统真正使用还需要首先加载操作系统镜像到内存中,因此需要bootloader的支持。
如图3所示,为了保证bootloader的顺利启动,本方法针对bootloader进行硬件上的冗余备份。具体方法为使用不同的存储设备存放bootloader,并通过硬件跳线选择使用哪个设备中的bootloader,硬件跳线可采用继电设备完成。通常模式下bootloader存放在nor flash当中,并从norflash中启动。当用户发现norflash bootloader无法启动时,可通过给继电设备发送特有命令,使跳线切换到EEPROM设备中,加载并启动EEPROM设备中的bootloader,并在此bootloader中管理操作系统分区或加载操作系统。
本方法的多模冗余包含两个部分:一个是硬件上使用继电设备作为跳线开关,通过EPROM保证有两个可用bootloader,使bootloader的顺利启动以及多分区存储的操作系统带来的软件冗余。另外一个是将操作系统固化在多个分区,使bootloader可以选择任意分区的操作系统启动,完成操作系统的冗余。
在bootloader启动的时候,会加载操作系统进行启动。在本发明中,bootloader启动操作系统之前还需要完成两步。
第一步是操作系统的校验,采用的方法是CRC校验。根据用户的选择,或者bootloader自动选择,会定位到一个分区进行操作系统启动。从步骤二所论述的分区表中,读取相应分区的信息以及校验信息,利用CRC校验的方式进行校验。CRC校验全称为CyclicRedundancy Check,中文译名为循环冗余校验,是一种常用的校验方式,其具有检错能力强,开销小,易于实现等优点,非常适合在嵌入式系统校验中使用。校验如果通过,则选择该分区操作系统,进入操作系统的解压缩过程。校验如果没有通过,则由用户再选择其他分区或者自动选择其他分区再次进行操作系统的校验,以此类推直到进行到最后一个操作系统分区。
在分区内操作系统镜像通过校验过后,则进行第二步----操作系统的解压。为了充分利用嵌入式系统存储器的空间,因此对单份的操作系统进行了压缩,所以在操作系统启动之前,需要对应的对分区内的操作系统镜像进行解压缩操作。解压缩的方法采用LZO压缩对应的解压缩算法,根据前述信息可以得知,LZO的解压缩速度是极快的,所以因为解压缩所带来的影响几乎可以忽略不计。
步骤四、按照对该操作系统的压缩方式对应的解压方式进行解压;将解压完成的操作系统装载至内存指定位置,并且将地址传入CPU,开始启动操作系统并运行。
在操作系统校验通过并解压缩成功后,将解压过的内核镜像拷贝到内存进行操作系统的启动;跟单嵌入式操作系统的启动流程无误,主要通过操作系统的bsp层完成,启动流程图如图4所示,分为两个阶段完成,第一阶段主要为汇编函数实现,进行硬件的初始化,包括屏蔽中断、初始化寄存器、设置CPU、初始化内存、初始化Cache、设置堆栈和其他硬件等操作,然后设置启动参数,传递入口函数,重定位到内核入口进行第二阶段,第二阶段主要为C语言函数实现,最终跳转到操作系统内核进行内核的加载并启动,在图4中的“重定位到内核入口”步骤前的工作即属于第一阶段,其余的为第二阶段。
步骤五、按顺序选择下一个分区的操作系统,返回步骤三,进行校验与解压,以此类推直到进行到最后一个操作系统分区。
在操作系统启动后,可以利用启动的操作系统的文件系统对其余分区的操作系统镜像进行管理,可以进行操作系统镜像的在线更新或者进行校验失败的镜像修复(替换)。如图5所示,假设默认的分区1中的操作系统镜像损坏,分区2中的操作系统镜像成功校验并启动,当校验正常的操作系统2成功启动并正常运行后,用户通过操作系统中的文件管理系统对分区进行管理,并将新的操作系统镜像作为文件通过网络传输的方式写入到对应存储分区中,将各个分区里面的操作系统镜像进行替换,在操作系统重启的时候即可加载被替换后的镜像,从而实现操作系统损坏镜像的修复或者操作系统镜像的升级。
Claims (3)
1.一种多模冗余的嵌入式操作系统启动方法,其特征在于,具体步骤如下:
步骤一、针对星载嵌入式计算机,将使用的星载操作系统进行压缩;
步骤二、根据操作系统的个数以及星载嵌入式计算机的存储器大小,对存储器进行分区,每一个分区存储一个操作系统;
将原本存储一个操作系统的存储器划分为多个分区,每个分区有自己的起始地址,每个分区存储一个操作系统;
步骤三、星载计算机启动时首先使用bootloader手动选择或是自动选择当前使用的操作系统,并根据分区表内对应操作系统分区的校验信息进行CRC校验,判断该分区的操作系统是否正常启动,如果是,进入步骤四;否则,进入步骤五;
使用的操作系统默认初始值为第一分区中存储的操作系统;
步骤四、按照对该操作系统的压缩方式对应的解压方式进行解压;将解压完成的操作系统装载至内存指定位置,并且将地址传入CPU,开始启动操作系统并运行;
在操作系统启动后,利用启动的操作系统的文件系统对其余分区的操作系统镜像进行管理,进行操作系统镜像的在线更新或者进行校验失败的镜像修复和替换;
步骤五、按顺序选择下一个分区的操作系统,返回步骤三,进行校验与解压,以此类推直到进行到最后一个操作系统分区。
2.如权利要求1所述的多模冗余的嵌入式操作系统启动方法,其特征在于,所述的存储器包括分区表区域,操作系统镜像区域和其他数据区;分区表区域包括分区信息;按顺序排列的各操作系统的起始地址,大小和校验信息;分区信息包括操作系统的个数以及编号;操作系统镜像区域包括按顺序排列的各操作系统的镜像。
3.如权利要求1所述的多模冗余的嵌入式操作系统启动方法,其特征在于,所述的步骤三中,本方法使用不同的存储设备存放bootloader,并通过继电设备选择使用哪个存储设备中的bootloader;通常模式下bootloader存放在nor flash当中,并从norflash中启动;当用户发现norflash bootloader无法启动时,通过给继电设备发送特有命令,使跳线切换到EEPROM设备中,加载并启动EEPROM设备中的bootloader,并在此bootloader中管理操作系统分区或加载操作系统。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810608848.0A CN108958814B (zh) | 2018-06-13 | 2018-06-13 | 一种多模冗余的嵌入式操作系统启动方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810608848.0A CN108958814B (zh) | 2018-06-13 | 2018-06-13 | 一种多模冗余的嵌入式操作系统启动方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108958814A true CN108958814A (zh) | 2018-12-07 |
CN108958814B CN108958814B (zh) | 2020-09-01 |
Family
ID=64488492
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810608848.0A Active CN108958814B (zh) | 2018-06-13 | 2018-06-13 | 一种多模冗余的嵌入式操作系统启动方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108958814B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110674046A (zh) * | 2019-09-24 | 2020-01-10 | 上海航天电子通讯设备研究所 | 提高星载嵌入式文件系统可靠性的方法 |
CN113495729A (zh) * | 2020-03-20 | 2021-10-12 | 株洲中车时代电气股份有限公司 | 一种软件升级方法及装置 |
CN114116023A (zh) * | 2021-06-15 | 2022-03-01 | 荣耀终端有限公司 | 操作系统启动方法、设备、存储介质及计算机程序产品 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1017512B (zh) * | 1987-07-15 | 1992-07-22 | 米歇林建筑总公司 | 转动中轮胎的充气装置 |
CN106648809A (zh) * | 2017-01-10 | 2017-05-10 | 上海航天控制技术研究所 | 一种卫星星载软件的启动方法 |
-
2018
- 2018-06-13 CN CN201810608848.0A patent/CN108958814B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1017512B (zh) * | 1987-07-15 | 1992-07-22 | 米歇林建筑总公司 | 转动中轮胎的充气装置 |
CN106648809A (zh) * | 2017-01-10 | 2017-05-10 | 上海航天控制技术研究所 | 一种卫星星载软件的启动方法 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110674046A (zh) * | 2019-09-24 | 2020-01-10 | 上海航天电子通讯设备研究所 | 提高星载嵌入式文件系统可靠性的方法 |
CN113495729A (zh) * | 2020-03-20 | 2021-10-12 | 株洲中车时代电气股份有限公司 | 一种软件升级方法及装置 |
CN114116023A (zh) * | 2021-06-15 | 2022-03-01 | 荣耀终端有限公司 | 操作系统启动方法、设备、存储介质及计算机程序产品 |
Also Published As
Publication number | Publication date |
---|---|
CN108958814B (zh) | 2020-09-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110780890B (zh) | 系统升级方法、装置、电子设备和介质 | |
JP6236533B2 (ja) | 差分アップデートパッケージの作成方法及び装置、システム差分アップデート方法及び装置 | |
CN110196729B (zh) | 应用程序更新方法、设备和装置及存储介质 | |
CN101694624B (zh) | 处理软件安装包光盘镜像文件的方法及装置 | |
JP2009544095A (ja) | Ota可能な携帯端末のプログラム更新システム及び方法 | |
US6615364B1 (en) | Computer system and methods for acquiring dump information and system recovery | |
CN105808292A (zh) | 嵌入式终端设备的固件升级方法 | |
CN108958814A (zh) | 一种多模冗余的嵌入式操作系统启动方法 | |
CN103473099A (zh) | 一种移动终端的软件升级方法和系统 | |
CN103365696A (zh) | Bios镜像文件获取方法及装置 | |
CN110825419A (zh) | 一种固件刷新方法、装置及电子设备和存储介质 | |
CN105630630B (zh) | 数据热备份方法及系统 | |
US9652416B2 (en) | Storage device for performing in-storage computing operations, method of operation the same, and system including the same | |
US20190303172A1 (en) | Information processing apparatus, device assignment method, and computer readable medium | |
JPWO2008129620A1 (ja) | 完全二重化システム、システム制御方法およびシステム制御プログラム | |
CN106325911A (zh) | 一种实现bootrom升级的方法及装置 | |
CN113900673B (zh) | 系统安装包的管理方法、设备、存储介质及程序产品 | |
JP2002073378A (ja) | 計算機システムのダンプ取得方法および装置 | |
US20180329632A1 (en) | High-volume, low-latency data processing in flexibly configured local heterogeneous computing environments | |
CN113821263B (zh) | 操作系统的管理方法、设备、存储介质及计算机程序产品 | |
CN117762455A (zh) | Bios固件文件的更新方法及装置、存储介质、电子设备 | |
CN111124294B (zh) | 一种扇区映射信息的管理方法及装置、存储介质和设备 | |
US11809275B2 (en) | FaaS in-memory checkpoint restore | |
CN113535182B (zh) | 项目工程的构建方法、装置、计算机设备和存储介质 | |
CN113918096B (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 |