20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试
目录
【第九周学习总结】
【第八周课上测试】
## 第九周学习总结
课堂内容总结
(一)学习目标
- 理解虚拟存储器的概念和作用
- 理解地址翻译的概念
- 理解存储器映射
- 掌握动态存储器分配的方法
- 理解垃圾收集的概念
- 了解C语言中与存储器有关的错误
(二)学习内容
(1)虚拟存储器
- 概念:虚拟存储器,又称虚拟内存(VM),是对主存的抽象概念
- 能力:①高效使用主存 ②简化内存管理 ③ 保护每个进程的地址空间不被破坏
- 理解虚拟内存:①核心的 ②强大的 ③ 危险的
- 学习方向:①虚拟内存的工作流程 ②如何在程序中使用和管理虚拟内存

(2)物理寻址和虚拟寻址
虚拟内存主要是一种地址扩展技术,主要是建立和管理两套地址系统:物理地址和虚拟地址。由虚拟地址空间(硬盘上)装入进程,其实际执行是在物理地址空间(内存上)承载进程的执行。虚拟地址空间比物理地址空间要大的多,操作系统同时承担着管理者两套地址空间的转换。
- 物理寻址:主存的每个地址都是唯一的,第一个字节地址为0,接下来为2,以此类推。

- 虚拟寻址:CPU生成一个虚拟地址,先通过地址翻译转换成适当的物理地址,再被送到内存中

(3)地址翻译
- 概念: 将一个虚拟地址转换为物理地址的任务。 地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做内存管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。

- CPU中有一个专门的页表基址寄存器(PTBR)指向当前页表,使用页表进行翻译的时候方法如下:
每个虚拟地址由两部分组成:虚拟页号(VPN)+虚拟页偏移量(VPO),当CPU生成一个虚拟地址并传递给MMU开始翻译的时候,MMU利用虚拟地址的VPN来选择相应的PTE,同时将页表中的物理页号(PPN)+虚拟地址的VPO就生成了相应的物理地址(物理地址 = 页表中的物理页号 + 虚拟地址中的偏移量)。

(4)地址空间
- 虚拟页的三个状态
- 未分配的:VM系统还没分配/创建的页,不占磁盘空间
- 缓存的:当前已经缓存在物理内存中的已分配页
- 未缓存的:未缓存在物理内存中的已分配页

线性地址空间:地址空间中的整数是连续的。
虚拟地址空间:CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
地址空间的大小:由表示最大地址所需要的位数来描述。
物理地址空间:与系统中的物理存储器的M个字节相对应。
虚拟存储器的基本思想:主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
虚拟存储器的虚拟页VP:每个虚拟页大小为P=2^平字节。物理存储器——物理页PP,也叫页帧,大小也为P字节。
存储器映射概念: 通过赋予每个任务不同的虚拟–物理地址转换映射,支持不同任务之间的保护。从形式上来说就是建立一个虚拟地址空间到物理地址空间的映射关系。简单来说就是把一个虚拟地址连接到一个物理地址。
(5)动态存储器分配的方法
- 动态存储器分配
除了使用低级的mmap和munmap函数来创建和删除虚拟存储器的区域,还可以使用动态存储器分配器。动态存储器分配器维护着一个进程的虚拟存储器区域,称为堆。堆是一个请求二进制零的区域(参见浅谈Linux存储器映射),它紧接在未初始化的bss区域后开始,并向上生长(向更高的地址)。对于每个进程,内核维护着一个变量brk(即break),它指向堆顶。分配器将堆视为一组不同大小的块的集合来维护。每个块就是一个连续的虚拟存储器片(chunk),要么是已分配的,要么是空闲的。已分配的块显式地保留为供应用程序使用。空闲块可用来分配。分配器有两种,即显示分配器和隐式分配器。

两种分配器
- 显示分配器:要求应用显示的释放已经分配的块,像C,C++语言采用的机制。
- 隐式分配器:分配器检测一个已经分配的块何时不再被程序所使用时,自动free掉。这个就是垃圾收集。
显示分配器调用函数
//malloc函数
#include <stdlib.h>
// 返回:若成功则为指针,若出错则为NULL
void *malloc(size_t size);
//free函数
#include<stdlib.h>
// 返回: 无
void free(void*ptr)
- 使用动态存储器分配的原因:坚持到程序实际运行时我们才能够知道某些数据结构的大小。
(6)垃圾收集
垃圾收集器是一种动态存储器分配器,它自动释放程序不再需要的已分配块。这些块称为垃圾。自动回收堆存储的过程称为垃圾收集。垃圾收集器将存储器视为一张有向可达图,如下图所示。根节点包括堆中的指针,寄存器,栈里的变量,或者是虚拟存储器中读写数据区域内的全局变量。

C和C++的收集器不能维持可达图的精确表示,因此被称为保守的垃圾收集器。

