目录

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同步componentshared 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相关推荐

  1. 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 ...

  2. seL4操作系统基础01:seL4 whitepaper概览

    目录 Chapter 1:What Is SeL4 Chapter 2:SeL4 Is a Microkernel and Hypervisor, It Is Not an OS 2.1 微内核结构 ...

  3. seL4操作系统基础02:从Hello World开始

    目录 1 实验环境部署 1.1 Ubuntu环境搭建 1.2 实验代码下载 1.3 实验代码使用方法 1.3.1 提取实验代码 1.3.2 编译实验代码 1.3.3 运行实验代码 2 Hello Wo ...

  4. 计算机与操作系统基础小结

    计算机基础概念 1946年二月美国,世界上第一台电子计算机ENIAC诞生,似乎从这一年开始世界便逐渐变得不一样了.随着半个世纪的时间,计算机技术蓬勃发展,推动人类进入信息社会. 计算机操作界面: ①图 ...

  5. javascript基础06

    javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所 ...

  6. 服务器开发系列(三)——Linux与Windows操作系统基础功能对比

    系列文章目录 服务器开发系列(一)--计算机硬件 服务器开发系列(二)--Jetson Xavier NX 文章目录 系列文章目录 前言 一.操作系统概述 二.Linux和Windows的应用场景 三 ...

  7. 计算机和操作系统基础知识

    -----------------------siwuxie095 计算机和操作系统基础知识 1.操作系统(Operating System,简称 OS),是管理计算机硬件与 软件资源的计算机程序,同 ...

  8. *1 计算机基础和操作系统基础及几大协议

    计算机基础和操作系统基础 计算机为什么叫电子计算机(因为他永远是二进制来运行) 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存 ...

  9. Linux操作系统基础 Intel32位系统架构总览

    前言 说是Linux操作系统基础,其实应该是Intel IA-32架构,但是以学习Linux操作系统为目的,故而称为<Linux操作系统基础>.本部分开始主要讲解80x86保护模式下基本概 ...

最新文章

  1. cacti 添加redis监控(远程服务器)
  2. Kmeans算法介绍及其实现
  3. 经典C语言程序100例之五九
  4. 案例 显示分数 js
  5. python爬取新闻存入数据库_python 爬取古诗文存入mysql数据库的方法
  6. 2017.9.26 于神之怒加强版 失败总结
  7. 今年因为疫情很多信用卡逾期,结果会怎么样?
  8. HDU1870 愚人节的礼物【堆栈+输入输出+水题】
  9. ubunntu安装php7.0_乌班图Ubuntu 16.04下安装PHP 7过程详解
  10. Domino(群组工作软件)
  11. 一次数据库的简单性能优化
  12. 信息技术开拓视野——记IT战略规划与企业架构培训课程
  13. 出现窗口:CMD提示应用程序错误
  14. 3.1 Vendor Model浅析
  15. 3D建模软件大总结,你都知道哪些?
  16. App兼容性测试/MONKEY配置和安装
  17. 记一次苦逼的sql注入
  18. 闻酥园与宫廷糕点的桃酥对比
  19. java编程技术交流
  20. ICDE-2020 论文简析:空间众包中的预测任务分配 : 一种数据驱动的方法 Predictive Task Assignment in Spatial Crowdsourcing

热门文章

  1. linux 运行python效率高还是windows高_为什么使用Mac开发比Windows效率高?
  2. python class def try_python 中exception,class学习
  3. centos7安装docker并设置开机自启以及常用命令
  4. Python根据正则表达式找到相应的字符串然后进行替换
  5. html js轮播图无白链接,JavaScript:100%原生js实现左右切换的轮播图(无延迟加载)...
  6. jmap查看java进程占用的数据库连接数
  7. 怎么让手机变成震动器_手机厂商都在说的线性马达,到底是个什么东西?
  8. MySQL5.7--项目数据库不同出现的问题
  9. 我的世界java导出皮肤_我的世界Alex1.8夕立poi皮肤
  10. ios开发 方形到圆的动画_3Blue1Brown 动画制作教程(1)--制作第一个自己的动画