【问题标题】:MirageOS - Http-fetch exampleMirageOS - Http 获取示例
【发布时间】:2016-05-29 03:27:56
【问题描述】:

我正在尝试修改 Mirage-skeleton 中的 MirageOS http-fetch 示例 (https://github.com/mirage/mirage-skeleton),但我在理解为什么我无法移动其中执行的某些函数时遇到了一些问题config.ml 文件添加到我的 unikernel.ml 文件中。原始的 config.ml 文件如下(我将只复制有趣的部分):

[...]
let client =
      foreign "Unikernel.Client" @@ console @-> resolver @-> conduit @-> job

let () =
  add_to_ocamlfind_libraries ["mirage-http"];
  add_to_opam_packages ["mirage-http"];
  let sv4 = stack default_console in
  let res_dns = resolver_dns sv4 in
  let conduit = conduit_direct sv4 in
  let job =  [ client $ default_console $ res_dns $ conduit ] in
  register "http-fetch" job

我想要做的是移动这两行:

  let res_dns = resolver_dns sv4 in
  let conduit = conduit_direct sv4 in

进入我的 unikernel.ml 启动方法。基本上,我只想将堆栈传递给我的模块,并让它创建一个 dns 解析器和一个管道。我的启动功能如下:

  let start c s =
    C.log_s c (sprintf "Resolving in 1s using DNS server %s" ns) >>= fun () ->
    OS.Time.sleep 1.0 >>= fun () ->
    let res_dns = resolver_dns s in
        let conduit = conduit_direct s in 
            http_fetch c res_dns conduit >>= fun (data) ->
            Lwt.return(dump_to_db data);

现在我在提交 http_fetch 参数时收到此错误:

Error: This expression has type Mirage.resolver Mirage.impl
       but an expression was expected of type Resolver_lwt.t

我在这里问的主要是一个概念性问题,因为我显然遗漏了一些东西。我不是 OCaml/MirageOS 方面的专家,但考虑到我只是从不同的文件调用相同的函数,这种类型不匹配的有争议的行为很难理解。

【问题讨论】:

  • config.ml 和 unikernel.ml 的编译方式完全不同(甚至不在同一点)。为什么要将一些代码从一个复制到另一个?
  • 我主要是在试验。我真正的问题是我遇到了这个问题lists.xenproject.org/archives/html/mirageos-devel/2015-06/…,我正在尝试遵循直接在 unikernel 内创建解析器和管道的建议。

标签: ocaml unikernel mirage


【解决方案1】:

config.ml 用于生成main.ml。如果需要,您可以从那里复制生成的代码。

【讨论】:

  • 感谢您为我指明了正确的方向,通过查看 main.ml 中的代码,我设法将解析器和管道的实例化移动到了 unikernel.ml。不幸的是,它没有解决我在上面的评论中提到的 DHCP 问题(Routing.No_route_to_destination_address):(。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多