嵌入式操作系统镜像启动的启动优化方法

文档序号:6556478阅读:190来源:国知局
专利名称:嵌入式操作系统镜像启动的启动优化方法
技术领域
本发明涉及基于嵌入式操作系统启动领域,特别是涉及一种嵌入式操作系统镜像启动的启动优化方法。
背景技术
手机等嵌入式系统由于考虑到人的忍耐度,所以在启动的时候不能花较长的时间。为了使用上的方便,要尽量缩短手机操作系统的引导和启动时间,虽然内核经过很大程度的裁减,并且各种功能模块都尽量做了优化,但是由于硬件条件的限制,如果不对引导和启动作特殊的设计,还是会造成启动时间过长。
现在主要采用两种技术来缩短这个时间。一,固化各种不可扩展硬件的设置,尽量标准化可扩展设备的接口,节约设备检测时间。二,延时装载技术,既LazyLoading,这种技术不加载当前非必需的模块,这些模块可以在启动后待机时间内加载,或者在具体用到之后再加载,把启动时间打散,从而缩短对用户来说至关重要的反应时间。
对第一种技术来说,目前以及在将来较短一段时间内最主要的还是固化不可扩展硬件的设置,因为首先现在手机的可扩展设备还很少,其次硬件条件限制较多,所以把一些固定的设置固化在操作系统内部应该是比较理想的措施。而考虑到将来的发展趋势,手机将可以连接越来越多的外设,而且这些外设都必须是即插即用的,所以不可能固化它们的设置。但是如果给所有的手机外设制定一套标准接口,则启动时最多只需加载一个标准的公用接口模块即可,大大节省了启动时间,并节约了存储空间。
对于第二种技术来说,由于操作系统将在很多地方采用“组件化”的技术,故而非常方便Lazy Loading。并且为了进一步缩短反应时间,将“动态设置”必需模块,根据对用户的使用习惯等条件的统计,把一些用户在开机后不会立即使用的模块设置为非必须模块,而把用户经常在开机后就使用的功能设置为必须模块,这样对用户来说反应时间就得到了很大的改善。

发明内容
本发明的目的在于提供一种嵌入式操作系统镜像启动的启动优化方法。
本发明解决其技术问题采用的技术方案如下1)系统镜像准备操作系统的引导程序在启动的过程中,将操作系统内核镜像从系统的外存上载入内核,并进行解压缩,在启动过程中,引导程序如果发现只存在原始的操作系统镜像,系统将按正常程序启动;当系统启动到最简洁的基本工作状态后,操作系统将启动系统休眠过进程,这个进程的主要工作是为保存系统镜像做各种准备工作;2)保存系统镜像这部分主要完成系统现场的保存工作,首先将将建立一个虚拟终端,用来模拟通讯,然后开始结束除内核态进程,僵死进程,当前进程之外所有的进程,此后调用函数来释放尽可能多的内存空间,以减少内存镜像的大小,然后对一些驱动进行处理,对在电源管理系统中注册的所有外设,发送挂起命令,然后插入系统屏障,阻断系统执行,开始保存处理器上下文,最后将内存镜像到外部制定的设备上,最后将操作系统休眠;3)操作系统镜像的装载操作系统的引导程序在启动的过程中,将操作系统内核镜像从系统的外存上载入内核,并进行解压缩,在启动过程中,引导程序如果发现存在操作系统启动优化镜像,系统将这个镜像载入内存,并进行解压缩;系统先创立一个虚拟终端,用来显示装载镜像过程中的系统信息,首先检查镜像的正确性,然后按照顺序将镜像中的内存页面恢复到内存,最后将处理器的上下文恢复。
本发明与背景技术相比,具有的有益的效果是1、无延时上面这种方法,只能为用户造成一种假相,系统看上去可以用,已经起来,实际上在用的时候还得加载必须得模块。而嵌入式操作系统镜像启动的启动优化方法,是真实的为应用提供了一个完整的系统,直接通过设置系统的应用环境,不需要延时加载,以及在用的时候在加载必要的模块,节约了时间和能量;2、快捷性嵌入式操作系统镜像启动的启动优化方法采用的是直接设置系统环境的启动方法,这个方法更加快捷;3、通用性可以自动设置启动镜像,不需要针对不同的应用平台进行不同的设置,更换平台不需要更换镜像,只要重新启动系统,然后让系统自动根据系统情况设置一个镜像,就可以。


