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,非交叉编译器)运行报错。

相关推荐
szxinmai主板定制专家3 小时前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发
Dlrb12116 小时前
ARM---I2C协议时序详解以及IMX6ULL使用I2C协议与AT24C02,LM75A芯片通信详解与示例代码
嵌入式硬件·arm·lm75a·i2c协议·at24c02·i2c时序
周洲08308 小时前
STM32独立/窗口看门狗完整配置|防止程序跑飞死机、异常复位
stm32·单片机·嵌入式硬件
论迹复利9 小时前
多平台移植 BTBLE Stack 的思路与踩坑实战——从 Ceva IP 到厂商适配层的迁移指南
嵌入式硬件·物联网·架构
CPETW9 小时前
企业版配套软件介绍 ---- USB TO SPI_ (Excel)-Microwire
网络·科技·单片机·嵌入式硬件·电子
一个嵌入式学徒10 小时前
LVGL图形库移植STM32
stm32·单片机·嵌入式硬件
Hello_Damon_Nikola10 小时前
伺服电机堵转检测算法详解
单片机·嵌入式硬件·算法
XTIOT66611 小时前
零部件 DPM 码扫码枪生产厂家:工业 DPM 设备多工位组网与 MES/ERP 数据集成方案
网络·单片机·嵌入式硬件·物联网·计算机视觉
振南的单片机世界11 小时前
PSC分频、ARR定周期、OPM停一次:基本定时器三要素
stm32·单片机·嵌入式硬件