- 标记清除垃圾收集器 = 标记阶段 + 清除阶段。标记阶段标记处根节点的所有可达的和已分配的后继,而清除阶段释放每个未被标记的已分配块。
C语言的标记收集器是保守的,其根本原因是C语言不会用类型信息来标记存储器位置。因此像int或float这样的标量可以伪装成指针。假设某个可达的已分配块在它的有效载荷中包含一个int,其值碰巧对应于某个其他已分配块b的有效载荷中的一个地址。对收集器而言是没有办法推断出这个数据实际上是int而不是指针的。因此,分配器必须保守地将b标记为可达,尽管事实上它可能是不可达的。
## 第八周课上测试
(一)求命令行传入整数参数的和
(1)测试题目
- 参考命令行参数在Linux下完成“求命令行传入整数参数的和”
- 测试代码传入自己的8位学号
- 上方提交代码,附件提交运行测试截图
(2)测试结果与截图
码云代码链接:commandline.c
编译运行
gcc commandline.c -o commandline
./commandline 2 0 1 6 5 2 2 3
- 测试截图

(3)测试中遇到的难题
>>> 运行时并没能输出命令行传入参数的和,原因是 ?

- 要像命令行参数中一样,将字符依次空格输入才行

(二)练习Y86-64模拟器汇编
(1)测试题目
- 把练习一中的代码在X86-64(Ubuntu)中反汇编,给出汇编代码和机器码的截图
- 把X86-64汇编翻译成Y86-64汇编,给出相应机器码的截图(使用Y86-64模拟器)
(2)测试结果与截图
码云代码链接
- 源代码:commandline.c
- 汇编代码:commandline.s
- 机器码:commandline.o
Linux编译命令
gcc -E xxx.c -o xxx.i //预编译
gcc -S xxx.i -o xxx.s //编译 源代码转换为汇编代码
gcc -c xxx.s -o xxx.o //汇编 汇编代码转换为二进制机器语言
gcc -o xxx.o -o xxx.out //链接 得到可执行程序
- 1.在X86-64下 (Ubuntu) 将源代码 ( commandline.c ) 转换成汇编代码 ( commandline.s )
gcc -E commandline.c -o commandline.i
gcc -S commandline.i -o commandline.s

- 2.查看X86-64下的汇编代码
cat commandline.s



- 3.查看X86-64下的机器码
gcc -c commandline.s -o commandline.o
objdump -d commandline.o


- 4.使用Y86-64模拟器,将X86-64汇编翻译成Y86-64汇编
cd pipe
./psim -t -g ../y86-code/xxxxx.yo
例如:


- 5.查看Y86-64下的机器码

(3)测试中遇到的难题
>>> 如何安装Y86-64模拟器 ?
- 1.下载Y86-64模拟器
Y86-64模拟器资源下载:Y86-64模拟器
- 2.安装词法分析工具
sudo apt-get install bison flex

- 3.安装 Tcl/Tk 支持图形界面
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5

- 4.解压sim.tar压缩包
unzip Y86-64模拟器.zip
tar -xvf sim.tar

- 5.修改makefile文件(sim文件夹下)
GUIMODE=-DHAS_GUI
TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5
TKINC=-I/usr/include/tcl8.5


- 6.编译
cd /sim
make clean;make

>>> 在安装词法分析工具时提示无法获得锁 ?

- 强制解锁
sudo rm /var/lib/dpkg/lock

>>> 在安装 Tcl/Tk 支持图形界面时出现如下依赖包问题 ?

一般出现这种情况的原因是:要装A,A依赖B,但是已经安装的软件C也依赖B,但是A依赖的B的版本和C依赖的B的版本不一致,导致了如果要安装B,那么C便不能正常运行了,所以系统报错,组织安装B。
解决方法是安装指定版本号的B。
- 1.先查看依赖关系
sudo apt-get install libxss-dev

- 2.制定 libxss1 的安装版本
根据报错的信息“下列软件包有未满足的依赖关系:libxss-dev : 依赖: libxss1 (= 1:1.2.1-2) 但是 1:1.2.2-1 正要被安装”
那么只需要sudo apt-get install xxx=yyy (xxx为提示信息的 libxss1, yyy为提示错误的1:1.2.2-1)
sudo apt-get install libxss1=1:1.2.2-1

- 3.同理解决掉另一个libxft-dev依赖包问题,然后再重新安装Tcl/Tk 支持图形界面即可
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5

>>> 在 make clean;make 的过程中出现对'matherr'未定义引用问题 ?

- 1.知在进入pipe目录并编译psim.c和pipe-std.c时出现了对'matherr'未定义引用的错误
- 2.进入psim.c,将包含matherr的语句注释掉,总共有两行

- 3.继续使用 make clean;make 编译,成功

(三)基于socket实现daytime(13)服务器和客户端
(1)测试题目
- 基于socket使用教材的csapp.h和csapp.c实现daytime(13)服务器和客户端
- 服务器的端口使用13+自己的后三位学号,服务器响应消息格式是 :
客户端IP:XXXX
服务器实现者学号:XXXXXXXX
当前时间: XX:XX:XX
- 提交代码
- 提交一个客户端至少查询三次时间的截图测试截图
- 提交至少两个客户端查询时间的截图测试截图
(2)测试结果与截图
【一个客户端查询三次时间】

