CAmkES 硬件组件:
硬件组件以组件的形式表示硬件的接口,使用关键字声明组件将创建硬件组件。
component Device {
hardware;
provides IOPort io_port;
emits Interrupt irq;
dataport Buf mem;
}
下面显示了将硬件组件连接到驱动程序组件的示例,记下连接的参数顺序。
component Driver {
uses IOPort io_port;
consumes Interrupt irq;
dataport Buf mem;
}
assembly {
composition {
component Device dev;
component Driver drv;
...
connection seL4HardwareIOPort ioport_c(from drv.io_port, to dev.io_port);
connection seL4HardwareInterrupt irq_c(from dev.irq, to drv.irq);
connection seL4HardwareMMIO mmio_c(from drv.mem, to dev.mem);
}
}
每种类型的硬件组件接口都有一些工作所需的配置,这是通过设置设备组件实例的属性来完成的。
MMIO
必须指定内存的物理地址和大小(以字节为单位),以便提供给连接的组件。下面的示例指定组件实例命名的端口是从物理地址0xE0000000开始的0x1000字节区域。
component Device {
hardware;
dataport Buf mem;
...
}
assembly {
composition {
component Device d;
...
}
configuration {
d.mem_paddr = 0xE0000000;
d.mem_size = 0x1000;
...
}
}
中断
根据平台的不同,需要指定不同的信息才能将硬件中断源与组件中断处理程序连接。
在 ARM 上,如果您使用的是传统 x86 PIC 控制器,则只需指定一个中断号即可。下面的示例指定在收到中断编号 2 时将发出事件。
component Device {
hardware;
emits Interrupt irq;
...
}
assembly {
composition {
component Device d;
...
}
configuration {
d.irq_irq_number = 2;
...
}
}
IO 端口
必须指定 IO 端口的允许范围,下面的示例指定硬件组件实例可以访问大于或等于 0x60 且小于 0x64 的 IO 端口。
component Device {
hardware;
provides IOPort io_port;
...
}
assembly {
composition {
component Device d;
...
}
configuration {
d.io_port_attributes = "0x60:0x64";
...
}
}
Port Privileges
CAmkES 允许程序员指定实例通过连接到其他实例的端口所具有的访问权限,这是通过设置端口的属性来完成的。该属性的值必须是包含字母“R”、“W”和“X”的字符串,分别授予端口读取、写入和执行权限。如果未指定,将授予完全访问权限。
component Foo {
dataport Buf data_a;
dataport Buf data_b;
}
component Bar {
dataport Buf data_a;
dataport Buf data_b;
}
assembly {
composition {
component Foo f;
component Bar b;
...
connection seL4SharedData port_a(from f.data_a, to b.data_a);
connection seL4SharedData port_b(from f.data_b, to b.data_b);
...
}
configuration {
f.data_a_access = "R";
b.data_a_access = "RW;
f.data_b_access = "R";
...
}
}