Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Hypo
SZU_CSSE_master
提交
dc0f3cc3
S
SZU_CSSE_master
项目概览
Hypo
/
SZU_CSSE_master
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SZU_CSSE_master
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
dc0f3cc3
编写于
12月 21, 2019
作者:
H
Hypox64
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update README.md
上级
8bb25e48
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
22 deletion
+22
-22
7.大作业_在ext2上实现的数据加密存储/README.md
7.大作业_在ext2上实现的数据加密存储/README.md
+21
-21
README.md
README.md
+1
-1
未找到文件。
7.大作业_在ext2上实现的数据加密存储/README.md
浏览文件 @
dc0f3cc3
[toc]
##
#
1 题目描述
## 1 题目描述
选择的题目为第三题:
以现有文件系统的代码为基础,增加数据加密存储的功能。
1.
在某种内存文件系统(例如ramfs)上实现;90分
2.
在某种磁盘文件系统(例如ext2fs)上实现:100分
在本文中实现的是在ext2上实现的数据加密存储的功能。
##
#
2 设计方案
###
#
2.1 linux文件系统分析
## 2 设计方案
### 2.1 linux文件系统分析
  
关于虚拟文件系统vfs的部分,本文将不在赘述,本文将侧重于分析当用户态read发起时整个文件系统的工作流程。分析以read为例,write与read相类似。
  
