会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 专利权 / 第I章 / 国际申请 / 请求书 / 声明 / 一种在操作系统中实现可信恢复系统的方法

一种在操作系统中实现可信恢复系统的方法

阅读:1006发布:2020-10-11

IPRDB可以提供一种在操作系统中实现可信恢复系统的方法专利检索,专利查询,专利分析的服务。并且本发明公开了一种在操作系统中实现可信恢复系统的方法。该方法建立事务声明系统调用为计算机信息系统可信计算基(TCB)操作提供事务创建和提交的接口。使得TCB操作只要使用事务声明系统调用,将其代码段声明为事务就能由可信恢复系统确保其原子性。可信恢复系统由事务管理器、日志系统、日志文件组成。事务管理器协调、管理事务的创建、提交和恢复。日志系统截获TCB操作中的所有更新操作并将其记录在日志文件中,等事务完成后再写回到磁盘,从而实现TCB操作的原子性。计算机系统失效时,只要撤销日志文件中与该TCB操作有关的数据,就可将系统重构到故障发生前的一致状态。本发明适用于主流操作系统,具有广泛地应用范围,能增加操作系统的容灾性。,下面是一种在操作系统中实现可信恢复系统的方法专利的具体信息内容。

1. 一种在操作系统中实现可信恢复系统的方法,其特征在于包括如下步骤:

1)建立面向磁盘块来设计的日志文件,它由一个长的磁盘块序列构成,每 一磁盘块都有一个序列编号,在逻辑上看作是一个循环队列,日志数据块顺序 依次写入;

2)建立与操作系统中的文件系统、页面缓冲管理层相结合的管理日志文件 的日志系统;

3)改写操作系统中关于文件数据更新操作的系统调用;

4)建立管理、协调事务的创建和提交的事务管理器;

5)调用日志系统创建一个新事务,并把新事务的标识信息保存到TCB操 作的进程控制块内,以此建立创建事务的系统调用;

6)调用日志系统的刷新进程,将所有更新刷新到日志文件,如果全部成功 提交给日志文件则表明该事务已经完成,然后在适当的时候再将数据从日志文 件中写回到它们在磁盘上的实际位置,以此建立提交事务的系统调用;

7)在TCB操作代码段的前后分别调用创建事务的系统调用和提交事务的 系统调用,被这两个系统调用包围的TCB操作代码就被声明为事务;

8)建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子 化TCB操作;

9)如果在TCB事务操作过程中出现故障,就重新启动系统,扫描日志文 件并且重做日志内记录的所有TCB更新操作,将系统恢复到故障发生前的一致 状态。

2. 根据权利要求1所述的一种在操作系统中实现可信恢复系统的方法,其 特征在于步骤3)所述的改写操作系统中关于文件数据更新操作的系统调用,包 括以下步骤:

1)在原有系统调用的基础上调用日志系统提供的创建句柄的接口,在进行 任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用;

2)调用日志系统提供的通知更新的接口,对于页面缓冲区中的磁盘块所做 的任何更新都向日志系统进行注册,通知日志系统这些数据需要被提交到日志 中;

3)调用日志系统提供的注销句柄的接口,通知日志系统该更新操作的系统 调用已经完成,日志系统将那些被更新过的磁盘块标记为脏数据块,并将这些 磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中。

3. 根据权利要求2所述的一种在操作系统中实现可信恢复系统的方法,其 特征在于所述的在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系 统调用,包括以下步骤:

1)在内存中为句柄分配空间并对其进行初始化;

2)将该句柄记录到TCB进程的进程控制块;

3)检查是否有还未完成的旧句柄,如果有则要等待旧句柄完成后才能继续 新句柄的申请工作;如果没有还未完成的旧句柄,则判断日志文件是否还有足 够的空间,如果空间不够,则要将数据回放到磁盘上来释放日志文件的空间, 如果空间足够,则为该句柄在日志文件中预留空间。

4. 根据权利要求1所述的一种在操作系统中实现可信恢复系统的方法,其 特征在于步骤8)所述的建立包括日志文件、日志系统和事务管理器在内的可信 恢复系统,原子化TCB操作,包括以下步骤:

