Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Hardware Hacking Cheatsheet — 硬件黑客速查表 | Kitploit
工具/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
嵌入式系统安全物联网安全硬件安全学习与教育精选资源固件分析
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

硬件黑客速查表

查看仓库
235年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

硬件破解速查表

[[TOC]]

免责声明

  • 我是个菜鸟,正在尝试学习这类东西,所以有些内容可能不是 100% 正确
  • 抱歉我的英语不好

备注

  • 遵循“最简单路径优先”方法论
  • 有时你需要焊接东西;这里 有一个快速简单的指南
    • 你可能需要将导线直接焊接到 PCB 过孔上(视频)
      1. 用切割刀刮擦 PCB 表面,直到你能看到焊料掩模下的闪光
      2. 用玻璃纤维笔再次刮擦表面
      3. 用一些 IPA 和棉签清洁表面
      4. 涂上一点助焊剂
      5. 给导线镀锡并焊接
    • 备注
      • 始终给烙铁头镀锡
      • 温度:250-350 C
      • 不要用手触摸 PCB

信息收集与初次交互

  1. 查看设备背面的标签,找到
    • 型号名称
    • 序列号
    • 设备品牌方(可能不是制造商)
  2. 使用刚收集到的信息在网上搜索
    • 包含信息的最佳网站
      • TechInfoDepot
      • OpenWRT
    • 搜索 ...,这通常会带来大量信息
      • FCC ID(参考网站)
      • SOC 名称
      • Flash 芯片名称和容量
      • RAM 芯片名称和容量
      • 其他可能的信息来源
  3. 打开设备
    • 搜索如何打开设备的教程
    • 有些设备可能用胶粘住以防被打开,要轻柔
    • 有时散热器会覆盖部分电路,如果可能请移除它
  4. 识别组件
    • 为了使电路名称更易读
      • 使用棉花 + 酒精,当酒精干燥后,用粉笔覆盖电路,然后清洁;现在电路名称应该可读了
      • 使用放大镜
    • 在网上搜索关于这些组件的信息和数据手册;如果找不到,尝试中文搜索引擎
      • Baidu
      • Sogou
      • Haosou
    • 重要:找到一个 VCC 和 GND 暴露良好的组件非常有用
  5. 定位 UART 接口:大致相当于一个 TTY
    • 在网上搜索
    • 在 PCB 上寻找 GND、IN 或 RX、OUT 或 TX 以及 VCC
    • 在 PCB 上寻找 3/4 个引脚
      1. 找到 GND 参考点
        • 使用之前找到的组件
        • 通常金属板处于 GND
      2. 找到 VCC 参考点
        • 使用之前找到的组件
        • 寻找电容,它们通常在 VCC 处有一个点
      3. 测试 UART 候选引脚,填写下表(下面的项目符号分别对应表格的各列)
        1. 测试 UART 引脚对 GND 的电阻(万用表转到电阻测量档,通常 200k)
        2. 测试 UART 引脚对 VCC 的电阻(万用表转到电阻测量档,通常 )
  6. 通过 UART 连接:使用串口适配器(UART -> USB)通过电脑连接到板子
    • 所选串口适配器:FT232H + Focaccia Board
    1. 选择合适的电压(3.3V 或 5V),否则板子或串口适配器会损坏
    2. 将板子的 RX 连接到适配器的 TX,板子的 TX 连接到适配器的 RX
      • 注意:通常不需要连接 VCC 引脚
    3. 将适配器连接到电脑
      1. 使用 sudo lsusb 定位适配器
      2. 使用 ls -lart /dev 定位所有设备文件;我们的设备应该是最后几个之一,通常是 ttyUSB0
      3. 要访问此设备,我们必须属于 dialout 组(或为 root),可用 groups $USER 检查我们的组
  7. 定位 JTAG 接口
    • 什么是 JTAG:JTAG 接口为制造商提供了一种测试芯片上引脚之间物理连接的方法。当电气工程师谈论使用 JTAG “调试”芯片时,他们所指的与传统软件调试截然不同。他们指的是确保芯片 A 上的引脚 A 物理连接到芯片 B 上的引脚 B,并且所有这些引脚都能正常工作。由于 JTAG 允许直接硬件访问设备,因此它也是安全研究的绝佳工具。
    • JTAG 特性
      • 可控性:将内部位设置为 0 或 1
      • 可观察性:检查内部位的值
      • ...因此可以读/写 EEPROM
      • 电路内调试:在电路上调试代码(例如使用 OpenOCD 和 GDB)
    • 在网上搜索
    • 在 PCB 上寻找 TCK、TDI、TDO、TMS 和 TRST(可选)
      • TCK(测试时钟):相当于鼓手或节拍器,决定控制器的速度。该引脚上的电压只是以有节奏、稳定的节拍上下脉冲。在时钟的每个“节拍”上,控制器都会执行一个动作。
      • TMS(测试模式选择):模式选择引脚上的电压控制 JTAG 执行什么操作。通过操纵该引脚上的电压,你告诉 JTAG 你希望它做什么。
      • TDI(测试数据输入):向芯片输入数据的引脚。JTAG 标准未定义通过该引脚通信的协议,这由制造商决定。就 JTAG 而言,该引脚只是让 1 和 0 进入芯片的入口。芯片如何处理这些数据与 JTAG 无关。
  8. 通过 JTAG 连接:使用“串行适配器”(JTAG -> USB)通过电脑连接到板卡
    • 选定的“串行适配器”:FT232H + Focaccia Board
    1. 选择合适的电压(3.3V 或 5V),否则板卡或串行适配器将被损坏
    2. 使用之前找到的 JTAG 引脚定义将一切连接起来
    3. 保持 UART 连接打开(如前所述),以便与设备交互并观察其行为
    4. 运行 OpenOCD
      • 第一个窗口(OpenOCD “服务器”):openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE:Focaccia Board 参考
        • $BOARDCONFIGFILE:你正在破解的板卡的配置文件(有用,但可能没有,可选)
          • 备注
            • 配置文件位于 /usr/local,也许可以在这里找到一些有用的 $BOARDCONFIGFILE
            • 否则可以在互联网上搜索
            • 否则可以自己编写
            • TODO(自己编写)
      • 第二个窗口(OpenOCD “客户端”):telnet localhost 4444
        • 有用的命令
          • halt:停止 CPU(类似冻结)
  9. 获取固件和文件系统
    • 可能性(固件和文件系统可能已加密)
      • 从制造商网站下载
      • 如果只有设备本身能下载固件(通过更新),则使用 wireshark 嗅探网络以收集信息
      • 使用 flash 芯片编程器和测试夹直接读取 EEPROM
      • Bootloader 转储命令
        1. 分析 UART 接口上打印的启动日志
          • 可能打印的且我们感兴趣的信息(值为示例,但足以说明我们在寻找什么)
            • Bootloader 一般信息
              • 搜索 bootloader 名称和版本(例如:U-Boot 1.1.3)
            • SOC 信息
              • 附加板卡信息(wifi、ethernet……),它们可能搭载自己的 bootloader
              • SOC 型号(例如:ASIC MT7621A...)
              • CPU 频率
            • RAM 信息
              • mtd->writesize=2048:页大小(字节)
              • mtd->oobsize=64:用于纠错的数据(字节)
              • devinfo.iowidth=8:每次操作写入/读取的数据(字节)
              • RAM 大小
            • EEPROM 信息
              • mtd->erasesize=131072:EEPROM 剩余写入次数?(大致)
            • OS 内核信息
              • 查找 bootloader 加载信息,这里可以找到关于文件系统的信息
              • 查找 buildroot 版本,这将帮助我们仿真电路并进行各种测试
            • 文件系统信息
              • 查找 bootloader 加载信息和 OS 启动过程,这里可以找到关于文件系统的信息
            • EEPROM 分区
              • 查找 OS 启动过程,这里可以找到关于 EEPROM 分区、分区名称、挂载点及 RAM 中长度的信息
              • 如果看到分区重复,很可能是为了固件升级,原因可以自行猜测
            • Init 进程信息
              • 搜索 init started 或类似内容,这可能靠近 BusyBox 字符串或类似内容

