Hyperkernel验证实验的复现与z3环境初识
Hyperkernel验证实验的复现与z3环境初识
前言
建议顺序阅读本文!禁止转载。--@CarpVexing(https://www.cnblogs.com/CarpVexing/p/15948336.html)
Boss的项目,要求对os验证的典型研究进行一些研究,于是我花费半个礼拜复现了一下Hyperkernel这个实验。关于z3证明器在os验证方面的潜力与前景,本文不做探讨,仅将复现过程简单做个备忘。
笔者之前还想复现中科大μC_OS-Ⅱ验证实验,奈何项目主页给出的验证文件和虚拟机镜像打包文件挂载在“中科大·耶鲁高可信软件联合研究中心”的服务器下,但是这个服务器寄了,东西都down不到了。
论文来源
这是项目主页: UNSAT: Hyperkernel (washington.edu)
这是github地址(基础用法): GitHub - uw-unsat/hyperkernel
这是论文地址:https://unsat.cs.washington.edu/papers/nelson-hyperkernel.pdf
系统选择
我没有完全按照它们给出的配置进行设置,而是尽量靠近他们所要求的版本。实验平台为win10的vmware。
虚拟机环境:VMware Workstation 16 Pro ver.16.1.2 build-17966106
系统:Linux Ubuntu 17.10
镜像:ubuntu-17.10.1-desktop-amd64.iso
分配硬盘20G,内存8G,自动检测光驱。

前置环境配置
首先,我们需要编译器环境。但是在此之前,需要先将apt下载源进行更改。不同版本ubantu有不同的改法,笔者设置如下:
sudo su
vi /etc/apt/sources.list
东西全删了,改为:
deb https://mirrors.cloud.tencent.com/ubuntu/ bionic main universe
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
接下来所有脚本默认管理员权限了,不再sudo。对apt-get进行更新:
apt-get update
如果你在之后的环境配置中遇到依赖包需要降低版本的问题,可以先装一个aptitude工具:
apt-get install aptitude
接着安装编译环境:
apt install build-essential
apt install cmake
apt install lang
build-essential包括了gcc,g++,make等。笔者版本如下:gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3);GNU Make 4.1。
如果发现gcc、g++、make、cmake、clang中的任何一个不能再shell中直接调用,请用apt或aptitude重新单独安装。
由于直接在Ubuntu环境下下载文件可能不太方便,建议利用VMware tools设置一处共享文件夹,方便资源的转移。
配置python
python选的是2.7的默认版本,2.7.6。直接apt下载即可。
apt install python2.7
tar -zxvf pip-9.0.1.tar.gz
cd pip-9.0.1
python2.7 setup.py install
请注意,pip并不是必须安装的,只是怕出现py包依赖出现莫名其妙的问题,可以临时查缺补漏。
请注意,pip和pip2此时都会指向pip-9.0.1。
接下来,由于本项目中用到的不同脚本对py的调用有多种写法,我们需要将python、python2都链接到默认环境变量名python2.7上。建议使用纯净的环境进行配置,倘若存在python3环境可能与2.7产生冲突。设置如下:
echo alias python=python2.7 >> ~/.bashrc
echo alias python2=python2.7 >> ~/.bashrc
source ~/.bashrc
安装Z3
请不要用pip安装z3-solver!这可能导致严重的版本偏差和文件错误依赖。我们需要自己编译并安装z3环境。
操作如下(参考链接):
git clone https://github.com/Z3Prover/z3.git
cd z3
python scripts/mk_make.py
cd build
make
sudo make install
如果这一步出现问题,请重新验证编译器GCC或clang环境是否正常。
另外给出卸载z3的方法:
cd z3/build
sudo make uninstall
笔者的z3版本是Z3 version 4.8.15 - 64 bit。
请注意,此时应该可以直接在脚本中调用Z3,但是在python2.7中无法import z3。因此需要添加py的库依赖路径:
vi /etc/profile
在文本最后添加(注意改成你自己的z3路径):
export PYTHONPATH=$PYTHONPATH:/usr/local/z3/build/python/
保存更改:
source /etc/profile
此时在python2.7中应当可以import z3。出现任何报错,都说明依赖路径没有设置到位。
安装LLVM5.0.0
这是本项目复现最麻烦的一步!请耐心做完,直接apt会导致llvm缺少工具,无法使用!
首先在这里下载llvm5.0.0: LLVM Download Page 下载如下源码包:

假设当前路径为~/llvm/,且下载好的内容都在这里。解压并整理:
tar -xf cfe-5.0.0.src.tar.xz
tar -xf clang-tools-extra-5.0.0.src.tar.xz
tar -xf compiler-rt-5.0.0.src.tar.xz
tar -xf libcxx-5.0.0.src.tar.xz
tar -xf llvm-5.0.0.src.tar.xz
mv cfe-5.0.0.src clang
mv clang/ llvm-5.0.0.src/tools/
mv clang-tools-extra-5.0.0.src extra
mv extra/ llvm-5.0.0.src/tools/clang/
mv compiler-rt-5.0.0.src compiler-rt
mv compiler-rt llvm-5.0.0.src/projects/
整理后路径下应该只剩下libcxx-5.0.0.src和llvm-5.0.0.src了。保持在这个路径,进行操作:回到上一级创建build文件夹
cd ..
mkdir build
cd build
cmake ../llvm -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Release -DLLVM_USE_LINKER=gold
../llvm是你自己的路径。若遇到错误,请检查你的cmake、g++环境是否正常。
接下来进行编译与安装,这一步非常耗时,且容易出错:
make -j4
sudo make install
安装完成后,llvm应当能够在shell中直接调用。
验证Hyperkernel
先把多线程数拉满:
cat /proc/sys/kernel/threads-max
echo 333333 > /proc/sys/kernel/threads-max
cat /proc/sys/kernel/threads-max
下载项目 GitHub - uw-unsat/hyperkernel 。
将工作目录移到项目目录下。
完整的验证,直接输执行:
make hv6-verify
图中.是验证成功,E是error,F是failure。需要说明的是,内存错误和线程错误都会带来验证错误。完整验证估计需要耗费20h以上的时间。