1)TCB操作通过创建事务的系统调用向事务管理器请求一个事务身份号, 如果系统中已经有正在运行且不属于本进程的事务,那么等待该事务结束后才 能申请到新的事务身份号,申请事务身份号成功后,将事务标识信息写到进程 控制块;

2)事务管理器对TCB操作的所有更新操作,通过日志系统作为事务处理;

3)TCB操作通过提交事务的系统调用通知事务管理器提交事务,调用日志 系统的刷新进程,将文件页面缓冲区中所有与TCB操作有关的更新操作刷新到 日志文件。

5. 根据权利要求1所述的一种在操作系统中实现可信恢复系统的方法,其 特征在于步骤9)所述的扫描日志文件并且重做日志内记录的所有TCB更新操 作,包括以下步骤:

1)正向扫描日志文件,标识出所有需要被重做的事务;

2)进行第二遍扫描,每一个事务可能有一组被撤销的数据块,因此需要防 止旧日志块覆盖了使用同一个磁盘块的新数据,在第二遍扫描阶段,准备一个 所有这些撤销数据块的一个哈希表,每次需要确认一个特定的磁盘块是否应该 通过回放写回到磁盘上时,都需要使用这个哈希表;

3)进行最后一遍扫描,考虑所有需要被回放的磁盘块,每个磁盘块都要测 试其是否在需要撤销磁盘块的哈希表中,如果磁盘块不在哈希表中,则将磁盘 块写回到其在磁盘的实际位置,如果磁盘块在哈希表里面,只有存储最新数据 的磁盘块被写回到磁盘。

说明书全文

技术领域

本发明涉及操作系统技术领域,尤其涉及一种在操作系统中实现可信恢复 系统的方法。

背景技术

信息安全对国民经济,国家安全具有重要意义。当前信息安全策略中,核 心问题之一是安全产品技术必须是也只能是我国自主研发,国产化的,才能够 满足安全需求。操作系统安全是信息安全的基础,任何一个安全相关程序如果 运行在有安全漏洞的操作系统上,则仍然存在着被破坏的危险。因此,高等级 的安全操作系统是一切信息安全应用的基础。
没有操作系统提供的安全性,计算机系统的安全性是没有基础的。而意外 的系统故障则有可能破坏操作系统的一致性和安全保护性能。计算机信息系统 应该为可信计算基(Trusted Computing Base,TCB)提供过程和机制,保证计算 机信息系统失效或中断后,可以进行不损害任何安全保护性能的恢复,也就是 所谓的可信恢复。

发明内容

