Arachne【源码分析】及AESA、PortSmashA
相关内容可以参考论文《-SMT: Core- SMT -based 》
模块划分
:处理句柄、建立断开连接、核请求和释放、阻塞线程、核调度(核心函数,功能是先给被抢占的线程分配核再给被阻塞的分配核,)。
这些核调度的规则如何落实到线程?应该是通过的阻塞(sys->read)。如何具体将不同线程放到指定核心上?通过交换对应的上下文()。
:通过和共享内存与交互,发出请求,具体功能由完成
:向用户提供API,会调用等。
代码流程图
Init函数(主线程)
首先分析命令行参数来设置全局变量等()。配置好(其中位置:/tmp//)。根据命令行参数中的核数量分配做一个默认的。
发送核数量请求(::),具体会通过来向发送请求。
这需要先启动起来,并与之建立连接。告诉我的进程ID、线程ID。如果当前线程的对应进程刚创建,则之后会收到全局内存共享、进程内存共享的地址,然后地址对应的文件映射到内存(分别取名为、)。
通过建立好的连接,发出各个优先级的核数量请求()。
根据可供管理的核数量,建立若干内核线程(入口是)。
初始化主线程的核信息、栈信息及其他信息。
函数(主线程)
某些信息的维护,关键的是把目标Main作为一个task保存到数据结构中,用于之后调度。
函数(内核线程)
初始化核心信息。阻塞自己直到获得核ID(::ble):发送到。等待核分配。
分配到核之后,信息维护,包括初始化栈,返回地址指向,之后会通过转换到。
信息维护,等待任务(目标Main)到来(不断的遍历,直到有一个包含任务,没有时间片的概念,任务执行完去执行下一个),然后运行它。
(需root权限)
配置的相关信息。包括受管理的核和不受管理的核。
【细节】
$=/sys/fs//
$=/sys/fs///
$=$/
$=$/
默认将除核0外其他核都作为 Core,并创建目录($/|)。先设置 :将当前进程放到 下($/.procs的进程转移到$/.procs),创建管理 中核心数量、线程的文件($/.cpus|tasks)。然后设置 :创建$/tasks
【细节结束】
(将某个线程绑定到特定核,应该是通过来实现的)
配置全局共享内存(/tmp//,修改权限让端无需root权限),设置和epoll用于监听请求。
真正地启动,进入一个循环等待并处理请求的函数(,具体由不断等待请求)。
建立连接:当线程通过发出连接请求时,(只有本端的地址,没有对端的地址,只能通过epoll来触发)接收到,并建立一个线程专用的(有两端的地址信息),从收到线程的进程ID、线程ID。如果对方的所属进程第一次与我建立连接,那么我就配置进程共享内存(/tmp//$),将全局共享内存和进程共享内存通过发给线程。
收到各个优先级核数量的请求()。进行信息维护,如请求与上一次请求有变,则进行核调度()。
收到阻塞线程的请求()。根据情况阻塞线程(已运行在托管核上的内核线程如果被要求回收核,那就回收内核,不然让内核线程继续运行,即不阻塞)。之后进行核调度,(把),直到有可用的核给内核线程。
当托管核变为非托管核,会出现核上线程存在的情况。抢非托管核会出现抢占情况。
AesA性能分析
(AESA是使用线程库对AES进行多线程运算。AES代码取自。AESA跑的数据可以看仓库)
当线程执行时间