附图为整个系统的流程图。
具体实施例方式
在实施基于嵌入式操作系统启动优化方法时,镜像启动技术被广泛利用。
嵌入式操作系统镜像启动的启动优化方法具体实现流程如下。
一、系统镜像准备系统镜像准备过程主要分为以下几部分1、操作系统引导操作系统的引导程序在启动的过程中,首先将自己从外存上拷贝到内存空间,然后到指定的外存位置查找系统镜像,如果系统镜像存在,那么将操作系统内核镜像从系统的外存上载入内核,由于系统内核镜像比较大,一般情况下都是被压缩后保存到外存的,所以要进行解压缩;以Sistang嵌入式实验平台上的ARM-Linux操作系统为例,他的操作系统引导过程可见下面。
在内核运行之前需要系统引导程序完成加载内核和一些辅助性的工作,然后跳转到内核代码的起始地址并执行。
首先,启动后Sitsang板子将地址0x0c00 0000映射到0(可通过跳线设置),实际上从0x0c00 0000启动,进入的bootloader,但由于flash速度慢,所以bootloader前面有一小段程序把bootloader拷贝到SDRAM中的0x0AFE0100,再从0x 0800 0000运行bootloader,叫这段小程序为flashloader,flashloader必须要首先初始化SDRAM。flashloader把bootloader load到0x0AFE0100,然回跳了过去,其实0x0AFE0100就是烧在flash 0x0C000100中的真正的bootloader。
BootLoader将操作系统代码调入内存,然后将控制权交给arch/arm/boot中的Setup.S这段程序。Setup.S这段程序在实模式下对系统进行基本的检测和设置后转入保护模式把控制权交给head_armv.S。一个步骤是系统内核的解压过程,这部分代码在地址0x1000(文件/Boot/head.S),该段程序初始化寄存器,然后执行decompress_kernel(),这个函数源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三个文件。解压后数据放在地址0x100000。Head.S建立内存管理和中断管理的框架。
2、操作系统启动1)、判断是否存在快速启动镜像在内核镜像解压缩后,系统要判断是否存在快速启动镜像,如过不存在则正常启动,如果存在则快速启动。
2)、正常启动在启动过程中,引导程序如果发现只存在原始的操作系统镜像,系统将按正常程序启动,首先系统将按顺序初始化各种部件,首先初始化体系结构,然后初始化中断向量表、调度器、内存等等,最后启动系统的各种服务。
以ARM-Linux为例,这个启动过程主要从Start_kernel开始直到创建init进程。Init进程调用lock_kernel之后,在调用prepare_namespace加载rootfs之前,调用do_basic_setup函数,进行一些基础的设置,如pci,sbus,ecard等,do_basic_setup然后调用start_context_thread()和do_initcalls(),加载一些设备的驱动程序,之后,进入software_resume()这个新添加的函数,准备检查交换分区,进行系统的恢复。
software_resume函数进行一些必要的条件检测之后,调用read_suspend_image函数,来读取之前保存的镜像,如果镜像不存在读取失败,software_resume函数会调用kernel_thread(swsusp_mainloop,NULL,CLONE_FS|CLONE_FILES|CLONE_SIGHAND|SIGCHLD)来创建一个内核态的进程,swsusp_mainloop()函数调用daemonize()来释放对用户空间的引用使自己成为一个后台的守护进程,并重命名自己为kswsuspd,之后便陷入了无限的循环,并且每隔一秒检测一下swsusp_state
的值是否出现变化(若此值从0变成1,则会跳出循环,调用休眠的函数)。至此,software_resume函数返回,继续do_basic_setup以及init(),直至系统正常启动。
3)、镜像启动如果引导程序发现存在操作系统的镜像,引导程序将这个镜像载入内存,并进行解压缩;系统先创立一个虚拟终端,用来显示装载镜像过程中的系统信息,首先检查镜像的正确性,然后按照顺序将镜像中的内存页面恢复到内存,最后将处理器的上下文恢复。这部分工作的具体举例说明将放到后面。
3、镜像工作环境的建立当系统启动到最简洁的基本工作状态后,操作系统将启动系统休眠过进程,这个进程的主要工作是为保存系统镜像做各种准备工作;以Linux操作系统能够的镜像启动为例,这部分工作主要包括1)向内核的数据段里面添加一段_nosave,以便于把一些变量放到其中。这样一来,在使用这些变量的时候,就不会涉及到堆栈。
2)定义保存/恢复镜像的设备static char resume_file[256]=″/dev/modify″,此设备的主设备号是241,次设备号是2,同时需要在init/do_mounts.c中的root_dev_names[]中添加一项{″modify″,0xf102},此后通过name_to_kdev_t函数,指定参数”/dev/modify”就可以获得该设备的设备号0xf102,再通过宏MAJOR()和MINOR()就可分别获得该设备的主设备号241和从设备号2。
3)定义状态量int swsusp_state[3]用来管理进行休眠和镜像过程中的一些参数信息。
二、保存系统镜像这部分主要完成系统现场的保存工作,首先将将建立一个虚拟终端,用来模拟通讯;然后开始结束除内核态进程,僵死进程,当前进程之外所有的进程,此后调用函数来释放尽可能多的内存空间,以减少内存镜像的大小,然后对一些驱动进行处理,对在电源管理系统中注册的所有外设,发送挂起命令,然后插入系统屏障,阻断系统执行,开始保存处理器上下文,最后将内存镜像到外部制定的设备上,最后将操作系统休眠。
以ARM-Linux为例,整个过程如下所示1)、系统要建立镜像将必须调用一个叫做software_suspend函数。software_suspend()调用了do_software_suspend函数,真正开始了系统的休眠和镜像的建立。
2)、software_suspend()调用了do_software_suspend函数,首先建立一个虚拟的终端,然后开始调用freeze_processes函数来结束除内核态进程,僵死进程,当前进程之外所有的进程,此后调用free_some_memory函数来释放尽可能多的内存空间,以减少内存镜像的大小。然后对一些驱动进行处理,调用了pm_send_all(PM_SUSPEND,(void*)3)向在电源管理PM模块中注册了的设备发送系统挂起suspend的通知。
3)、最后do_software_suspend函数调用do_suspend_lowlevel函数。do_suspend_lowlevel依次调用do_magic_suspend_1(),save_processor_context()和do_magic_suspend_2()三个函数do_magic_suspend_1()调用mb()和barrier()来为接下来的save_processor_context函数做准备。Void Barrier(void)通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。
4)、save_processor_context函数保存当前状态下的CPU的运行上下文。用来保存这些值的一个struct具有_attribute_((packed))的属性,可将其成员变量紧凑排列。
5)、之后进入do_magic_suspend_2函数。此函数负责把内存页面保存到swap分区中。此函数首先调用read_swapfiles从可能的32个交换设备(包括文件和分区)中找到在前文中指定的分区/dev/modify。然后调用save_suspend_image来完成全部的复制操作之后,调用suspend_power_down,关闭或者重新启动计算机。
三、操作系统镜像的装载操作系统的引导程序在启动的过程中,将操作系统内核镜像从系统的外存上载入内核,并进行解压缩,在启动过程中,引导程序如果发现存在操作系统启动优化镜像,系统将这个镜像载入内存,并进行解压缩;系统先创立一个虚拟终端,用来显示装载镜像过程中的系统信息,首先检查镜像的正确性,然后按照顺序将镜像中的内存页面恢复到内存,最后将处理器的上下文恢复;以ARM-Linux为例,整个过程如下所示1)、开机后,BootLoader装载linux kernel并解压缩,然后start_kernel直到创建init进程。Init进程调用lock_kernel之后,在调用prepare_namespace加载rootfs之前,调用do_basic_setup函数,进行一些基础的设置,如pci,sbus,ecard等,do_basic_setup然后调用start_context_thread()和do_initcalls(),加载一些设备的驱动程序,之后,进入自己的software_resume()函数,准备检查交换分区,进行系统的恢复。
2)、software_resume函数进行一些必要的条件检测之后,调用read_suspend_image函数,来读取之前保存的镜像,read_suspend_image调用更底层的_read_suspend_image来完成主动的镜像读取工作。
3)、_read_suspend_image调用prepare_suspend_console来创建一个虚拟的控制台,用来显示恢复中的一些相关信息。之后调用bdev_read_page来从/dev/modify设备里面获取一页,得到镜像的头部信息,并调用sanity_check函数来检测镜像的头部信息是否正确,以确定现在的系统是否是休眠前的系统,如果不是则按照正常系统启动。
4)、接下来通过循环调用bdev_read_page来获得pagedir和所有的保存的内存的页面(读取内存页面的顺序与保存内存页面时的顺序正好相反)。并回复内存内容,然后read_suspend_image函数返回。接下来调用do_suspend_lowlevel来进一步地恢复系统。
5)、do_suspend_lowlevel通过对CPU寄存器Cr3的设置,把swapper_pg_dir的物理地址做为更改为页目录的物理地址。并且通过对ecx的设置,创建了新的堆栈指针。CR3用于保存页目录表的起始物理地址。由于目录是页对齐的,所以仅高20位有效,低12位保留未用。向CR3中装入一个新值时,低12位必须为0;但从CR3中取值时,低12位被忽略。每当用MOV指令重置CR3的值时,会导致分页机制高速缓冲区的内容无效,用此方法,可以在启用分页机制之前,即把PG位置1之前,预先刷新分页机制的高速缓存。CR3寄存器即使在CR0寄存器的PG位或PE位为0时也可装入,如在实模式下也可设置CR3,以便进行分页机制的初始化。在任务切换时,CR3要被改变,但是如果新任务中CR3的值与原任务中CR3的值相同,那么处理器不刷新分页高速缓存,以便当任务共享也表时有较快的执行速度。
6)、do_suspend_lowlevel接下来依次调用do_magic_resume_1()restore_processor_context和do_magic_resume_2()来完成所有的恢复工作。
7)、do_magic_resume_1()调用了mb();barrier();来为接下来的restore_processor_context函数做准备。Void Barrier(void)通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。此后,do_suspend_lowlevel开始以sizeof(char)为单位进行内存页面的复制。之所以这里不能使用copy_page这样的函数,是因为在内存页面复制的时候,会破坏堆栈(stack),在完全恢复CPU寄存器的值之前,不能再使用堆栈以及局部变量,但是可以使用位于内核代码段的_nosave区的变量。之后,restore_processor_context()函数开始恢复CPU寄存器的值。最后进入do_magic_resume_2()。
8)、do_magic_resume_2()主要处理一些清扫现场的工作。它释放掉在休眠时分配的pagedir,以保证内存完全恢复到休眠前的状态然后通过调用pm_send_all(PM_RESUME,(void*)0)向在电源管理PM模块中注册了的设备发送系统恢复resume的通知。至此,所有的工作都完成了。系统已经恢复到休眠之前的状态。
整个系统的流程图如附图所示。
权利要求
1.一种嵌入式操作系统镜像启动的启动优化方法,其特征在于1)系统镜像准备操作系统的引导程序在启动的过程中,将操作系统内核镜像从系统的外存上载入内核,并进行解压缩,在启动过程中,引导程序如果发现只存在原始的操作系统镜像,系统将按正常程序启动;当系统启动到最简洁的基本工作状态后,操作系统将启动系统休眠过进程,这个进程的主要工作是为保存系统镜像做各种准备工作;2)保存系统镜像这部分主要完成系统现场的保存工作,首先将将建立一个虚拟终端,用来模拟通讯,然后开始结束除内核态进程,僵死进程,当前进程之外所有的进程,此后调用函数来释放尽可能多的内存空间,以减少内存镜像的大小,然后对一些驱动进行处理,对在电源管理系统中注册的所有外设,发送挂起命令,然后插入系统屏障,阻断系统执行,开始保存处理器上下文,最后将内存镜像到外部制定的设备上,最后将操作系统休眠;3)操作系统镜像的装载操作系统的引导程序在启动的过程中,将操作系统内核镜像从系统的外存上载入内核,并进行解压缩,在启动过程中,引导程序如果发现存在操作系统启动优化镜像,系统将这个镜像载入内存,并进行解压缩;系统先创立一个虚拟终端,用来显示装载镜像过程中的系统信息,首先检查镜像的正确性,然后按照顺序将镜像中的内存页面恢复到内存,最后将处理器的上下文恢复。
全文摘要
本发明公开了一种嵌入式操作系统镜像启动的启动优化方法。本发明采用的方法是在操作系统启动时,引导程序直接从存储器上将原先保存的系统最小任务镜像读入内存,并根据系统读入的信息设置各种结构的属性和系统寄存器内存的信息,将系统迅速恢复到工作状态,达到快速启动的方法。本发明提出了一种操作系统镜像启动的启动优化方法,对原来操作系统启动过程进行了改进,使得系统在启动过程中更加快捷,能够非常快的达到系统的工作状态。
文档编号G06F9/445GK1818869SQ20061004985
公开日2006年8月16日 申请日期2006年3月15日 优先权日2006年3月15日
发明者陈天洲, 黄江伟, 梁晓, 钱杰, 吴心亮, 郑臻伟 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1