本发明的目的是提供一种在操作系统中实现可信恢复系统的方法
包括如下步骤:
1)建立面向磁盘块来设计的日志文件,它由一个长的磁盘块序列构成,每 一磁盘块都有一个的序列编号,在逻辑上看作是一个循环队列,日志数据块顺 序依次写入;
2)建立与操作系统中的文件系统、页面缓冲管理层相结合的管理日志文件 的日志系统;
3)改写操作系统中关于文件数据更新操作的系统调用;
4)建立管理、协调事务的创建和提交的事务管理器;
5)调用日志系统创建一个新事务,并把新事务的标识信息保存到TCB操 作的进程控制块内,以此建立创建事务的系统调用;
6)调用日志系统的刷新进程,将所有更新刷新到日志文件,如果全部成功 提交给日志文件则表明该事务已经完成,然后在适当的时候再将数据从日志文 件中写回到它们在磁盘上的实际位置,以此建立提交事务的系统调用;
7)在TCB操作代码段的前后分别调用创建事务的系统调用和提交事务的 系统调用,被这两个系统调用包围的TCB操作代码就被声明为事务;
8)建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子 化TCB操作;
9)如果在TCB事务操作过程中出现故障,就重新启动系统,扫描日志文 件并且重做日志内记录的所有TCB更新操作,将系统恢复到故障发生前的一致 状态。
步骤3)所述的改写操作系统中关于文件数据更新操作的系统调用,包括以 下步骤:
1)在原有系统调用的基础上调用日志系统提供的创建句柄的接口,在进行 任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用;
2)调用日志系统提供的通知更新的接口,对于页面缓冲区中的磁盘块所做 的任何更新都向日志系统进行注册,通知日志系统这些数据需要被提交到日志 中;
3)调用日志系统提供的注销句柄的接口,通知日志系统该更新操作的系统 调用已经完成,日志系统将那些被更新过的磁盘块标记为脏数据块,并将这些 磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中。
所述的在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调 用,包括以下步骤:
1)在内存中为句柄分配空间并对其进行初始化;
2)将该句柄记录到TCB进程的进程控制块;
3)检查是否有还未完成的旧句柄,如果有则要等待旧句柄完成后才能继续 新句柄的申请工作;如果没有还未完成的旧句柄,则判断日志文件是否还有足 够的空间,如果空间不够,则要将数据回放到磁盘上来释放日志文件的空间, 如果空间足够,则为该句柄在日志文件中预留空间。
步骤8)所述的建立包括日志文件、日志系统和事务管理器在内的可信恢复 系统,原子化TCB操作,包括以下步骤:
1)TCB操作通过创建事务的系统调用向事务管理器请求一个事务身份号, 如果系统中已经有正在运行且不属于本进程的事务,那么等待该事务结束后才 能申请到新的事务身份号,申请事务身份号成功后,将事务标识信息写到进程 控制块;
2)事务管理器对TCB操作的所有更新操作,通过日志系统作为事务处理;
3)TCB操作通过提交事务的系统调用通知事务管理器提交事务,调用日志 系统的刷新进程,将文件页面缓冲区中所有与TCB操作有关的更新操作刷新到 日志文件。
步骤9)所述的扫描日志文件并且重做日志内记录的所有TCB更新操作, 包括以下步骤:
1)正向扫描日志文件,标识出所有需要被重做的事务;
2)进行第二遍扫描,每一个事务可能有一组被撤销的数据块,因此需要防 止旧日志块覆盖了使用同一个磁盘块的新数据,在第二遍扫描阶段,准备一个 所有这些撤销数据块的一个哈希表,每次需要确认一个特定的磁盘块是否应该 通过回放写回到磁盘上时,都需要使用这个哈希表;
3)进行最后一遍扫描,考虑所有需要被回放的磁盘块,每个磁盘块都要测 试其是否在需要撤销磁盘块的哈希表中,如果磁盘块不在哈希表中,则将磁盘 块写回到其在磁盘的实际位置,如果磁盘块在哈希表里面,只有存储最新数据 的磁盘块被写回到磁盘。
本发明与现有技术相比具有的有益效果是:1)提供基于日志的面向事务的 可信恢复方法,因此可以满足高性能系统的高吞吐量和可靠性需求;2)具有快 速重启的能力,当系统发生崩溃时,可以快速地将系统恢复到一致状态;3)具 有良好的伸缩性和健壮性;4)适用于主流操作系统(Windows,Linux,Unix)的可 信恢复系统的设计。

附图说明

图1是本发明的日志文件结构图;
图2是本发明的日志文件中的事务存储结构图;
图3是本发明的创建句柄流程图;
图4是本发明的TCB更新磁盘的操作流程图;
图5是本发明的可信恢复系统结构图;
图6是本发明的TCB操作事务处理的总体流程图;
图7是本发明的创建事务流程图。

具体实施方式

本发明公开了一种在操作系统中实现可信恢复系统的方法,并采用这种方 法在Linux操作系统(发行版本Fedora Core 3,内核版本2.6.8)上建立可信恢 复系统。
在操作系统中实现可信恢复系统的方法,包括如下步骤:
1)建立面向磁盘块来设计的日志文件,它由一个长的磁盘块序列构成,每 一磁盘块都有一个的序列编号,在逻辑上看作是一个循环队列,日志数据块顺 序依次写入;
日志文件是一个非常长的磁盘块序列,每一块都有一个独一无二的序列编 号。系统恢复需要快速访问这个日志但是其中大部分可以离线保存或者丢弃。 在线日志文件用来保存日志中的“有用”部分。日志文件被管理为一个环形缓冲 区。日志文件逻辑上可以看作是一个循环队列,日志数据块顺序依次写入,如 果日志文件被写满后,则需要将部分完全完成的事务归档,释放日志的空间。
日志文件的第0块是日志的超级块,里面保存了关于该日志的详细信息, 主要信息包括磁盘块大小、磁盘块总数、日志信息开始块、日志的开始块、日 志中最旧事务的身份号等信息。日志文件的其他部分用来存放日志信息,日志 信息是以事务为单位组织的,整个日志文件的逻辑结构如图1所示。整个存放 日志信息内容的开始位置由日志超级块中的“日志信息开始块”来指明。由于日志 是一个循环结构,由日志超级块的“日志开始块”来指明日志开始位置。
在Linux系统内建立可信恢复系统,日志文件可以和TCB数据存放在同一 个磁盘上或者单独存在。日志文件占用ext3文件系统的一个i-节点,并在格式 化磁盘时候确立,如果是非默认的i-节点,则需要在挂载ext3文件系统时通过 参数指定。下面是在Linux系统内建立的日志文件的数据结构:
(1)日志超级块
日志文件的第0块就是日志超级块,里面存储了日志文件的基本信息,用 结构体journal_superblock_t来表示,其定义如下表所示:
表:journal_superblock_t定义

