seL4-中断
0. 前言
还是一样的操作。
./init --tut interrupts
cd interrupts_build
ninja # 这里报错了
0.1 stack 的安装
ninja 报错了,应该是和 stack 有关。尝试了很久。终于可以了。
apt install haskell-stack
stack upgrade
stack 相关问题参考:https://github.com/seL4/camkes-vm-examples/issues/32
报错一直是 raw.githubusercontent.com
连接不上,我都有阴影了。
HttpExceptionRequest Request {
host = "raw.githubusercontent.com"
port = 443
secure = True
requestHeaders = [("User-Agent","The Haskell Stack")]
path = "/commercialhaskell/stackage-content/master/stack/stack-setup-2.yaml"
queryString = ""
method = "GET"
proxy = Nothing
rawBody = False
redirectCount = 10
responseTimeout = ResponseTimeoutDefault
requestVersion = HTTP/1.1
proxySecureMode = ProxySecureWithConnect
}
ConnectionTimeout
stack upgrade
无法正确运行(大概率不可以),就上 stack github 上下载安装包,解压然后将里面的stack安装(应该是复制到/usr/bin)。可是就算升级了还是不可以。还需要 stack setup
。
stack setup
如果不行,需要修改yaml文件。参考如下两个链接进行配置:
Stackage 源使用帮助,Hackage 源使用帮助 这两个都要看
- 编辑 ~/.stack/config.yaml 添加两部分内容(就是上面两个链接里说明的内容)
- 手动下载 global-hints.yaml 到 ~/.stack/pantry/global-hints-cache.yaml
stack setup
应该是可以了,这时候会安装GHC。- capDL-tool 是我是手动安装的。
git clone https://gitee.com/sel4_zl/capdl.git # gitee 快些
cd capDL-tool
make
make install
0.2 安装 libarchive
中间缺少什么模块我都自己默默安装了,就是这个libarchive真恼火。遇到问题了,下面是解决办法,建立软链接。报错如下:
Library can not be loaded: [Errno 2] No such file or directory: b'liblibarchive.a'
error: [Errno 2] No such file or directory: b'liblibarchive.a'
参考链接:libarchive错误:没有这样的文件或目录:‘liblibarchive.a’
pip3 install libarchive
cd /usr/lib/x86_64-linux-gnu/
ln -s -f libarchive.a liblibarchive.a
ninja
终于可以了,卡了我两天,想哭。终于可以学习中断的部分了,还有camkes。呜呜。
1. IRQController
root task拥有一个可以控制所有IRQ中断号的权能 seL4_CapIRQControl。
这个权能可以在 CSpaces 和 CSlots 间移动,但不能被复制。调用该权能意味着对所有irq的权能跟着移动了。通过 seL4_IRQControl_Get
说明希望这个 IRQControl 权能处理的 IRQ 是什么?
error = seL4_IRQControl_Get(seL4_IRQControl, 7, cspace_root, 10, seL4_WordBits);
// 触发 irq_control 权能,将 TTC0_TIMER1_IRQ 中断放置在 cslot irq_handler
error = seL4_IRQControl_Get(irq_control, TTC0_TIMER1_IRQ, cnode, irq_handler, seL4_WordBits);
2. IRQHandlers
IRQHandler权能可以访问一个单个IRQ,它们可以被移动或复制。IRQHandlers可通过调用 IRQControl 权能获取,获取通过架构相关的参数。
2.1 接收中断
将 notification 绑定到 irq_handler权能。
error = seL4_IRQHandler_SetNotification(irq_handler, notification);
2.2 处理中断
当一个中断被接收后,可以通过IRQHandler中的 seL4_IRQHandler_Ack
来取消掩码。
直到IRQHandler被确认前,seL4不会再往前递交更多的中断。
error = seL4_IRQHandler_Ack(irq_handler);