L4RE 学习笔记——编程相关概念

1.Capabilities and Naming

L4Re是一个基于细粒度访问控制及Capabilities (能力权限)的系统。

通常来讲,拥有一个Capabilities(能力权限)意味着被允许同其代表的对象通信。所有用户可见的内核对象,如task,thread,IRQs等都只能通过能力权限来访问。能力权限存储在每个任务的能力权限表中,并且由选择器引用。简单的讲,选择器就是一个指向当前任务能力权限包的索引。‘

事实上,一个基于能力权限的系统,用的是‘localnames’,因为每个任务只能访问拥有权限的对象,其余对象都是不可访问的。

      

       通常情况下,所有的应用程序在启动时会初始化一套可用对象(定义能力权限)。然后利用这些能力权限,去申请更大的能力权限,或是传递能力权限给其他应用程序。

 

2.Initial Environment and Application Bootstrapping

L4Re提供加载应用程序的初始化环境;这个环境包括一套初始化L4Re对象的能力权限,如下:

l  以‘data spaces’形式初始化的内存分配器

l  能够创建另外的内核对象的‘factory’

l  用于调试输入输出的‘Vcon’对象

l  其他的需要用到的特定的能力权限

 

在应用程序的引导加载期间,loader会为ELF文件中的每个私有的region建立“dataspace”。其中包括代码和数据段、程序第一个任务的堆栈。

这个loader的实现就是‘moe’根任务。‘moe’任务启动‘init’进程来负责下一步的启动程序。这个默认的init进程就是‘ned’,它是以lua脚本来实现的。

 

注:其中的moe、ned模块在上一篇“L4RE 学习笔记——简单教程”有介绍。

2.1配置能力权限

默认的L4Re 初始化程序(“ned”)提供一个基于lua脚本的配置文件,用于程序的启动和能力权限的配置。Ned自身也包含一套用于初始化环境的对象。其中最重要的对象是factory——它允许创建内核对象如,IPC、task、thread等。

local caps = {

name = some_capability

}

       Ned提供的lua包也支持创建applicationtask、region-map对象等来在一个新新任务中启动一个ELF文件。

L4.default_loader:start({caps = { some_service = service } }, "rom/program --arg");

2.2连接服务器与客服端

一般情况下,一个服务器与客户端的连接意味着一个IPC gate。它对服务器与客户端都有效:

local loader = L4.default_loader; -- which is Moe

local svc = loader:new_channel(); -- create an IPC gate

loader:start({ caps = { service = svc:svr() }}, "rom/my_server");

loader:start({ caps = { service = svc:m("rw") }},"rom/my_client");

       你可以看到,首先创建IPC gate,利用loader:new_channel()。这个gate的能力权限存储在svc变量中。然后,二进制文件my_server在一个新任务中启动,并且拥有着IPC gate的全部控制权(:svc())。同样的,客户端程序my_client则拥有着更少的权限(:m(“rw”)),这也是必要的。现在,server和client可以相互通信,收消息了。

再看一个示例:

localloader = L4.default_loader; -- which is Moe

localsvc = loader:new_channel():m("rws"); -- create an IPC gate with rwsrights

loader:start({caps = { service = svc:svr() } }, "rom/my-service");

loader:start({caps = { foo_service = svc:create(object_to_create, "param") }},"rom/client");

这个示例和第一个有些类似,区别在于ned自身调用了factory对象的create方法。

3 内存管理——data space和regionmap

3.1 User-levelpaging

基于L4的系统的内存管理都是(user-level)用户态的事情,通常情况下调用pager程序。任务可以给其他任务全部或部分自己拥有的内存。内核提供一个更安全的方法——memory mapping。

内存管理是分层级的。这个根就是sigma0,它能够获取所有的系统资源,并且更具先来先服务的原则对资源进行分配。内存在任务间分配的粒度是page-size。着依赖CPU的mmu,通常是4kB。

3.1.1Data spaces

Data space是L4Re对一些以内存映射方式访问的对象的抽象。这些对象包括:常规内存、文件系统提供的ROM或disk中的文件、heap、stack等