(2)磁盘块描述头
日志的磁盘块可以分为日志超级块、描述块、数据块、提交块和撤销块, 除数据块以外,其他几种类型的磁盘块都有一个磁盘块描述头,结构体 journal_header_t,其定义如下表所示:
表:journal_header_t定义

磁盘块的类型h_blocktype可以为以下几种类型:
描述块:JOURNAL_DESCRIPTOR_BLOCK
提交块:JOURNAL_COMMIT_BLOCK
日志超级块:JOURNAL_SUPERBLOCK
撤销块:JOURNAL_REVOKE_BLOCK 5
(3)数据块描述
描述块里面保存了若干数据块的描述信息,journal_block_tag_t,其结构比 较简单,如下表所示:
表:journal_block_tag_t定义

其中t_flags标志可以用来表明:
对应数据块已经被删除(JOURNAL_FLAG_DELETED),对应数据块 是事务的最后一个数据块(JOURNAL_FLAG_LAST_TAG)等。
日志文件中数据存储的结构形式是事务。
每一个事务占用日志文件系统的一段逻辑上连续的块号(因为日志文件是 一个循环队列,所以要注意跨越首尾的临界状况)。一个事务可以分为功能不同 的三个部分,描述块、数据块和提交块。描述块标志着事务的开始,并保存了 数据块在磁盘中的实际位置;描述块后面紧接着一系列数据块,和描述块的描 述信息一一对应,数据块则对应一个更新了的磁盘块;提交块的存在表示这个 事务已经被成功提交到日志文件。
一个事务在日志文件的存储结构图2所示。该图中的事务共占用四个磁盘 块:一个描述块,两个数据块和一个提交块。第一块的类型表明自己是描述块, 并记录了该事务身份号为1010,描述块还保留了其后两个数据块描述信息,依 次保存了事务中数据块的物理块号,数据块第0块为35,第1块为47。第二块 和第三块是数据块,保存了更新的磁盘块的副本。最后一块是提交块,表明事 务的成功结束。
在Linux系统内建立可信恢复系统,一个事务是用结构体transaction_t来 表示的,其中主要结构如下表示:
表:transaction_t定义

其中t_state的状态可以为:运行(T_RUNNING)、锁定(T_LOCKED)、 刷新(T_FLUSH)、提交(T_COMMIT)、完成(T_FINISHED)。
2)建立与操作系统中的文件系统、页面缓冲管理层相结合的管理日志文件 的日志系统;
日志系统是整个可信恢复的核心部分,它的主要功能包括:
●提供事务操作,保证TCB操作的原子性,为事务管理器提供实现事务创 建和提交服务。
●和文件系统、页面缓冲相结合,监视TCB操作中的数据更新操作,将更 新操作包装成事务操作。
●管理日志文件,按照特定顺序将事务提交到日志文件。
●当检查到系统处于不一致状态时,则扫描日志将系统恢复到一致状态。
在Linux系统内建立可信恢复系统,一个日志系统是通过一个journal_t结 构体来表示的,其主要数据如下表所示:
表:journal_t定义

