Kindle 嵌入式交叉开发环境

一、前置条件

先理清一个核心概念:arm-linux-gnueabi-gcc 是交叉编译器,用途:在一台主机编译程序,生成可在 Kindle(ARMv7 Linux)运行的二进制。

⚠️ 不要尝试在 Kindle 本机直接运行 arm-linux-gnueabi-gcc,性能极差、内存吃紧,仅适合调试;常规开发推荐电脑端交叉编译,Kindle 仅作为运行 / 调试终端。

1. 硬件与固件前置

  • 设备已完整越狱(KUAL 可用,可获得 root 权限)
  • Kterm终端模拟器
  • 安装 USBNetwork

内存提醒:Kindle 内存很小,编译大型程序极易 OOM,仅适合小型 C 程序、FBInk 配套工具、驱动测试代码。

2. 内核基线

内核:Linux 3.10.53-lab126(亚马逊定制内核,2023 编译,基于 3.10 长期版)

系统根文件:Kindle 原生 BusyBox,glibc 版本极低(glibc 2.19 以内)

3. CPU 核心基础规格

CPU:ARMv7l Cortex-A9(i.MX6SLL),软浮点 ABI arm-linux-gnueabi**(非 hf 硬浮点)NXP**

  • 内核:Single Cortex‑A9
  • 架构:ARMv7‑A,小端 armv7l
  • 标准最高主频:1.0 GHz(Kindle 固件通常锁频 800MHz)
  • 流水线:8 级超标量,支持乱序执行
  • 浮点单元:VFPv3(软浮点 ABI arm-linux-gnueabi) ⚠️ 重点:没有硬浮点 gnueabihf! → 交叉编译必须选用 arm-linux-gnueabi-,不能用 gnueabihf,否则 Illegal instruction
  • 多媒体协处理器:NEON MPE SIMD(向量运算,图像处理、ffmpeg 可用)
  • 安全扩展:TrustZone
  • 电源:支持 DVFS 动态调频调压,空闲可降频省电(电子书核心优势)

二、交叉编译器部署

1. ARM GCC 4.9.x

  • 工具链名称:arm-linux-gnueabi-gcc-4.9
  • 适配理由:
    • GCC4.9 是适配 Linux 3.10 内核、Cortex-A9 的黄金版本;
    • 自带 glibc 2.19,和 Kindle 原生系统库版本对齐,编译程序放上去不会报版本不匹配
    • MobileRead 论坛所有 Kindle 插件、kterm、usbnethack、proot 容器全是用 4.9 编译。
  • 下载源:Linaro GCC 4.9 2017.01 稳定版(Linaro 官方归档) gcc-linaro-4.9.4-2017.01-x86_64-arm-linux-gnueabi.tar.xz
a. 执行下载命令
复制代码
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
b. 解压部署
复制代码
sudo mkdir -p /opt/linaro49
sudo tar -xf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz -C /opt/linaro49/
c. 写入环境变量
复制代码
nano ~/.bashrc

末尾添加:

复制代码
export PATH=/opt/linaro49/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin:$PATH

生效并验证:

复制代码
source ~/.bashrc
arm-linux-gnueabi-gcc -v

2. 编译关键参数

复制代码
# C程序编译示例
arm-linux-gnueabi-gcc-4.9 -march=armv7-a -mtune=cortex-a9 -msoft-float -mabi=aapcs-linux your_code.c -o output
# 静态编译(推荐,避免库依赖)
arm-linux-gnueabi-gcc-4.9 -static -march=armv7-a -mtune=cortex-a9 -msoft-float your_code.c -o output_static

3. 适配 Kindle 8 编译固定参数

编译时必须加 CPU 架构参数,否则性能差 / 指令报错:

复制代码
arm-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -msoft-float -mabi=aapcs-linux -static demo.c -o demo_kindle
  • -static:静态链接,避免 Kindle 低 glibc 库缺失报错
  • -msoft-float:匹配 i.MX6SLL 原生软浮点 ABI,不会出现Illegal instruction

测试代码:

复制代码
#include <stdio.h>
int main(int argc, char* argv[])
{
        int i=0;
        for(i;i<argc;i++){
                printf("argv[%d]=%s\n",i,argv[i]);
        }

        return 0;
}

