我用一杯咖啡因,体验了一次命定的失败旅程,但期间遇见的塔尖,忆记长新。
续
继上篇 《手机上通过 iSh 使用的 Alpine Linux 环境的契机和方法 》的探索;发现,ish 似乎包含了一个完整的 linux 系统。这不禁让我好奇,那:它真的和 PC 上运行的 linux 系统完全一致吗?是不是在 PC 上能做的事情,也能在 ish 中完成呢?当然,这里说的肯定不包含需要大量算力的事情了。
于是,纯粹为了好玩,就想,我能不能用它来让 imx6ull 成功运行,点亮主板的 led ?
从已知到未知的探索中,“类比验证“总是一项可靠的方法。
吗?
计划
我们尝试仅用 IOS 完成 led 代码的编写、编译、烧录、上机点亮 led。如果整个过程都能够顺利进行,则可以说明嵌入式的开发管线都是通的。这在实际工作中可能没什么意义,但对学习探索而言,却着实有趣。
让过程舒服些
让 ish 能够读取手机上的文件夹
首先,抛弃在 ish 中使用 vim / vi 来编写、修改代码的念头,不用那些 old school的东西;我们用其他现代化的编辑器。但由于 IOS 沙盒机制的限制,App 之间是不能互相读取对方文件夹下的文件的,但都可以读取 “文件”这个“第三方” app 中的文件夹和文件。因此,我们可以设置一个中转文件夹来 “绕过” 这个机制。
这就像由于美国对我们征收高关税,我们就不直接出口到美国,而是先将货物转运到越南 / 墨西哥等等国家,贴上当地公司的牌子,中转一下,借此绕过美国的高关税。
有了这个 “第三方文件夹” 后,我们需要将其挂在到 ish 中,让 ish 能够读到它里面的内容。
这里,我们可以如此实现:
- 在 ish 中 cd 到 /mnt 路径下
1cd /mnt
- 在 mnt 中新建一个文件夹
1mkdir documents
- 然后输入以下命令并运行:
1mount -t ios . documents
, 此时,系统会弹出 选择器,选择你想要可以在 ish “看到/访问”到的文件夹,即可将文件夹挂在到 ish 的linux系统里面,方便后继的文件共享;
- 这里是操作示例视频;从视频也可以发现:除了手机内的文件夹,我们甚至也可以将U盘挂在到linux中
例如经上述操作 我们将手机中的 LINUX_FILES 通过挂载在到 ish 中的 /mnt/documents 下,我们就可以将编辑器编写的文件存到 LINUX_FILES 中,然后再到 ish 中 将代码进行编译。

配置imx6ull开发工具链
cmake在上文中已经完成安装,那么我们还剩下 Arm工具链 以及 烧录工具链。而我们知道,ish 的 linux 系统是 Alpine Linux。那么我们可以尝试搜索 alpine linux arm gcc toolchain,非常幸运地,我们发现 Alpine Linux 似乎有支持的安装包。

安装交叉编译器 Arm dev toolchain
于是,我们到 ish 中搜索一下
1 | apk search gcc-arm |
发现确实有对应的 package ,于是,我们可以通过输入下列命令进行安装;
1 | apk add gcc-arm-none-eabi-stage1 |
查看 toolchain 安装内容
等待命令运行完成,我们查看下安装哪些工具:
1 | ls /usr/bin |

我们发现编译工具、链接工具等等都成功安装。那么我们进行下一步。
安装 imxdownload 烧录工具
将主板供应商提供的烧录工具下载到上文提到的 “中转站” LINUX_FILES 下的 burn_program 文件夹中,
并进行编译:
1 | gcc imxdownload.с -o imxdownload -L ./ |
测试运行:
1 | ./imxdownload |
为方便后续操作,我们将编译好的程序链接到 /usr/bin 中,这样就可以只输入 imxdownload 运行程序;

看起来,目!前!为!止! 一!切!正!常!非常顺利!是的,事情进展的顺利程度出乎我的意料,而此时的我还不知道潜伏在喜悦背后的,是怎样“凶险”的恶魔与无奈。
编写 LED 灯代码和 makefile
在上面的准备工作都完成后,我觉得只需要验证编译和烧录步骤可以证明手机也是可以“极具生产力”,而且不只是视频博主们喜爱的“剪辑渲染视频”式的生产力。于是,我将之前写好的 LED 点灯程序和 makefile 保存到 /mnt/documents 中,然后进行编译,这里需要注意的是,需要对 makefile 进行修改, 根据 /usr/bin 中已安装的 arm toolchain 名称修改命令:

这里,burn 的部分不是必须的,但我添加到此处是为了后续操作的连续性和一致性,避免在同的文件夹中来回切换。同时,上文中,我们进行文件夹挂载的时候,视频是以 U盘路径为例子的,这里,我们将其写在 makefile 中的 burn 部分, 意思是通过 imxdownload 程序,将 编译好的 led.bin 程序 烧录 到 U盘(/mnt/USB-A)。
编译
1 | make |
运行成功

此时,我们将U盘连接上手机后运行命令进行烧录:
1 | make burn |
运行失败:

这里的原因是 imxdownload.c 中构建烧录命令中用到的 dd 命令在 alpine linux 中 iflag / oflag 并没有支持 dsync 参数
1 2 3 4 |
一次注定不成功的尝试
后来,通过修改 dsync 参数为 aplpine linux 支持的 direct 后的 imxdownload.c 将重新编译后,成功将程序烧录到U盘中。但是,这样烧录的文件,真的能让 led 点亮吗?约摸是不行的。
因为,在处理 dsync 参数错误的过程中,根据 deepseek/chatgpt 的回答以及查阅的资料表明:
- 挂载路径(如/mnt/USB-A)通常指文件系统,而烧录需直接操作块设备(如/dev/sdd);
- dsync 的作用是强制每次读写操作直接写入物理设备,绕过系统缓存,确保数据立即持久化。改成 direct 后,数据可能暂存于缓存,未立即写入设备,可能导致数据丢失或烧录不完整(ref);
后来,我进入 ish 的官方 discord 群;确定了ish 无法直接将U盘自动挂载到 /dev ,也没有相关的开发计划。这似乎也意味着,我们的探索之旅就只能就此止步了。
尽管如此,我们还是顺利地走完了这次旅途的绝大部分路程。
至此。
附录
烧录工具源码: Download
LED灯源码: Download
修改后的Makefile: Download