3)改写操作系统中关于文件数据更新操作的系统调用,包括如下步骤:
1.在原有系统调用的基础上调用日志系统提供的创建句柄的接口,在进行任 何磁盘更新以前向日志系统申请一个句柄来处理该系统调用;
每个TCB进程在事务处理过程中进行更新操作时都要先申请一个句柄,申 请过程如图3所示。
一个句柄在Linux中是用handle_t结构体来表示的,其中主要数据如下表 所示:
表:handle_t定义

2.调用日志系统提供的通知更新的接口,对于页面缓冲区中的磁盘块所做的 任何更新都向日志系统进行注册,通知日志系统这些数据需要被提交到日志中;
每一个TCB更新磁盘的操作都要和日志系统相结合才能够保证其修改的事 务性,处理流程如图4所示。首先要计算此次更新所需要的磁盘块的数量,更 新一个数据块可能要更新另外一些元数据块,例如超级块、目录块等等。然后 要向日志系统申请一个句柄来处理更新。
成功创建句柄后,通知日志系统需要更新磁盘块,让日志系统负责处理更新前 的一些准备工作,这样才能对磁盘块进行更新。更新完日志块以后也要通知日 志系统更新已经完成,日志系统将磁盘块标记为脏数据块,并将该磁盘块加入 到事务中需要提交到日志的磁盘块的列表。
在Linux系统内建立可信恢复系统,为了通知日志系统需要将被更新的数据 提交到日志中,在内核代码ext3_jbd.h中定义了如下函数:
static inline int_ext3_journal_get_write_access(const char *where,handle_t *handle,
                                                struct buffer_head *bh,int *credits)
//通知将要更新元数据而修改该页面缓存。
static inline int_ext3_journal_dirty_metadata(const char *where,
                                              handle_t *handle,struct buffer_head *bh)