【两个客户端多线程同时查询时间】

(3)测试中遇到的难题
>>> 如何使用教材的配套代码 csapp.h和csapp.c ?
- 1.下载《深入理解计算机系统》配套代码 csapp
csapp.h其实就是一堆头文件的打包,在 csapp 中可以下载
- 2.以 root 身份登录下载并解压后得到一个code文件夹

- 3.在code文件夹的子文件夹include和src中分别找到csapp.h和csapp.c,把这两个文件拷贝到文件夹 /usr/include 里

- 4.修改csapp.h文件,在最低端的 #endif 之前加上一句 #include<csapp.h>

- 5.由于csapp.c中有关于线程的头文件,在用gcc的时候最后要加上 -lpthread
如:gcc xxx.c -o xxx -lpthread
参考资料
20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试的更多相关文章
- 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B
20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...
- 20135328信息安全系统设计基础第一周学习总结(Linux应用)
学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Linux中用户管理命令/ ...
- 20135328信息安全系统设计基础第二周学习总结(vim、gcc、gdb)
第三周学习笔记 学习计时:共8小时 读书:1 代码:5 作业:1 博客:7 一.学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 ...
- 2017-2018-1 20155228 《信息安全系统设计基础》第六周学习总结&课下作业
20155228 2017-2018-1 <信息安全系统设计基础>第六周学习总结&课下作业 教材学习内容总结 异常及其种类 异常可以分为四类:中断(interrupt) ,陷阱(t ...
- 20155326 2017-2018-1 《信息安全系统设计基础》第2周学习及课堂总结myod
20155326 2017-2018-1 <信息安全系统设计基础>第1次学习及课堂总结myod 虚拟机之前出了一些问题,然后我重新弄了一个新的虚拟机. 先在虚拟机里面安装了git. 安完以 ...
- 2017-2018-1 20155239 《信息安全系统设计基础》第五周学习总结+mybash的实现
2017-2018-1 20155239 <信息安全系统设计基础>第五周学习总结+mybash的实现 mybash的实现 使用fork,exec,wait实现mybash 写出伪代码,产品 ...
- 2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd
2017-2018-1 20155318 <信息安全系统设计基础>第九周课下实践--实现mypwd 相关知识 man -k 查找含有关键字的内容 与管道命令结合使用:man -k k1 | ...
- 2018-2019-1 20165212 《信息安全系统设计基础》第八周学习总结(pwd)
2018-2019-1 20165212 <信息安全系统设计基础>第八周学习总结 一.知识点总结 1.三种并发方式 构造并发程序的方法有三种: 进程 线程 I/O多路复用 进程:用内核来调 ...
- 2017-2018-1 20155307 《信息安全系统设计基础》第san周学习总结
2017-2018-1 20155307 <信息安全系统设计基础>第三周学习总结 教材学习内容总结 无符号数和有符号数的特性,数字如何表示,IEEE标准,浮点数格式.(我感觉我把课下测试做 ...
随机推荐
- 2018/1.6 Javascript 继承和克隆
这种写法不是对象克隆,就是把obj的内存地址赋给obj2 通过 for in 克隆 不管公有还是私有的都克隆成私有的. js提供了一个克隆方法 objct.create() var obj2=obje ...
- java的设计模式 - Builder模式
Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...
- 持续集成之 Spring Boot 实战篇
本文作者: CODING 用户 - 何健 这次实战篇,我们借助「CODING 持续集成」,实现一个简单的 Spring Boot 项目从编码到最后部署的完整过程.本教程还有 B 站视频版,帮助读者更好 ...
- FreeNas搭建踩坑指南(一)
0x00 背景 最近公司的旧群晖服务器Raid6,因为同时坏了两块硬盘存储池损毁,所以领导决定买了Dell R730自己搭NAS,选来选去最后选了FreeNAS,这里记录一些踩过的坑. 0x01 问题 ...
- zookeeper安装以及遇到的一些坑
最近项目中用到了storm,然后storm中用到了zookeeper,然后今天抽空整理一下zookeeper的安装使用,原来后期再慢慢学习. 本篇文档,操作部分是摘自其他博客,里边的问题分析是自己在实 ...
- SQL常用语句(二)
--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据 --数 ...
- selenium之元素定位-xpath
被测试网页的HTML代码 <html> <body> <div id="div1" style="text-align:center&quo ...
- java学习札记
java学习札记 0x0 学习原因 本来打算大三再去跟着课程去学习java的,但是现在题目越来越偏向java,所以迫于无奈开启了java的学习篇章,同时也正好写个笔记总结下自己学习一门语言的流程. ...
- python 中 try catch finally语句中含有return语句的执行情况
无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...
- 深蓝词库转换2.4版发布,支持最新的搜狗用户词库备份bin格式
很高兴的告诉大家,感谢GitHub上的h4x3rotab提供python版的搜狗用户词库备份bin格式的解析算法,感谢tmxkn1提供了C#版的实现,深蓝词库转换终于迎来了一个重大更新,能够支持搜狗用 ...