TODO SPI DUMP

TODO GDB ATTACH????

逆向工程

  1. Init 进程类型和配置文件
    • 类型
      • BSD 风格
        • 开始执行脚本于
          • /etc/rc
          • /etc/rc.local
        • 较新的版本
          • 参见 /etc/rc.conf 中的信息
          • 执行 /etc/rc.d/
      • System V(最流行)
        • 启动 BusyBox
        • 配置文件位于 /etc/inittab
          • runlevel
            • 1:单用户模式,root shell,无密码,无守护进程运行
            • 3:基于文本的多用户模式,登录提示
            • 5:图形化登录
          • 然后是 init 时执行的一系列操作
        • 执行 /etc/init.d/
      • Systemd(嵌入式设备中不使用)
    • 如何识别
      • 启动时打印
      • 分析 /sbin/init,搜索上述用于识别类型的信息
  2. 有趣的二进制文件和脚本
    • 查找由 init 进程启动的有趣文件,一般来说不要停留在名称上,深入查看正在执行的二进制文件并分析它们;最有趣的是那些非标准的文件

仿真环境

  • 要求
    • 知道二进制文件的 CPU 架构
      • 使用 file 命令即可轻松获得
    • QEMU 必须支持该架构
  • QEMU 仿真(模式)
    • 系统模式:仿真整个系统
      • 如何操作
        1. 找到 QEMU 可执行文件格式:qemu-system-$PROCESSOR$ARCHITECTURE

          • 示例:qemu-system-mipsel
        2. 如果你知道处理器家族,可以指定它来帮助 QEMU 更好地仿真环境

          • 获取支持的处理器家族列表:$QEMUBIN -cpu help
          • 最好从通用的 CPU 家族开始,如果某些功能不正常,再深入尝试使用特定的 CPU 家族
        3. 我们需要内核和根文件系统

          • 备注
            • 设备自带的内核不适合,缺少驱动程序
            • IOT 世界没有标准化
              • 使用内核设备树:定义板卡驱动程序的文本文件
                • 内核启动时会加载此文件,并将通用驱动程序适配到正在使用的板卡
                • 不太常用
            • 所以……重新构建内核和文件系统
          1. 查找内核版本、libc 版本以及我们感兴趣的二进制文件所使用的库列表(readelf -d $EXECUTABLE)

            • 库版本格式:libfoo.X.Y.Z(X.Y.Z 是版本号)
              • X:ABI 不兼容
              • Y:ABI 向后兼容