//标志一个页面缓存包含脏元数据。
static inline int ext3_should_journal_data(struct inode *inode)
//判断是否应该将数据做成日志
3.调用日志系统提供的注销句柄的接口,通知日志系统该更新操作的系统调 用已经完成,日志系统将那些被更新过的磁盘块标记为脏数据块,并将这些磁 盘块加入到事务中需要提交到日志文件的磁盘块的列表中。
在Linux系统内建立可信恢复系统,为了将那些被更新过的磁盘块标记为脏 数据块,并将这些磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中, 在内核代码transaction.c中定义了如下函数:
int journal_get_write_access(handle_t *handle,struct buffer_head *bh,int *credits)
//通知将要修改一个页面缓存来更新元数据。
int journal_dirty_data(handle_t *handle,struct buffer_head *bh)
//标志页面缓存包含脏数据,它们需要在提交当前事务以前被刷新到磁盘上。
int journal_dirty_metadata(handle_t *handle,struct buffer_head *bh)
//标志页面缓存包含脏数据,它们需要在提交当前事务以前被刷新到磁盘上。
void journal_unfile_buffer(journal_t *journal,struct journal_head *jh)
//将一个页面缓存从合适的事务队列上删除。
void journal_file_buffer(struct journal_bead *jh,transaction_t *transaction,int jlist)
//将页面缓存挂载到合适的事务列表上。
void journal_refile_buffer(journal_t *journal,struct journal_head *jh)
//将一个页面缓存从它当前的缓冲列表移除,准备将其从当前事务中完全删除。如果缓存已经在后继 的事务中被使用,那么将其转移到事务的元数据列表中。
4)建立管理、协调事务的创建和提交的事务管理器;
事务管理器为TCB操作原子化提供用来处理创建事务和提交事务的系统调 用:
1.创建事务。事务管理器调用日志系统创建一个新事务,并把新事务的事 务标识信息保存到TCB操作的进程控制块内。
2.提交事务。事务管理器调用日志系统的刷新进程,将所有更新从文件系 统的页面缓冲区刷新到日志文件,如果全部成功提交给日志文件以后则表明该 事务已经完全完成,在适当时候将数据从日志中回放到他们在磁盘上的实际位 置。
TCB操作通过向事务管理器申请一个事务保证事务期间对磁盘上TCB数据 操作的原子性,而一个TCB操作往往要使用多个系统调用。每个系统调用可以 用一个句柄来表示,而事务也就可以用多个句柄来构成。一个句柄也就是一个 系统调用,可能包括若干个磁盘块的更新。事务管理器保证事务的正确性,同 样也就保证了句柄的事务性。
句柄中的主要信息有:句柄所属的事务、句柄所需要的磁盘块、标志信息。 事务中应包括一些重要的数据,包括:所用的日志文件、事务身份号、事务状 态、要更新的磁盘块(脏块)队列、互斥锁等信息。
事务中重要的一个信息就是事务的状态,事务根据其完成的程度可以分为 下面几个状态:
1.运行:该事务现在是活跃的并且正在接受新的句柄。在计算机系统中, 某一时刻只能有一个事务处于运行状态。
2.锁定:TCB操作发出提交命令,但是已存在的句柄可能还有没有完成的。 一旦所有的已存在句柄都完成,事务将转到下一个状态。
3.刷新:一个事务的所有句柄都完成了。这个事务正在将自己写入到日志 中。
4.提交:整个事务已经被写入到日志中,该事务正在写回一个提交块来指 示该事务日志已经完成。
5.完成:该事物已经完全写到日志了。它必须保留在这里直到这些磁盘块 被刷新到它们在磁盘的实际位置。
在Linux系统内建立可信恢复系统,要建立创建事务和提交事务的系统调 用,首先在内核代码的syscall.h中添加可信恢复事务创建和提交的系统调用声 明:
asmlinkage long sys_begin_transaction(void);//事务创建
asmlinkage long sys_commit_transaction(void);//事务提交
然后在内核代码的entry.S中添加系统调用和默认底层处理程序。entry.S包 含系统调用和默认底层处理程序。同时包含了定时器处理程序,同时包含了所 有的能引起进程切换的中断和故障。
.data
ENTRY(sys_call_table)
……
.long sys_begin_transaction  /*_TRUSTED_RECOVERY_SOLO_*/事务创建系统调用
.long sys_commit_transaction  /*_TRUSTED_RECOVERY_SOLO_*/事务提交系统调用
最后在内核代码的unistd.h中定义事务创建和提交系统调用号:
#define_NR_begin_transaction 284
#define_NR_commit_transaction(_NR_begin_transaction+1)
5)调用日志系统创建一个新事务,并把新事务的标识信息保存到TCB操 作的进程控制块内,以此建立创建事务的系统调用;
在Linux系统内建立可信恢复系统,为了实现创建新事务,在内核代码 transaction.c中定义了如下函数:
static transaction_t * get_transaction(journal_t *journal,transaction_t *transaction)
//得到一个新的transaction_t对象,分配并初始化一个新的transaction。创建其为RUNNING状态并
且将它添加的当前的日志系统中。
6)调用日志系统的刷新进程,将所有更新刷新到日志文件,如果全部成功 提交给日志文件则表明该事务已经完成,然后在适当的时候再将数据从日志文 件中写回到它们在磁盘上的实际位置,以此建立提交事务的系统调用;
在Linux系统内建立可信恢复系统,为了实现提交事务,在内核代码journal.c 中定义了如下函数:
int kjournald(void *arg)//日志刷新内核线程,负责定时将完成的事务写回到日志文件。
static void journal_start_thread(journal_t *journal)
static void journal_kill_thread(journal_t *journal)//开始和结束内核线程kjournald。
int log_start_commit(journal_t *journal,tid_t tid)//开始提交事务tid,真正的的提交操作不是在这里完成,
                                                     而是通过内核线程kjournald完成。
int journal_start_commit(journal_t *journal,tid_t *ptid)//开始一个提交提交过程。
int log_wait_commit(journal_t *journal,tid_t tid)//等待特定的事务tid提交完成。
void journal_destroy(journal_t *journal)//释放一个journal_t数据结构,首先要将该journal中所有的事
                                          务提交,然后进行释放工作。