值得一提的是在linux中读写数据均分为Direct读写和缓存读写两种形式。为了简化流程,且不分析底层的代码片段,本文的分析将会默认缓存命中。
...
...
@@ -55,8 +55,8 @@ const struct file_operations ext2_file_operations = {
  
```do_generic_file_read()```
会分为两步,首先获取缓存页find_get_page()然后判断页缓存的标记满足条件,如果满足就
```copy_page_to_iter()```
,至此用户态
```read()```
结束。如果缓存不命中将继续进行下一步操作,本文将不再具体分析。整个详细的读写流程如下图所示:
![
image
](
images/ext2文件读写详细流程.png
)
###
#
2.2 设计思路
####
#
2.2.1 整体思路
### 2.2 设计思路
#### 2.2.1 整体思路
  
从对文件系统的分析可以看出无论是哪一种子文件系统(ext2/ext4/fat)对会由经过虚拟文件系统vfs的传递最终指向
```.read_iter```
以及
```.write_iter```
, 而对于不同子文件系统,都单独对这个两个指向进行了定义。一般而言,他们会分别指向
```generic_file_read_iter()```
以及
```generic_file_write_iter()```
,所以我们只需要将ext2的
```.read_iter```
以及
```.write_iter```
指向我们修改过的函数即可:
```
c
// my_modules/ext2/file.c
...
...
@@ -89,7 +89,7 @@ ssize_t generic_file_read_iter_my(struct kiocb *iocb, struct iov_iter *iter)
}
```
####
#
2.2.2 读写数据截获
#### 2.2.2 读写数据截获
  
为了构建新的函数截获读写数据,需要分析
```generic_file_read_iter()/generic_file_write_iter()```
源码,这时会发现
```struct kiocb *```
以及
```struct iov_iter *```
两个结构体。
  
其中
```struct kiocb *```
的描述为: kernel I/O control block即内核I/O控制块。其主要包括当前文件的描述信息
```struct file ```
以及一些控制信息。其定义如下:
```
c
...
...
@@ -132,13 +132,13 @@ struct iovec
};
```
  
所以,为了截获数据只需对
```struct iov_iter *```
遍历就可以得到每个用于储存读写缓存数据的用户空间缓存区地址iov_base,然后对地址按照iov_len读出就可以获得读写缓存数据。
####
#
2.2.3 加密以及解密
#### 2.2.3 加密以及解密
  
加密以及解密部分就用了最简单的与1异或的操作,这不仅同时适用于加密与解密,而且还不会改变数据长度。具体实现步骤及代码见调试与验证过程。
##
#
3 调试与验证过程
###
#
3.1 准备工作
####
#
3.1.1 将ext2修改为系统模块
## 3 调试与验证过程
### 3.1 准备工作
#### 3.1.1 将ext2修改为系统模块
  
将ext2文件系统编译成模块化,当我们需要对ext2进行修改的时候,就不需要重新编译内核。这样可以大大加快调试速度。
*
1.修改.config文件,将File system里的ext2标注为模块[M]
```
bash
...
...
@@ -178,7 +178,7 @@ depends: mbcache
[
root@localhost ext2]# modprobe mbcache
[
root@localhost ext2]# insmod ext2.ko
```
####
#
3.1.2 创建环回设备用于测试ext2文件系统
#### 3.1.2 创建环回设备用于测试ext2文件系统
  
在磁盘中创建并挂载用于测试的ext2文件系统
```
bash
#创建文件
...
...
@@ -217,7 +217,7 @@ Writing superblocks and filesystem accounting information: done
/dev/loop0 on /mnt/bean
type
ext2
(
rw,relatime,seclabel,errors
=
continue
,user_xattr,acl
)
```
####
#
3.1.3 ext2.ko模块加载测试
#### 3.1.3 ext2.ko模块加载测试
  
创建文件data并复制到 /mnt/bean
```
bash
[
root@localhost ext2]#
cat
/home/hypo/Desktop/data
...
...
@@ -233,8 +233,8 @@ aaaaaaa
  
可以发现复制文件时所修改的ext2模块已经生效,截图如下:
![
image
](
./images/ext2模块挂载验证.png
)
###
#
3.2 编写代码并调试
####
#
3.2.1 调试流程
### 3.2 编写代码并调试
#### 3.2.1 调试流程
  
每次修改代码后都将使用以下流程进行调试
```
bash
umount /mnt/bean
#取消挂载设备
...
...
@@ -247,7 +247,7 @@ echo "aaaaaaa" > /mnt/bean/data #写入测试
dmesg |
tail
-5
#获取printk输出
cat
/mnt/bean/data
```
####
#
3.2.2 写入加密测试
#### 3.2.2 写入加密测试
  
在这一部分中,将编写函数
```generic_file_write_iter_my```
用于截取传入
```generic_file_write_iter```
的
```iov_iter```
,对其所指向的内存的内容对1异或操作进行加密。由于并没有修改ext2的文件读取方法,这种测试环境下可以模拟储存介质丢失的情况。
```
c
ssize_t
generic_file_write_iter_my
(
struct
kiocb
*
iocb
,
struct
iov_iter
*
from
)
...
...
@@ -298,7 +298,7 @@ b->114(ascii)->111 0010
111 0010 xor 000 0001 = 111 0011 ->115 ->'c'
![
image
](
./images/写入加密测试.png
)
####
#
3.2.3 读取解密测试
#### 3.2.3 读取解密测试
  
在这一部分中,将编写函数
```generic_file_read_my```
用于截取传出
```generic_file_read_iter```
的
```iov_iter```
,对其所指向的内存的内容对1异或操作进行解密。为了验证解密工作,在测试时会注释掉加密的部分。
  
用于读取解密部分的代码如下:
...
...
@@ -340,7 +340,7 @@ ccccccc
![
image
](
./images/读取解密测试.png
)
  
可以发现对明文不加密写入的情况下进行读取并解密,也将获得密文。
####
#
3.2.4 加密-解密联合测试
#### 3.2.4 加密-解密联合测试
  
写入加密与读取解密结合在一起后,形成加密-解密回路后在安装了该ext2模块的电脑上可以对/mnt/bean文件夹内的文件进行正常读写。
  
结果如下:
```
bash
...
...
@@ -360,7 +360,7 @@ bbbbbbb
![
image
](
./images/加密-解密测试.png
)
  
当加密解密形成回路,就可以正常的读写文件
###
#
3.3 加密验证(模拟储存介质丢失的情况)
### 3.3 加密验证(模拟储存介质丢失的情况)
  
存储加密最重要的作用就是防止存储设备丢失后数据会被窃取
  
这里将模拟将加密的文件在另外一台电脑中打开的情况。
...
...
@@ -380,12 +380,12 @@ const struct file_operations ext2_file_operations = {
![
image
](
./images/储存设备丢失测试_2.jpg
)
乱码一篇,加密成功!
##
#
4 心得体会
## 4 心得体会
完成这项作业花了将近1周时间,从编译内核开始一步步过来,感触良多。下面的VMware快照就是见证者。最开始想在vfs里截获数据进行加密,但是每次修改一点代码就要编译大半天,而且经常即使编译通过了也开不了机。最后问了同学发现可以把ext2文件系统模块化编译,这才恍然大悟,走上正轨。总得来说还是学到了很多东西的。
![
image
](
./images/VMware快照.png
)
最后强调一下VMware 害人不浅,同样的代码在VMware下一加载模块就会死机(键盘灯会闪,怀疑是
有内核保护机制,不给改
),换成VirtualBox就可以了。
最后强调一下VMware 害人不浅,同样的代码在VMware下一加载模块就会死机(键盘灯会闪,怀疑是
VMware 有内核保护机制,不给注入数据
),换成VirtualBox就可以了。
##
#
5 参考资料
## 5 参考资料
[1] SunnyZhang的IT世界.Ext2文件系统读数据流程分析.https://www.jianshu.com/p/acdadea07fd8.
[2] DenzilXu.Ext2文件系统—文件读写.https://blog.csdn.net/DenzilXu/article/details/8579130.
[3] OnePunch-Man.linux内核分析:read过程分析.https://blog.csdn.net/u013837209/article/details/54923508.
...
...
README.md
浏览文件 @
dc0f3cc3
## Linux-homework of SZU
*
这是深圳大学罗秋明老师开设的linux操作系统课程的作业, 配套书籍《操作系统之编程观察》罗秋明 著。
*
包含实验过程记录以及课后思考的截图图像以及代码。
### [Example](./
2.进程控制/note
.md)
### [Example](./
7.大作业_在ext2上实现的数据加密存储/README
.md)
![
image
](
./example.png
)
<br>
![
image
](
./example_2.png
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录