【问题标题】:smlnj interactive system: fatal errorsmlnj 交互系统:致命错误
【发布时间】:2015-06-08 23:08:40
【问题描述】:

apt-get install smlnj 并尝试从终端调用sml 之后,我在 Chromebook 上的 Crouton chroot 上出现一个奇怪的错误,这是我在其他任何地方都找不到的错误:

$ sml
/usr/lib/smlnj/bin/sml: Error -- unable to map 1179648 bytes, errno = 1
/usr/lib/smlnj/bin/sml: Fatal error -- unable to allocate memory object for BIBOP

有什么指导吗?

【问题讨论】:

  • 它是什么系统,free -m 显示了什么?
  • @barti_ddu 我在只有 2GB 内存的 chromebook 上的 chroot 中运行 Xubuntu。在任何给定时间,大约有 100 - 500 MB 可用空间。这对 sml 来说是不是望而却步?
  • AFAIR,32MB 对于小脚本应该足够了;然而,似乎 os 拒绝 sml 的进程来分配这么多的内存。您是否尝试过临时增加/打开交换?
  • 是的,我的系统当前启用了 ~2GB 交换。任何想法为什么操作系统会拒绝这个?
  • 嗯,您可以尝试按如下方式运行 sml/nj:sml @SMLalloc=128k(或者更小的分配大小,例如 64/32/16/8k)? run-sml 脚本可能只是对您的(celeron?)CPU 做出了错误的猜测。

标签: sml smlnj google-chrome-os crouton-os


【解决方案1】:

编辑:此问题(错误 #120)已在 SML/NJ 版本 110.77 (release notes) 中通过启用 MAP_ANONYMOUS(以前在 Linux 中不受支持)得到修复。安装最新版本的 SMLNJ 会比下面的解决方案更可取,因为它不需要削弱系统的安全性。如果您确实通过修改/dev 的权限继续,建议在每次会话后删除exec 权限。


此问题主要在运行 ChrUbuntu 或 Crouton 的 Chromium 操作系统环境中重现,但可能会发生在其他环境中遇到类似问题的其他用户身上。

sml 上运行strace 在错误输出之前给出这个(尝试的)操作:

open("/dev/zero", O_RDONLY)             = 4
mmap2(NULL, 1245184, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 4, 0) = -1 EPERM (Operation not permitted)

根据mmap(2) 文档,EPERM 表示系统正在尝试在标记为noexec 的目录中分配具有执行权限的内存。

确实,mount 给出了:

...
devtmpfs on /dev type devtmpfs (rw,nosuid,noexec,relatime,size=960456k,nr_inodes=240114,mode=755)
...

因此,解决方案是使用exec 权限重新挂载/dev

$ sudo mount -o remount,exec /dev
$ sml
Standard ML of New Jersey v110.75 [built: Thu May  9 05:41:01 2013]
- 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2011-09-04
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多