在内核代码commit.c中定义了如下函数负责将事务提交到磁盘上形成永久 性修改:
void journal_commit_transaction(journal_t *journal)
7)在TCB操作代码段的前后分别调用创建事务的系统调用和提交事务的 系统调用,被这两个系统调用包围的TCB操作代码就被声明为事务;
一个完整的TCB事务操作如下所示,事务是一段用begin_transaction()和 commit_transaction()包围起来的代码,可信恢复可以保证这段代码操作对TCB 数据修改的事务性。
begin_transaction()
……
write()
……
commit_transaction()
在Linux系统内建立可信恢复系统,要将TCB操作代码声明为事务,就要 调用sys_begin_transaction标志着事务的开始,负责向事务管理器申请并创建一个事 务。调用sys_commit_transaction标志事务的结束,向事务管理器提交一个事务。两者 中间则包含若干对TCB数据的修改操作。
8)建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子 化TCB操作;
现今主流的操作系统(Windows,Linux,Unix)的文件系统的架构基本一致, 本发明以此为基础额外增加了事务管理器、日志文件和日志系统,与原有的文 件系统结合构成了可信恢复系统,结构如图5所示。原子化TCB操作参见下文 解释。
9)如果在TCB事务操作过程中出现故障,就重新启动系统,扫描日志文 件并且重做日志内记录的所有TCB更新操作,将系统恢复到故障发生前的一致 状态。TCB事务操作过程中出现故障,例如突然断电,则可能引起系统安全的 不一致性,破坏安全保护性能。这时候需要对系统重新启动以恢复到一致安全 状态,恢复过程参见下文解释。
步骤3)所述的在进行任何磁盘更新以前向日志系统申请一个句柄来处理该 系统调用,包括以下步骤:
i.在内存中为句柄分配空间并对其进行初始化;
ii.将该句柄记录到TCB进程的进程控制块;
iii.检查是否有还未完成的旧句柄,如果有则要等待旧句柄完成后才能继续 新句柄的申请工作;如果没有还未完成的旧句柄,则判断日志文件是否还有足 够的空间,如果空间不够,则要将数据回放到磁盘上来释放日志文件的空间, 如果空间足够,则为该句柄在日志文件中预留空间。
在Linux系统内建立可信恢复系统,为了实现创建新句柄,在内核代码 transaction.c中定义了如下函数:
static int start_this_handle(journal_t *journal,handle_t *handle)
//给定一个handle,处理任意需要的锁来确保日志系统中有足够的日志空间来使该handle开始。
static handle_t *new_handle(int nblocks)//分配并初始化一个新的handle。
handle_t *journal_start(journal_t*journal,int nblocks)
//得到一个新的handle,如果当前进程原来已经申请到了handle,则使用原来的,否则分配一个新的。
我们确保日志中至少有nblocks个空闲磁盘块。
步骤8)所述的建立包括日志文件、日志系统和事务管理器在内的可信恢复 系统,原子化TCB操作,总体流程如图6所示,又可分为以下几个步骤:
<1>TCB操作通过创建事务的系统调用向事务管理器请求一个事务身份 号,如果系统中已经有正在运行且不属于本进程的事务,那么等待该事务结束 后才能申请到新的事务身份号,申请事务身份号成功后,将事务标识信息写到 进程控制块。
系统中可能存在多个事务,但是只能有一个事务处于运行状态。如果现在 已经有一个事务在运行的话,则创建新的事务要等待。TCB数据保存在同一块 硬盘上,所以修改TCB数据的TCB操作事务要共享许多磁盘数据,例如磁盘的 超级块、空闲磁盘块位图等等。为了保持事务操作的隔离性,TCB事务操作必 须进行序列化,也就是任意时刻系统中只能有一个TCB事务操作运行。
事务创建过程如图7所示。首先检查当前日志系统中是否有事务在运行, 如果有事务在运行且该事务不属于本进程,那么就需要睡眠等待,等待当前运 行的事务结束。这里检查事务是否属于本进程是为了防止进程执行两次事务创 建系统调用而造成系统死锁。
如果当前没有事务在运行则可以创建一个事务并将其进行初始化,得到一 个新的运行事务,然后将事务标识信息写到进程控制块。创建事务成功以后该 进程提交的修改操作序列就能够被日志系统进行管理而符合事务操作。
<2>事务管理器对TCB操作的所有更新操作,通过日志系统作为事务处理。
<3>TCB操作通过提交事务的系统调用通知事务管理器提交事务,调用日 志系统的刷新进程,将文件页面缓冲区中所有与TCB操作有关的更新操作刷新 到日志文件。
提交日志的过程分为下面几个步骤
a.将事务从运行状态转变到锁定状态,意味着事务不再接受新的句柄。该 事务将等待直到所有已经存在的句柄都完成。一个事务在初始化时总是拥有一 组预留的缓冲块。直到这个阶段可能有许多缓冲块还没有被使用。事务现在已 经准备被提交,没有未完成的句柄。
b.事务进入刷新状态。该事物被标记为一个正在向日志提交的事务。这个 阶段也标记日志中不存在处于运行状态的事务,新的事务请求将初始化一个新 的事务。
c.事务的缓冲块被刷新到日志。这个时候,事务的元数据和数据都还仍然在 可挥发内存中,需要被写到日志区,并且需要记录它们在磁盘的实际位置。这 个阶段开始刷新这些数据缓冲区,这需要一个日志描述块。日志描述块保存了 日志中每个元数据缓冲块到其在磁盘上的实际位置的映射表。建立好描述块以 后,数据缓冲块将被刷新到日志中。一旦日志描述块充满或者所有的元数据被 刷新到日志中时,日志描述块也被刷新到日志。现在日志中保存了所有数据缓 冲块,它们在磁盘上的实际位置也被记录下来。这些数据是持久的,如果故障 出现后可以用来进行恢复。
d.等待数据缓冲块和日志描述块I/O完成的通知。一旦I/O完成后缓冲区将 从内存列表中删除。
e.所有的数据和元数据都在持久存储器上的日志中了。现在事务需要被标志 为提交完成,这样就会知道日志中的所有更新是安全的、一致的。因此,将分 配一个日志描述块。写入一个描述信息来表示事务已经被成功提交,并且这个 块被同步写入到它在日志的位置。这以后,事务转移到提交状态。
f.当日志中存放了许多事务,还没有被刷新到磁盘时需要进行阶段e操作。 这个事务的一些元数据缓冲块可能是先前事务的一部分。他们不需要保留在旧 的事务中因为在当前提交的事务中有他们的最新副本。这些缓冲块将从旧事务 中删除。
g.这个事务被标记为完成状态。更新日志结构来反映这个特定的事务为最新 被更新的事务。在完成状态还要唤醒正在等待创建事务的进程。
在Linux系统内建立可信恢复系统,原子化TCB操作的过程实际上就是调 用上文描述的创建和提交事务、句柄的函数。
步骤9)所述的扫描日志文件并且重做日志内记录的所有TCB更新操作, 是指如果在日志文件中发现了日志记录,说明这是在系统崩溃后系统重新启动。 这时需要通过重做日志内记录的所有操作可以重建一个事务一致的系统状态。 系统重新启动后处理日志文件系统可分为以下几个步骤::
<1>正向扫描日志。如果发现一个描述块,则通过描述块内部的描述信息 计算该事务包含的数据块个数,然后直接将这些数据块跳过来读取提交块,如 果发现了提交块则将该事务记录为已经提交并需要重做。就这样一直扫描到日 志结尾。这样就可以标识出所有需要被回放的事务。
<2>进行第二遍扫描。每一个事务可能有一组被撤销的数据块,因此需要 防止旧日志块覆盖了使用同一个磁盘块的新数据。在第二遍扫描阶段,准备一 个所有这些撤销数据块的一个哈希表。每次需要确认一个特定的磁盘块是否应 该通过回放写回到磁盘上时,都需要使用这个哈希表。
<3>进行最后一遍扫描,在最后一个阶段,将考虑所有需要被回放的磁盘 块。每个磁盘块都要测试其是否在需要撤销磁盘块的哈希表中。如果磁盘块不 在哈希表中,则将磁盘块写回到其在磁盘的实际位置是安全的。如果磁盘块在 哈希表里面,只有存储最新数据的磁盘块被写回到磁盘。
在Linux系统内建立可信恢复系统,为了进行可行恢复过程,在super.c定 义了如下函数:
static int ext3_load_journal(struct super_block *,struct ext3_super_block *)
//读取日志文件,然后进行可信恢复过程,将日志中完成的事务回放到其在磁盘的实际位置。
static void ext3_mark_recovery_complete(struct super_block * sb,struct ext3_super_block * es)
//可信恢复成功完成以后,将当前文件系统标志为恢复完成状态,可以开始正常的文件操作了。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用