3.1.2Virtual Memory Handling

       virtual memory regions (VMRs)的管理对象——region map,负责处理一个任务的所有虚拟内存映射,所以它也是任务默认的pager。

3.1.3Memory Allocation

动态内存分配基于L4Re的系统使用data spaces,详细见L4Re::Dataspace和 L4Re::Rm类

4.输入输出

支持C-style的printf和C++的streams。提供能力权限Vcon完成这个功能。Vcon在moe实现,可输出到串口或屏幕,详见后续Virtual Console分析。

5. InitialMemory Allocator and Factory

见L4Re::Mem_alloc和Factory类实现。

6.pthread 支持

支持标准pthread库。这里不赘述。

7.IDL(Interface Definition Language)

关于IPC与RPC相关内容后面再详细研究。

8.L4Re编译系统

L4Re用BID(custommake-based build system)编译系统。

8.1 编译L4Re

l  创建编译目录:

L4Re必须在源码外面构建。从源码根目录运行如下命令,可以创建一个目录,同时获取相关代码文件在目录中:、

makeB=<builddir>

l  Invoking Make

       编译目录创建好后,有两种方式Invoking Make:

1.      到构建目录,用特定的参数invode make

2.      到源码目录,利用BID:makeO=<builddir> ....

8.2 编写BID  makefile

编译系统export了不同的roles。

范例:

PKGDIR?= <path to package’s root directory> # e.g., ’.’ or ’..’

L4DIR?= <path to L4Re source directory> # e.g. ’$(PKGDIR)/../..’

<variousdefinitions>

include$(L4DIR)/mk/<role>.mk

目前定义的roles包括:

• project.mk - Sub-project Role

• subdir.mk - Directory Role

• prog.mk - Application Role

• lib.mk - Library Role

• include.mk - Header File Role

• doc.mk - Documentation Role

• test.mk - Test Application Role

• idl.mk - IDL File Role (currently unused)

• runux.mk - Tests in FiascoUX Role

BID-globalVariables:

Variable

Description

CC

C compiler for target

CXX

C++ compiler for target

HOST_CC

C compiler for host

OST_CXX

C++ compiler for host

8.2.1prog.mk - Application Role

设置的全局变量

MODE:编译的目标种类,可能的取值有,

• static - build a statically linked binary (default)

• shared - build a dynamically linked binary

• l4linux - build a binary for running on L4Linux on the targetplatform

• host - build for host system

• targetsys - build a binary for the target platform with thecompiler's default settings

SYSTEMS:平台架构,如amd64等

TARGET:编译生成的二进制文件名

 

Target-specific Configuration Variables如下

SRC_C/ SRC_CC / SRC_F / SRC_S:源文件

REQUIRES_LIBS:依赖的库

DEPENDS_PKGS:依赖的包

CPPFLAGS/ CFLAGS / CXXFLAGS / FFLAGS / ASFLAGS:c预处理器、c编译器、c++编译器、fortran编译器和汇编器的选项。

LDFLAGS:链接器‘ld’的选项

LIBS:依赖的lib库,用‘-l’作为前缀

PRIVATE_LIBDIR:额外的lib路径

CRT0/ CRTN:启动和完成的代码文件

LDSCRIPT:链接脚本

8.2.2 include.mk - Header File Role

负责将头文件安放在合适的位置。

INCSRC_DIR:头文件路径

TARGET

EXTRA_TARGET

CONTRIB_HEADERS:如果设置值,则头文件会被放进${BUILDDIR}/include/contrib/${PKGNAME} 而不是${BUILDDIR}/include/l4/${PKGNAME}

INSTALL_INC_PREFIX

PC_FILENAME

8.2.3 test.mk - Test Application Role

TEST_TARGET、TARGET_$(ARCH)、TEST_EXPECTED、TEST_EXPECTED_REPEAT、TEST_TIMEOUT、

NED_CFG:lua配置文件,用于启动时传递给ned

REQUIRED_MODULES、QEMU_ARGS、MOE_ARGS、KERNEL_CONF、L4LINUX_CONF、TEST_SETUP、TEST_LOGFILE、TEST_WORKDIR


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值