来源、致谢与感谢

  • 感谢 Valerio Di Giampietro(@valerio)关于硬件破解的精彩 YouTube 教程频道,这里写的一切大多取自这些视频。
  • 感谢 Luca Bongiorni(@LucaBongiorni)的宝贵建议和硬件工具。
  • 感谢 mightyohm.com 提供的焊接漫画
  • 感谢 Reddit hardwarehacking 社区对我的帮助
    • [新手] 直接 PCB 焊接(也许?)
  • 感谢 Andrew Paul 提供的过孔焊接教程
  • Buildroot 手册
  • JTAG 详解
  • OpenOCD - Flash 命令
  • OpenOCD + JTAG 信息
  • 硬件破解速查表 - 小型 PDF
  • OpenOCD
下载工具
200kOhm
  • 给设备上电,测试 UART 引脚对 GND 的电压(万用表转到电压测量档,通常 20V)
  • 给设备上电,在启动期间测试疑似 TX UART 引脚对 GND 的电压(万用表转到电压测量档,通常 20V);如果电压在振荡,那么该引脚很可能是 TX(因为它在发送数据)
  • 给设备上电,在启动期间测试疑似 RX UART 引脚对 GND 的电压(万用表转到电压测量档,通常 20V);如果电压一直停在 0,那么该引脚很可能是 RX(因为它在等待接收数据)
    • 表格

      引脚GND 电阻VCC 电阻V备注
      1
      2
      3
      4
      • 示例

  • 使用 Jtagulator
    1. 将它连接到电脑(波特率:115200)
    2. 重要:H 是打印帮助功能,请随处使用它
    3. 将板子的 GND 连接到 Jtagulator 的 GND,板子的引脚 1,2,3 连接到 Jtagulator 的通道 1,2,3
    4. V:设置工作电压
    5. U:进入 UART 识别菜单
    6. U:开始识别
    7. Text string to output:默认
    8. Starting channel:我们放置板子引脚 1 的通道
    9. Ending channel:我们放置板子引脚 3 的通道
    10. Ignore non-printable characters:是
    11. 完成!
  • TODO:- 使用 BurtleinaBoard + Busside
  • 使用 screen /dev/ttyUSB0 $BAUDRATE 连接到 TTY
    • $BAUDRATE 可以是 这里 找到的其中一个
    • 最常见的 $BAUDRATE
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • 重要:如果我们搞砸了 $BAUDRATE,可能会看到乱码,甚至什么也没有
    • ctrl + a -> k -> y:关闭 screen
    • 如果 RX 引脚似乎不工作(你输入并按回车但什么也没发生),那可能是“回车”值不对:\r\n 还是 \n?
      • 要解决这个问题,请使用 pyserial,Python 的串行通信库,示例:
        root@kitploit:~
        #!/usr/bin/env python3
        
        import serial
        
        ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
        ser.write(b"HELLO\r\n")
        ser.write(b"HELLO\n")
        
      • 如果问题仍然存在,请使用逻辑分析仪(这里 有一个便宜的)
  • TDO(测试数据输出):用于输出芯片数据的引脚。与数据输入引脚一样,通信协议不由 JTAG 定义。
  • TRST(测试复位,可选):该信号用于将 JTAG 复位到已知的良好状态。
  • 在 PCB 上寻找一行 5/6 个引脚,或双排 10、12、14、20 个引脚
    1. 找到 GND 参考点
      • 使用之前找到的组件
      • 通常金属板处于 GND
    2. 找到 VCC 参考点
      • 使用之前找到的组件
      • 寻找电容,它们通常在 VCC 处有一个点
    3. 测试 JTAG 候选引脚,填写下表(下面的项目符号分别对应表格的各列)
      1. 测试 JTAG 引脚对 GND 的电阻(万用表转到电阻测量档,通常 200k)
      2. 测试 JTAG 引脚对 VCC 的电阻(万用表转到电阻测量档,通常 200kOhm)
      3. 给设备上电,测试 JTAG 引脚对 GND 的电压(万用表转到电压测量档,通常 20V)
      • 表格

    4. 将找到的值与最常用的 JTAG 引脚定义进行比较,可在 jtagtest 获取
  • 使用 Jtagulator
    1. 将其连接到电脑(波特率:115200)
    2. 重要:H 是打印帮助功能,随处可用
    3. 将板卡 GND 连接到 Jtagulator GND,板卡引脚 1,2,3... 连接到 Jtagulator 通道 1,2,3...
    4. V:设置工作电压
    5. J:进入 JTAG 识别菜单
    6. 这里有两个选项
      • I:使用 IDCODE 扫描识别,找不到 TDI(快),如果要识别的引脚很多,这个更好
      • B:使用 BYPASS 扫描识别,会找到 TDI(慢),如果要识别的引脚较少,这个更好
    7. Starting channel:放置板卡引脚 1 的通道
    8. Ending channel:放置板卡引脚 n 的通道
    9. Already known pins:否,但如果已经知道某些引脚,可以加快识别过程
    10. 开始并等待……完成!
  • TODO:- 使用 BurtleinaBoard + Busside
  • 重要
    • JTAG 可能已被禁用(硬件层面,移除了一个电阻),因此万用表和 Jtagulator 发现的结果可能不一致;我们可以通过在该引脚和 VCC 之间放置一个约 300Ohm 或 1kOhm 的电阻来解决
    • JTAG 可能已被禁用(硬件层面,移除了一个电阻);这个问题可以通过放回该电阻或将电阻焊盘直接短接来解决
    • JTAG 可能已被禁用(软件层面,设置了某些值)
    • JTAG 可能已被禁用(硬件层面,烧断了保险丝……这种情况下就没有希望了)
  • 每次调试操作之前都必须执行
  • reset:重置 CPU
  • reg:读取 CPU 寄存器
  • flash info bank $BANKID 或 flash info $BANKID:打印 flash 存储区 $BANKID 的信息(我认为 bank = 内存块)
  • flash list:检索使用 flash bank(在 $BOARDCONFIGFILE 中)声明的每个设备的关联数组列表,从零开始编号
  • flash banks:打印使用 flash bank(在 $BOARDCONFIGFILE 中)声明的每个设备的一行摘要,从零开始编号
  • flash write_image erase "$BINTOWRITE" $ADDRTOSTART:写入 flash
    • $BINTOWRITE:可以是 bin(二进制)、ihex(Intel hex)、elf(ELF 文件)、s19(Motorola s19)、mem……
    • $ADDRTOSTART:开始写入的地址(我认为默认是 0)
  • flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP:转储内存
    • $OUTFILE:保存转储内容的二进制文件
    • $ADDRTOSTART:开始读取的地址(我认为默认是 0)
    • $SIZETODUMP:要转储的字节数
  • 更多信息:
    • OpenOCD PDF
    • OpenOCD HTML
  • TODO
  • Bootloader 有 CLI 吗?
    • 搜索 bootloader 菜单,这里很可能能找到这个问题的答案
  • 尝试获取 bootloader shell(自动获取,或通过 UART 打印的菜单获取)
  • 探索 bootloader shell
    • help 命令是你的朋友
    • 尝试找到转储内存内容的方法,python 是你的朋友
    • OOB 数据(错误纠正码)转储价值不大
  • 转储数据分析
    • 使用 binwalk、file 和 hexdump -C 检查转储的文件是否正常,以及是否被压缩或加密
      • 使用 binwalk -E 分析文件的熵
        • 熵接近 1:随机、压缩或加密文件
        • 熵低于 1:正常可执行文件或文件
    • 使用 binwalk -e 提取文件中可识别的段
  • 如果 binwalk 不能完全理解转储的镜像,我们可以使用 EEPROM 分区表(如果之前找到的话)手动将转储的镜像拆分为多个有用的镜像
    • dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITE
    • sha1sum、md5sum 或 binwalk -W -i 用于比较镜像(例如,如果我们认为它们可能是相同的镜像)
  • 最后一步可能要根据转储镜像包含的内容执行多次;例如,如果我们有内核镜像,可以再次使用 binwalk(或者如果在网上能找到特定内核镜像的结构,则使用 dd)提取其组件以读取根文件系统
  • 提取文件系统
    • 示例命令(基于文件系统类型):fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
      • fakeroot:创建假 root 环境,用于仿真文件权限、设备文件……
        • -s fakeroot.dat:保存假 root 环境,以便之后用命令 fakeroot -i fakeroot.dat bash 恢复
      • usquashfs:提取 squashfs 文件系统(在你的情况下可能不同)
        • -d squashfs-root:目标文件夹
        • u04-sqfs.dat:要提取的文件系统镜像
  • 查找 factory mode 字符串;如果我们成功让设备进入工厂模式(如果存在的话),破解它就容易得多
  • 有用的命令
    • 文本编辑器
    • grep
    • find
    • xargs
    • strings
  • Z:无 ABI 变化
  • 因此我们需要 X.Y 与原始库一致
    • 可接受:X 相同,Y 更高
  • 使用构建系统进行构建(选择功能并自动跟踪依赖)

    • 最佳构建系统选择
      • The Yocto project
      • Buildroot(最佳)
      • OpenWRT 构建系统
  • 开始仿真

    • QEMU 仿真脚本
      root@kitploit:~
      #!/bin/bash
      # This script will build an environment without password for the user root
      export QEMU_AUDIO_DRV="none" # ignore audio drivers
      
      qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
                                              -m $RAMSIZE \
                                              -kernel $KERNELPATH \
                                              -nographic \ # No GUI
                                              -hda $FILESYSTEM \
                                              -net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
                                              -net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
                                              -no-reboot \ # Terminate the machine when is halted
                                              -append "root=/dev/hda console=uart0" # Set root filesystem and console
      
      • 如果执行二进制文件时打印出缺少库的错误,则在机器内按如下方式设置 LD_LIBRARY_PATH:export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • 我们也可以仿真 NAND EEPROM
      root@kitploit:~
      #!/bin/bash
      
      # Part 1: Identify bytes for kernel module
      modprobe nandsim first_id_byte=$FIRSTBYTE \
                          second_id_byte=$SECONDBYTE \
                          third_id_byte=$THIRDBYTE \
                          fourth_id_byte=$FOURTHBYTE \
                          cache_file=/root/nandsim.bin \
                          parts=x,y,z,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
      
      # Part 2: Erase partitions created (analyze EEPROM partitions)
      flash_erase /dev/mtd0 0 8 
      flash_erase /dev/mtd1 0 20
      # ...
      
      # Part 3: Load partitions dumped from device in the ones just created
      nandwrite /dev/mtd0 part0.bin
      nandwrite /dev/mtd1 part1.bin
      # ...
      
      # Part 4: Create mountpoint for filesystem and attach (if UBIFS)
      mkdir /mnt/filesystem
      ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
      ```# Part 5: Mount
      mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
      
      1. 识别内核模块的字节
        • 启动时通常会打印关于 NAND 的信息,查看这些信息(上述步骤)并搜索 NAND ID,打印的字节按顺序为第一个、第二个和第四个字节
        • 我们也可以通过查找 EEPROM 的数据手册来找到这些信息
        • 我们也可以使用 writesize, oobsize, erasesize, iowidth 在这里找到正确的命令
        • 否则,反复试验
      2. 分析启动时打印的 EEPROM 分区以确定它们的大小和名称,flash_erase 命令中的最后一个数字是与 erasesize 相关的大小(与 parts=x,y,z,... 相同)
      3. 将从设备转储的分区加载到刚创建的分区中
      4. 为文件系统创建挂载点并挂载
        • -O:指定卷 ID 头偏移量,如果错误,系统会告诉你正确的值,你也可以尝试不同的值,如 512, 1024, 2048(反复试验)
        • -m:mtd 设备编号(参见第 3 点)
        • -d:UBI 设备编号(参见第 5 点)
      5. 挂载
  • 用户模式:类似于 wine,只执行一个二进制文件并将其“翻译”到我们的架构
    • 备注
      • 不太稳定
      • 可能产生奇怪的结果
    • 操作方法
      1. 找到 QEMU 可执行格式:qemu-$PROCESSOR$ARCHITECTURE
        • 示例:qemu-mips64
      2. 如果 QEMU 提示缺少解释器,请使用 -L 传递包含该解释器的文件夹的路径(或参见 man)
        • 要了解可执行文件使用哪个解释器,请使用 readelf -l $EXECUTABLE
  • 虚拟化模式:对我们来说没什么意义
  • 使用 buildroot 和 docker 构建内核和根文件系统
    • 我们构建的内核应该具备(相对于原始内核)
      • 相同的内核版本
      • 相同的 libc 版本(uClibc, uClibc-ng, musl, dietlibc...)
      • 相同的库版本(针对我们感兴趣的可执行文件)
    1. 搜索与我们设备版本最接近的 buildroot 版本
      • 有时在启动或检查转储的内存时,我们可能会找到所使用的 buildroot 版本(如果设备是使用 buildroot 构建的)
    2. 找到与所找到的 buildroot 版本兼容的 linux 版本,并创建一个 docker 容器,这里有一个示例 dockerfile(软件包对于运行 buildroot 很重要)
    3. 从这里下载选定的 buildroot 版本,并将其放入 docker 容器的共享文件夹中
    4. 运行并切换到 docker 容器
    5. 解压 buildroot 并执行 make manual 以生成 buildroot 的手册
    6. 使用 make help,buildroot 会打印所有支持的设备(开发板);执行 make $YOURBOARDNAME 可为你的开发板创建 buildroot 配置文件
    7. 使用 make menuconfig(基于文本)或 make xconfig(GUI)选择要添加到我们构建中的内核模块,我们将使用 make xconfig
      • 这里给出一个示例/指南,但你需要自己发现运行你的应用程序具体需要哪些模块
      • 技巧:使用 Edit->Find 来搜索模块
      • 选项
        • Target options
          • 勾选 Show options and packages that are deprecated or obsolete
          • 勾选 Build packages with debugging symbols,并将 debug level 设为最高
          • 将 Strip command for binaries on target 设置为 None
          • 将 GCC optimization level 设置为 0
        • Toolchain
          • 将 Toolchain type 设置为 Buildroot toolchain
          • 将 Kernel headers 设置为 Manually specified linux version
          • 将 Custom kernel headers series 设置为 $DEVICEKERNELVERSION
          • 将 Linux version 设置为 $DEVICEKERNELVERSION
          • 将 C library 设置为 $DEVICECLIBRARY
          • 将 $DEVICECLIBRARY version 设置为 $DEVICECLIBRARY $DEVICELIBRARYVERSION
          • 勾选 Enable large files
        • System configuration
          • 将 Passwords encoding 设置为 MD5
          • 将 Init system 设置为 $DEVICEINITSYSTEM(或 BusyBox)
          • 将 /dev management 设置为 Dynamic using devtmpfs only
          • 将 /bin/sh 设置为 Busybox default shell
          • 勾选 Install timezone info
        • Kernel
          • 将 Kernel version 设置为 $DEVICEKERNELVERSION
          • 将 Kernel binary format 设置为 vmlinux
        • Target packages
          • Compressors and decompressors
            • bzip2 和 xz-utils
          • Debugging profiling and benchmark
            • 勾选 gdb 和 full debugger
          • Development tools
            • 你需要的工具
          • Filesystem and flash utilities
            • mtd, jffs2 and ubi/ubifs tools(或你需要的任何工具)
          • Libraries
            • 通常是你需要的库(建议如下)
            • Crypto
              • libsha1
        • Networking applications
          • rsync 以及你需要的工具
        • Shell and utilities
          • file
        • Filesystem images
          • ext2
        • Host utilities(这里不是指目标设备,我们谈论的是主机设备)
          • host mtd, jffs2 and ubi/ubifs tools
          • host util-linux
      • 记得保存(SAVE)
    8. 要永久保存刚定义的配置,请使用 make savedconfig
    9. 使用 make linux-menuconfig(基于文本)或 make linux-xconfig(GUI)配置内核,这里我们将使用 CLI 版本
      • 这里给出一个示例/指南,但你需要自己发现运行你的应用程序具体需要哪些模块
      • 选项
        • Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulator
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> ->
    10. 使用 uclibc-menuconfig 配置 uClibc(或你的 C 库)(和往常一样)
      • 启用调试:Development/Debugging options -> Enable debugging symbols,如果这不起作用(编译错误),则使用 Development/Debugging options -> (Wall) compiler warnings -> 添加 -Wall -ggdb -g3
        • -ggdb:提供与 GDB 一起使用的调试信息
        • -g3:提供额外的调试信息
      • Save
      • 像我们的设备一样启用功能(反复试验,如果遇到错误,请调查原因,然后使用所需功能重新构建)
    11. 执行 make,如果出现问题则返回上一步迭代
      • 可能的编译错误
        • Need to use -fPIC
          • 在内核模块(第 7 点)的 Toolchain -> Additional gcc options 下添加 --enable-shared,或者修补 buildroot
    • 使用 git 保存 buildroot 的配置文件
      • 外部树配置(供 buildroot 理解的文件树视图)(br2)
        root@kitploit:~
        +-- board/
        |   +-- <company>/ (not always used)
        |       +-- <boardname>/
        |           +-- linux.config
        |           +-- busybox.config
        |           +-- kernel-defconfig (kernel config file)
        |           +-- <other configuration files>
        |           +-- post_build.sh (executed just before building the image, useful to copy root filesystem into the image)
        |           +-- post_image.sh
        |           +-- rootfs_overlay/ (everythin here will be copied in the final image)
        |           |   +-- etc/
        |           |   +-- <some file>
        |           +-- patches/
        |               +-- foo/
        |               |   +-- <some patch>
        |               +-- libbar/
        |                   +-- <some other patches>
        |
        +-- configs/
        |   +-- <boardname>_defconfig (buildroot config for our board)
        |   +-- uClibc.config (optional)
        +-- patches/
        |   +-- (here patches to be applied)
        |
        +-- Config.in (if using a br2-external tree)
        +-- external.mk (if using a br2-external tree)
        +-- external.desc (if using a br2-external tree)
        
      • 要使用外部树,请像这样调用 buildroot:make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • 要将 buildroot 配置保存到我们的外部树:make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
      • 要将内核配置保存到我们的外部树:make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
  • 引脚GND 电阻VCC 电阻V备注
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V1.6-3.3V 启动时 - TX
    3INFOhm (multimeter 1)INFOhm (multimeter 1)3.3V0V 启动时 - RX
    40Ohm30kOhm0VGND
    引脚GND 电阻VCC 电阻V备注
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    • 示例

      引脚GND 电阻VCC 电阻V备注
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (multimeter 1)INFOhm (multimeter 1)2.1V高阻抗,TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (multimeter 1)INFOhm (multimeter 1)0V未连接?
      75.7kOhm5.7kOhm3.3V
      8INFOhm (multimeter 1)INFOhm (multimeter 1)0V未连接?
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • 找到兼容的 JTAG 测试点引脚定义:Altera Byteblaster
  • 勾选 Enable IPv6
  • 勾选 Enable RPC
  • 勾选 Enable WCHAR
  • 将 Thread library implementation 设置为 linuxthreads
  • 勾选 Thread library debugging
  • 勾选 Build cross gdb for the host
  • 勾选 TUI support
  • 勾选 Python support
  • 将 GDB debugger version 设置为 $LATESTGDBVERSION
  • libssh2
  • openssl
  • JSON/XML
    • expat
    • json-c
  • UBI - Unsorted block images
    Enable UBI
  • File systems -> Miscellaneous filesystem -> JFFS2 support
  • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
  • Save
  • 要将 uClibc 配置保存到我们的外部树:make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig