Arachne【源码分析】及AESA、PortSmashA

相关内容可以参考论文《-SMT: Core-SMT -based 》
模块划分
:处理句柄、建立断开连接、核请求和释放、阻塞线程、核调度(核心函数,功能是先给被抢占的线程分配核再给被阻塞的分配核,) 。
这些核调度的规则如何落实到线程?应该是通过的阻塞(sys->read) 。如何具体将不同线程放到指定核心上?通过交换对应的上下文() 。
:通过和共享内存与交互 , 发出请求,具体功能由完成
:向用户提供API , 会调用等 。
代码流程图
Init函数(主线程)
首先分析命令行参数来设置全局变量等() 。配置好(其中位置:/tmp//) 。根据命令行参数中的核数量分配做一个默认的 。
发送核数量请求(::),具体会通过来向发送请求 。
这需要先启动起来,并与之建立连接 。告诉我的进程ID、线程ID 。如果当前线程的对应进程刚创建,则之后会收到全局内存共享、进程内存共享的地址,然后地址对应的文件映射到内存(分别取名为、) 。
通过建立好的连接,发出各个优先级的核数量请求() 。

Arachne【源码分析】及AESA、PortSmashA

文章插图
根据可供管理的核数量,建立若干内核线程(入口是) 。
初始化主线程的核信息、栈信息及其他信息 。
函数(主线程)
某些信息的维护,关键的是把目标Main作为一个task保存到数据结构中,用于之后调度 。
函数(内核线程)
初始化核心信息 。阻塞自己直到获得核ID(::ble):发送到 。等待核分配 。
分配到核之后,信息维护,包括初始化栈 , 返回地址指向,之后会通过转换到 。
信息维护,等待任务(目标Main)到来(不断的遍历 , 直到有一个包含任务,没有时间片的概念,任务执行完去执行下一个),然后运行它 。
(需root权限)
配置的相关信息 。包括受管理的核和不受管理的核 。
【细节】
$=/sys/fs//
$=/sys/fs///
Arachne【源码分析】及AESA、PortSmashA

文章插图
$=$/
$=$/
默认将除核0外其他核都作为 Core,并创建目录($/|) 。先设置 :将当前进程放到 下($/.procs的进程转移到$/.procs),创建管理 中核心数量、线程的文件($/.cpus|tasks) 。然后设置 :创建$/tasks
【细节结束】
(将某个线程绑定到特定核,应该是通过来实现的)
配置全局共享内存(/tmp//,修改权限让端无需root权限),设置和epoll用于监听请求 。
真正地启动 , 进入一个循环等待并处理请求的函数(,具体由不断等待请求) 。
【Arachne【源码分析】及AESA、PortSmashA】建立连接:当线程通过发出连接请求时,(只有本端的地址,没有对端的地址,只能通过epoll来触发)接收到,并建立一个线程专用的(有两端的地址信息),从收到线程的进程ID、线程ID 。如果对方的所属进程第一次与我建立连接,那么我就配置进程共享内存(/tmp//$),将全局共享内存和进程共享内存通过发给线程 。
收到各个优先级核数量的请求() 。进行信息维护,如请求与上一次请求有变 , 则进行核调度() 。
收到阻塞线程的请求() 。根据情况阻塞线程(已运行在托管核上的内核线程如果被要求回收核,那就回收内核,不然让内核线程继续运行,即不阻塞) 。之后进行核调度,(把),直到有可用的核给内核线程 。
当托管核变为非托管核,会出现核上线程存在的情况 。抢非托管核会出现抢占情况 。
AesA性能分析
(AESA是使用线程库对AES进行多线程运算 。AES代码取自 。AESA跑的数据可以看仓库)
当线程执行时间