单独验证可以执行:
make hv6-verify -- -v --failfast HV6.test_sys_set_runnable

运行 Irpy 测试套件(似乎完整验证完成前无法执行):
make irpy/test
结语
本文由@CarpVexing发布于2022.2。Hyperkernel实际上已然是五年前的项目了,已经有了不少Applications and extensions,值得一看。接下来笔者考虑深入了解一下z3,有机会再作新文。
Hyperkernel验证实验的复现与z3环境初识的更多相关文章
- 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155303 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...
- 【经典漏洞案例】NSA黑客工具包——Windows 0day验证实验
还记得今年4月中旬,Shadow Brokers(影子经纪人)黑客组织发布出一份震惊世界的机密文档,其中包含了多个Windows 远程漏洞利用工具,此工具集覆盖大量的Windows服务 器,可以被任何 ...
- 20155318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155318 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)命令行下Java程序开发 步骤一(新建文件夹): 打开windows下的cmd → ...
- multipath多路径实验01-构建iscsi模拟环境
multipath多路径实验01-构建iscsi模拟环境 前几天跟同事网上闲聊技术,吐槽之前自己没有配置过多路径的经历,虽然多路径的配置过程很简单,职责划分也应是主机或存储工程师来搞定,DBA只需要直 ...
- 20162308 实验一《Java开发环境的熟悉》实验报告
a 20162308 实验一<Java开发环境的熟悉>实验报告 实验内容 使用JDK编译.运行简单的Java程序. 使用IDEA 编辑.编译.运行.调试Java程序. 实验要求 没有Lin ...
- 20162330 实验一 《Java开发环境的熟悉》 实验报告
2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验一 <Java开发环境的熟悉> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623 ...
- 20162302 实验一《Java开发环境的熟悉》实验报告
实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:Java开发环境的熟悉 实验器材:装有Ubuntu的联想拯救者80RQ 实验目的与要求:1.使 ...
- 2018-2019-2 20175306实验一《Java开发环境的熟悉》实验报告
2018-2019-2 20175306实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 实验一 Java开发环境的熟悉-1 ·建立有自己学号的实验目录. ·通过vim Hel ...
- #2018-2019-2-20175204 张湲祯 实验一 《Java开发环境的熟悉》实验报告
2018-2019-2-20175204 张湲祯 实验一 <Java开发环境的熟悉>实验报告 一.实验内容及步骤 一.使用JDK编译.运行简单的Java程序 1.输入cd zyz命令进入z ...
- 2018-2019-20175315 实验一 《Java开发环境的熟悉》实验报告
2018-2019-20175315实验一 <Java开发环境的熟悉>实验报告 一.实验内容及步骤 实验1 1.用mkdir建立“20175303exp1”的目录 2.在“20175303 ...
随机推荐
- MYSQL5.7索引异常引发的锁超时处理记录
原始sql: update a set a.x=x where a.xid in (select b.xid from b inner join c on b.xxx = c.xxx) and a.x ...
- sap IUT255 Integration of SAP CRM and SAP IS-U_EN_Col62.pdf
sap IUT255 Integration of SAP CRM and SAP IS-U_EN_Col62.pdf sap IUT255 Integration of SAP CRM and ...
- dnspy查看async方法
- linux 服务器 重命名
vim /etc/hosts 追加 10.10.134.68 RmcbTestDB3 RmcbTestDB3 # ip 名称 名称 127.0.0.1 localhost ...
- SPI接口(续一)
SPI接口共涉及到11个寄存器,下面就来对它们进行具体分析. 先来看SPI配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40058000(SPI0),0x4005C000(SPI1). (1 ...
- Day 21 21.1:CrawlSpider(全站数据爬取)
CrawlSpider(全站数据爬取) 实现网站的全站数据爬取 就是将网站中所有页码对应的页面数据进行爬取. crawlspider其实就是scrapy封装好的一个爬虫类,通过该类提供的相关的方法和属 ...
- npm设置和取消代理的方法
设置代理 npm config set proxy=http://server:port npm config set https-proxy https://server:port // https ...
- vue中v-if与v-show区别
vue中显隐方法常用两种,v-show和v-if,但这两种是有区别的. v-if v-if 控制元素显示或隐藏是把dom元素整个的渲染或者删除,如果删除,也就是页面中不存在这个dom元素,以此达到隐藏 ...
- redhat用unbound配置DNS
redhat配置unbound 1.配置IP地址 2.配置本地yum 3.安装unbound,没有nslookup命令自行安装bind-utlis 4.配置unbound.conf(vi /etc/u ...
- iOS开发之检测项目是否包含UIWebView
应苹果审核要求不能包含UIWebView,所以我们上线之前应该扫一下项目是否包含UIWebView 我们直接打开终端 cd 到工程文件下面 执行命令 grep -r UIWebView . 在扫描结 ...