把上述代码分别使用静态库链接,动态库链接方式进行编译。

静态编译:

复制代码
arm-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -msoft-float -mabi=aapcs-linux -static main.c -o demo_kindle

动态编译:

复制代码
arm-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -msoft-float -mabi=aapcs-linux  main.c -o demo_kindle-d

编译完成的执行文件通过下述方式传输到 kindle 设备中。

三、Linux 电脑与 Kindle 文件传输

1. 前置已知条件

你已经能正常 ssh root@KindleIP,默认账号密码:

  • 用户:root
  • 密码:mario
  • 可读写目录:/mnt/us/(电脑 USB 挂载的磁盘分区,存放 alpine、koreader、extensions,唯一可永久写入目录)
  • 系统根目录 / 默认只读,禁止直接 scp 到 /root/etc,极易变砖

2. SCP 命令传输

只往 **/mnt/us/**传输文件,这是唯一可读写分区。

在 kindle 的**/mnt/us/**我们可自行创建一个测试目录/mnt/us/gcc-test,向其中传输 gcc 编译的测试文件。

(1) 上传单个文件到 Kindle

语法:

复制代码
scp 本地文件路径 root@KindleIP:/mnt/us/目标文件夹

示例:把本地 test_bin 传到 Kindle 根目录

复制代码
scp ~/work/test_bin root@192.168.1.105:/mnt/us/
(2) 上传整个文件夹

把本地 alpine 文件夹完整传到 Kindle

复制代码
scp -r ~/work/alpine root@192.168.1.105:/mnt/us/
(3) 从 Kindle 下载文件到 Linux 电脑
复制代码
# 下载单个文件
scp root@192.168.1.105:/mnt/us/alpine.ext3 ~/backup/
# 下载整个文件夹
scp -r root@192.168.1.105:/mnt/us/extensions ~/kindle_backup/

四、kindle 运行测试

1. SSH 登录 kindle

通过安装 USBNetwork 插件,使用 SSH 登录到 kindle。

首先查询 kindle 的 IP 地址,电脑端通过MobaXterm 软件 的 SSH 功能进行连接。

登录连接后界面如下,进入**/mnt/us 目录(唯一可读写目录),**在其目录下运行测试程序 。

2. 运行测试交叉编译程序

在终端窗口运行测试程序:

复制代码
#./demo_kindle
#./demo_kindle-d
#./demo_pc
#file demo_kindle
#file demo_kindle-d
#file demo_pc

这里我们可以看到 demo_kindle(静态交叉编译)可行运行,demo_kindle-d(动态交叉编译)可行运行,demo_pc(使用 PC 端 gcc,非交叉编译器)运行报错。

相关推荐
春风解人意9 小时前
从零开始学习嵌入式P35----数据库
数据库·嵌入式硬件·学习
单片机仿真设计10 小时前
【Proteus 仿真】基于 STM32 单片机智能楼宇照明控制系统设计(定制仿真咨询)
stm32·单片机·嵌入式硬件·proteus·毕设
ACP广源盛1392462567310 小时前
M6/M5 Pro Mac mini 端侧 AI 爆发@ACP#YLB3118 存储扩展芯片在本地 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos
HUI-47411 小时前
EG1198|ESOP‑8 高性价比内置 MOS 降压 DC‑DC,10‑120V 小功率车载仪表优选
嵌入式硬件·硬件工程
长江后浪博客1 天前
ESP32-SOLO-1 在 ESP-IDF v5.5 下启动不断重启问题分析与解决
单片机·嵌入式硬件·嵌入式·esp32·freertos·esp-idf
hz567891 天前
视频会议终端音视频系统搭建方案:高清视频会议终端厂家选型指南
硬件架构·实时音视频·信息与通信·智能硬件
单片机仿真设计1 天前
【proteus仿真】基于 STM32 单片机智能仓库设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
星游路1 天前
单片机·电子时钟
单片机·嵌入式硬件
AOI小白新手上路1 天前
江科协51单片机 7-2 LCD1602显示时钟实验
单片机·嵌入式硬件·51单片机
思麟呀1 天前
嵌入式入门(一)宏观生态到首次烧录
c语言·嵌入式硬件