seL4操作系统基础06:dataport interface与seL4SharedData connector
目录
1 示例程序分析
1.1 示例程序结构
1.2 CMakeList.txt文件分析
1.3 component类型定义
1.3.1 dataport interface概述
1.3.2 dataport interface类型
1.3.3 dataport interface实例
1.4 hello-2.camkes分析
1.4.1 seL4SharedData connector类型
1.4.2 seL4SharedData connector实例
1.5 component源码分析
1.6 运行结果
2 编译生成文件分析
2.1 编译生成文件结构
2.2 client component编译生成文件分析
2.2.1 camkes-component-client.h
2.2.2 buf1_seL4SharedData_0.c
2.2.3 buf2_seL4SharedData_0.c
2.3 echo component编译生成文件分析
3 实验:使用event interface同步component对shared memory的访问
3.1 实验目的
3.2 源码分析
3.2.1 dataport interface数据类型定义
3.2.2 component类型定义
3.2.3 系统定义
3.2.4 configuration属性
3.2.4.2 shared memory访控属性(Port Privileges)
3.2.5 component源码
3.2.5.2 echo component源码
3.3 运行效果
3.4 编译生成文件分析
1 示例程序分析
1.1 示例程序结构
1. Emitter.camkes & emmitter.c
Emitter component的类型定义与实现,用于发送event
2. Consumer.camkes & consumer.c
Consumer component的类型定义与实现,用于接收event
3. CMakeList.txt
向系统描述本模块的构建方式
4. hello-2.camkes
描述本模块的组成方式
5. str_buf.h
包含自定义的shared memory数据类型
说明:本节实验代码通过如下命令提取,但仅使用其编译框架,代码重新编写
./init --tut hello-camkes-2 --solution
1.2 CMakeList.txt文件分析
从CMakeList.txt中我们可以得知
1. 系统中包含Client和Echo这2种component类型,并且指定了他们对应的源文件
2. 使用hello-2.camkes描述整个系统
1.3 component类型定义
1.3.1 dataport interface概述
1. dataport interface用于实现2个component对shared memory的访问
2. 定义dataport interface的component对shared memory默认具有读写权限,但是可以在configuration元素中重新设置
3. camkes提供了默认的dataport interface数据类型Buf,在实现上,这是一个PAGE_SIZE大小的数组
4. 用户也可以自定义dataport interface数据类型,如示例程序中的MyData_t数据类型
1.3.2 dataport interface类型
dataport interface类型由dataport关键字与shared memory数据类型构成
说明:MyData_t数据类型
MyData_t是示例程序中自定义的shared memory数据类型,其中data用于传输数据,ready用于通知对端数据是否准备完成
1.3.3 dataport interface实例
1. 由于dataport interface是一种对称的interface,因此两端的component均使用dataport关键字定义interface实例
2. dataport interface实例名在component中有2个作用,
① 作为shared memory的变量名,且变量为指针类型
② 作为调用dataport相关函数的前缀
1.4 hello-2.camkes分析
1.4.1 seL4SharedData connector类型
seL4SharedData也是camkes提供的标准connector类型,由projects/camkes-tool/include/builtin/std_connector.camkes引入
1. 可见seL4SharedData connector连接的两端为对称的dataport interface,且均不需要分配线程
2. seL4SharedData connector中并不指定shared memory的大小,而是依靠实现定义(e.g. 示例程序中定义的MyData_t数据类型的大小)
说明:seL4SharedData connector template模板文件
对于template文件,我们不做分析,还是直接分析编译后生成的C语言文件
由于dataport interface是一种对称的interface,因此两端的template文件均为projects/camkes-tool/camkes/templates/seL4Noticification-from.template.c
1.4.2 seL4SharedData connector实例
1. connection实例定义在composition元素中,因为composition是包含component和connector实例的容器
2. connection实例连接了2个component实例中的interface实例
说明:虽然dataport interface是对称结构,但是在seL4SharedData connector中还是有from端和to端。经过后续上机验证,交换seL4SharedData connector实例中的from端和to端是可以的
1.5 component源码分析
1. client component
2. echo component
说明1:shared memory使用
① buf1为client component向echocomponent传输数据,buf2为echo component向client component传输数据
② 传输过程通过shared memory本身的数据位进行同步
说明2:acquire和release函数的作用
① acquire和release函数调用用于在component之间保持shared memory的一致性,本质上是一个内存屏障
② acquire函数用于在有多个读者的情况下同步shared memory,因为在读操作之间,shared memory中的内容可能被修改
③ release函数用于在多个写者的情况下同步shared memory,每个写者在写入后需要调用
1.6 运行结果
2 编译生成文件分析
2.1 编译生成文件结构
2.2 client component编译生成文件分析
2.2.1 camkes-component-client.h
这里我们也只分析新增的函数声明,
1. extern Buf *buf1 & extern MyData_t *buf2声明
① 此处声明了buf1 & buf2两个指向shared memory的指针类型变量
② 其中buf1指针的基类型Buf由camkes系统定义,buf2指针的基类型MyData_t由我们自定义
2. buf1_size & buf2_size宏
① 这2个宏计算了shared memory的大小
② 同时提供了<interface name>_get_size函数供component获取shared memory的大小
3. release & acquire函数
release & acquire函数对应的宏定义在projects/util_libs/libutils/include/utils/fence.h文件中,根据注释,这些宏用于实现内存屏障
其中COMPILER_MEMORY_RELEASE用于实现内存写屏障,COMPILER_MEMORY_ACQUIRE用于实现内存读屏障
4. buf1__init & buf2__init函数
① 这是dataport interface的初始化函数(interface name为buf1和buf2)
② 由于使用WEAK属性修饰,即弱函数,表示event__init函数可以不实现
③ 这2个函数均未被调用
说明:参考之前的经验,seL4SharedData connector类型中定义的两端interface均使用"with 0 threads"修改,因此都没有调用interface初始化函数的时机
2.2.2 buf1_seL4SharedData_0.c
1. buf1变量定义
① buf1为Buf类型指针变量,指向from_0_buf1_data的起始地址
② from_0_buf1_data是一个大小为4KB,且地址4KB对齐的数组
③ Buf类型在projects/camkes-tool/libsel4camkes/include/camkes/dataport.h文件中定义
2. buf1_wrap_ptr函数
① buf1_wrap_ptr函数用于将普通指针封装为dataport_ptr_t类型的指针
② dataport_ptr_t类型在projects/camkes-tool/libsel4camkes/include/camkes/dataport.h文件中定义,用于向用户程序屏蔽细节
③ 在封装void *ptr指针时,会检验指针范围的合法性
3. buf1_unwrap_ptr函数
该函数的行为与buf1_wrap_ptr函数相反,用于解除dataport_ptr_t类型的封装,返回程序中可用的指针
2.2.3 buf2_seL4SharedData_0.c
buf2_seL4SharedData_0.c的内容与buf1_seL4SharedData_0.c类似,需要注意的是,虽然MyData_t类型的大小远小于4KB,但是在camkes中,还是为其分配了一页的内存
说明:如果定义的数据类型超过4KB怎么办呢?
其实在buf2_seL4SharedData_0.c的assert断言中,已经明确了shared memory的大小不能超过4KB
我们在MyData_t类型中增加字段,使其超过4KB,可见编译时报错
也就是说,seL4SharedData connector支持的shared memory不能超过4KB
2.3 echo component编译生成文件分析
由于dataport interface的对称性,在echo component中引入的内容与在client component中是一致的,此处不再赘述
3 实验:使用event interface同步component对shared memory的访问
3.1 实验目的
结合使用event interface与dataport interface,使用event来同步2个component对shared memory的操作
说明:本节实验代码通过如下命令提取
./init --tut hello-camkes-2 --solution
3.2 源码分析
3.2.1 dataport interface数据类型定义
示例中定义了2种dataport interface数据类型,其中,
① str_buf_t类型以二维数组的形式组织多个字符串
② ptr_buf_t类型以字符串指针数组的形式组织多个字符串,其中指针类型为dataport_ptr_t
3.2.2 component类型定义
1. event interface
① echo event为Clent通知Echo
② client event为Echo通知Client
2. dataport interface
除了使用自定义数据类型,也使用了camkes默认提供的Buf类型
3.2.3 系统定义
其他部分都比较好理解,下面重点说明configuration元素,
① configuration元素必须属于一个assemble元素
② configuration元素是描述属性的容器,描述的对象是composition元素中定义的实例
下面我们结合实例,说明这里指定的2种属性,同时再补充说明其他几种常见属性
3.2.4 configuration属性
3.2.4.1 线程优先级(Thread Priority)
可以在不同层次指定线程优先级,
1. 使用_priority属性可以设置control thread的优先级,也就是run函数对应线程的优先级
2. 也可以单独指定interface thread的优先级,使用[interface实例名_priority]
注意:在编译后文件中,目前还没找到interface thread优先级的体现
3. 使用priority属性则是设置component中所有thread的优先级,如示例中的操作
说明1:线程优先级最高为255,最低为0
说明2:camkes线程模型(Thread Model)
① camkes中的component通常是多线程的
② 对于定义了control字段的component,会有一个control thread,该线程最后会调用component中定义的run函数。即使component中没有定义control字段,上述线程也会存在,用于进行初始化操作
该特性体现在编译生成的camkes.environment.c文件中
- 定义control字段的component
- 未定义control字段的component
③ 对于connector类型定义中没有使用"with 0 threads"修饰的interface,camkes会为其创建一个线程(per-interface thread),这些线程的操作均由camkes自动生成的代码完成
3.2.4.2 shared memory访控属性(Port Privileges)
1. port privileges共有3种:"R"(读)、"W"(写)、"X"(执行),如果不加设置,默认component对shared memory具有读/写/执行权限
2. 通过port interface的_access属性,可以设置component对shared memory的访控属性。在示例程序中,对于port d,echo component只能读,client component只能写。如果越权操作,将会导致系统错误(详见下文源码分析)
3.2.4.3 CPU亲和性(Thread CPU affinity)
1. 根据camkes的线程模型,可以指定component中所有线程 / control thread / interface thread的亲和性
2. 线程默认绑定在CPU0执行
3. 设置CPU亲和性的方式与设置线程优先级类型,
① affinity属性设置所有线程的CPU亲和性
② _affinity属性设置control thread线程的亲和性
③ [interface实例名_affinity]属性设置指定interface thread的CPU亲和性
3.2.4.4 线程栈大小(Thread Stack)
1. camkes中每个线程默认的栈大小为4KB,也可以在编译系统中设置
2. 可以通过stack_size / _stack_size / [interface实例名_stack_size]属性设置所有线程 / control thread / interface thread的线程栈大小
3. 设置的线程栈大小必须是4KB的整数倍,如果不足,将向上补齐
4. camkes中的线程栈,在栈的顶端和底部均有一个4KB的未映射区域,作为哨兵(guard page)使用,用于检测栈的上下溢出操作
3.2.5 component源码
3.2.5.1 client component源码
说明:dataport_wrap_ptr函数
① dataport_wrap_ptr函数在client component编译后生成的camkes.c文件中定义
② dataport_wrap_ptr函数会依次调用当前component中包含的所有基于dataport interface的指针封装函数,而这些函数的指针范围检查可以确保返回值的正确性
③ dataport_unwrap_ptr函数的实现也是相同的思路,基于dataport interface的指针解封函数会通过id确保返回值的正确性
3.2.5.2 echo component源码
3.3 运行效果
说明:触发错误
如上文所述,client对d_typed标识的shared memory只有读权限,向其中写入数据会导致vm fault
3.4 编译生成文件分析
之前关于event interface与dataport interface及其connections的编译后文件已有分析,此处不再赘述
seL4操作系统基础06:dataport interface与seL4SharedData connector相关推荐
- seL4操作系统基础05:event interface与seL4Notification connector
目录 1 示例程序分析 1.1 示例程序结构 1.2 CMakeLists.txt文件分析 1.3 component类型定义 1.3.1 event interface概述 1.3.2 event ...
- seL4操作系统基础01:seL4 whitepaper概览
目录 Chapter 1:What Is SeL4 Chapter 2:SeL4 Is a Microkernel and Hypervisor, It Is Not an OS 2.1 微内核结构 ...
- seL4操作系统基础02:从Hello World开始
目录 1 实验环境部署 1.1 Ubuntu环境搭建 1.2 实验代码下载 1.3 实验代码使用方法 1.3.1 提取实验代码 1.3.2 编译实验代码 1.3.3 运行实验代码 2 Hello Wo ...
- 计算机与操作系统基础小结
计算机基础概念 1946年二月美国,世界上第一台电子计算机ENIAC诞生,似乎从这一年开始世界便逐渐变得不一样了.随着半个世纪的时间,计算机技术蓬勃发展,推动人类进入信息社会. 计算机操作界面: ①图 ...
- javascript基础06
javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所 ...
- 服务器开发系列(三)——Linux与Windows操作系统基础功能对比
系列文章目录 服务器开发系列(一)--计算机硬件 服务器开发系列(二)--Jetson Xavier NX 文章目录 系列文章目录 前言 一.操作系统概述 二.Linux和Windows的应用场景 三 ...
- 计算机和操作系统基础知识
-----------------------siwuxie095 计算机和操作系统基础知识 1.操作系统(Operating System,简称 OS),是管理计算机硬件与 软件资源的计算机程序,同 ...
- *1 计算机基础和操作系统基础及几大协议
计算机基础和操作系统基础 计算机为什么叫电子计算机(因为他永远是二进制来运行) 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存 ...
- Linux操作系统基础 Intel32位系统架构总览
前言 说是Linux操作系统基础,其实应该是Intel IA-32架构,但是以学习Linux操作系统为目的,故而称为<Linux操作系统基础>.本部分开始主要讲解80x86保护模式下基本概 ...
最新文章
- cacti 添加redis监控(远程服务器)
- Kmeans算法介绍及其实现
- 经典C语言程序100例之五九
- 案例 显示分数 js
- python爬取新闻存入数据库_python 爬取古诗文存入mysql数据库的方法
- 2017.9.26 于神之怒加强版 失败总结
- 今年因为疫情很多信用卡逾期,结果会怎么样?
- HDU1870 愚人节的礼物【堆栈+输入输出+水题】
- ubunntu安装php7.0_乌班图Ubuntu 16.04下安装PHP 7过程详解
- Domino(群组工作软件)
- 一次数据库的简单性能优化
- 信息技术开拓视野——记IT战略规划与企业架构培训课程
- 出现窗口:CMD提示应用程序错误
- 3.1 Vendor Model浅析
- 3D建模软件大总结,你都知道哪些?
- App兼容性测试/MONKEY配置和安装
- 记一次苦逼的sql注入
- 闻酥园与宫廷糕点的桃酥对比
- java编程技术交流
- ICDE-2020 论文简析:空间众包中的预测任务分配 : 一种数据驱动的方法 Predictive Task Assignment in Spatial Crowdsourcing
热门文章
- linux 运行python效率高还是windows高_为什么使用Mac开发比Windows效率高?
- python class def try_python 中exception,class学习
- centos7安装docker并设置开机自启以及常用命令
- Python根据正则表达式找到相应的字符串然后进行替换
- html js轮播图无白链接,JavaScript:100%原生js实现左右切换的轮播图(无延迟加载)...
- jmap查看java进程占用的数据库连接数
- 怎么让手机变成震动器_手机厂商都在说的线性马达,到底是个什么东西?
- MySQL5.7--项目数据库不同出现的问题
- 我的世界java导出皮肤_我的世界Alex1.8夕立poi皮肤
- ios开发 方形到圆的动画_3Blue1Brown 动画制作教程(1)--制作第一个自己的动画