1.linuxè¿è¡armç¨åºarmlinuxç¨åº
2.qemu搭建arm64 linux kernel环境
3.在ARM上安装Linux操作系统arm安装linux
4.彻底理解Linux ARM64系统调用
5.嵌入式Linux开发工具arm-linux-gcc安装及使用
6.ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核
linuxè¿è¡armç¨åºarmlinuxç¨åº
å¦ä½ç¼è¯armlinuxçgoï¼Golangä¹å°±æ¯Goè¯è¨ï¼ç°å¨å·²ç»åè¡å°1.4.1çæ¬äºï¼è¯è¨ç¹æ§ä¼è¶æ§åèåGoogle强大é å±±ä»ä¹çå°±ä¸å¤è¯´äºãGolangçå®æ¹æä¾äºå¤ä¸ªå¹³å°ä¸çäºè¿å¶å®è£ å ï¼éæ¾çæ¯å¹¶é没æåå¸ARMå¹³å°çäºè¿å¶å®è£ å ãARMå¹³å°æ²¡åæ³ç´æ¥ä»å®ç½ä¸è½½äºè¿å¶å®è£ å æ¥å®è£ ï¼å¥½å¨Golangæ¯æ¯æå¤å¹³å°å¹¶ä¸å¼æºçè¯è¨ï¼å æ¤å¯ä»¥éè¿ç´æ¥å¨ARMå¹³å°ä¸ç¼è¯æºä»£ç æ¥å®è£ ãæ´ä¸ªè¿ç¨ä¸»è¦å æ¬ç¼è¯å·¥å ·é ç½®ãè·åGolangæºä»£ç ã设置Golangç¼è¯ç¯å¢åéãç¼è¯ãé ç½®Golangè¡ç¯å¢åéçæ¥éª¤ã
注ï¼æ¬æéç¨æ èæ´¾åæµè¯ï¼å 为æ èæ´¾æ¯åºäºARMå¹³å°çã
1ãç¼è¯å·¥å ·é ç½®
æ®è¯´ä¸ä¸ªçæ¬çgolangç¼è¯å·¥å ·è¦ä½¿ç¨golangèªå·±æ¥åï¼ä½ç®åè¿æ¯ä½¿ç¨Cç¼è¯å·¥å ·çãå æ¤ï¼é¦å è¦é 置好Cç¼è¯å·¥å ·ï¼
1.1å¨UbuntuæDebianå¹³å°ä¸å¯ä»¥ä½¿ç¨sudoapt-getinstallgcclibc6-devå½ä»¤å®è£ ï¼æ èæ´¾çRaspBianç³»ç»æ¯åºäºDebianä¿®æ¹çï¼æ以å¯ä»¥ä½¿ç¨è¿ç§æ¹æ³å®è£ ã
1.2å¨RedHatæCentOS6å¹³å°ä¸å¯ä»¥ä½¿ç¨sudoyuminstallgcclibc-develå½ä»¤å®è£ ã
å®è£ å®æåå¯ä»¥è¾å ¥gcc--versionå½ä»¤éªè¯æ¯å¦æåå®è£ ã
2ãè·ågolangæºä»£ç
2.1ç´æ¥ä»å®ç½ä¸è½½æºä»£ç å缩å ã
golangå®ç½æä¾golangçæºä»£ç å缩å ï¼å¯ä»¥ç´æ¥ä¸è½½ï¼ææ°ç1.4.1çæ¬æºä»£ç é¾æ¥ï¼/golang/go1.4.1.src.tar.gz
2.2使ç¨gitå·¥å ·è·åã
golang使ç¨gitçæ¬ç®¡çå·¥å ·ï¼ä¹å¯ä»¥ä½¿ç¨gitè·ågolangæºä»£ç ãæ¨è使ç¨è¿ä¸ªæ¹æ³ï¼å 为以åå¯ä»¥éæ¶è·åææ°çgolangæºä»£ç ã
2.2.1é¦å 确认ARMå¹³å°ä¸å·²ç»å®è£ äºgitå·¥å ·ï¼å¯ä»¥ä½¿ç¨git--versionå½ä»¤ç¡®è®¤ãä¸è¬linuxå¹³å°é½å®è£ äºgitï¼æ²¡æçè¯å¯ä»¥èªè¡å®è£ ï¼ä¸åå¹³å°çå®è£ æ¹æ³å¯ä»¥åèï¼/download/linux
2.2.2å éè¿ç¨golangçgitä»åºå°æ¬å°
å¨ç»ç«¯cdå°ä½ æ³è¦å®è£ golangçç®å½ï¼ç¡®ä¿è¯¥ç®å½ä¸æ²¡æå为goçç®å½ãç¶å以ä¸å½ä»¤è·å代ç ä»åºï¼
gitclone/go
大éå°åºå¯è½ä¼è·å失败ï¼å¨ä¸ç¿»å¢çæ åµä¸æè¯äºå 次é½æ²¡æåï¼åå 大家é½æçã好å¨googleå·²ç»å°golangä¹æ管å°githubä¸é¢ï¼æ以ä¹å¯ä»¥éè¿ä¸é¢å½ä»¤è·åï¼
gitclone/golang/go.git
è§ç½ç»æ åµï¼ä¸è½½å¯è½éè¦ä¸å°æ¶é´ãæ2Mç带宽è±äºå°è¿ä¸¤ä¸ªå°æ¶æä¸è½½å®ï¼è½ç¶æ´ä¸ªé¡¹ç®ä¸è¿å åå ==
ä¸è½½å®æåï¼å¯ä»¥çå°ç®å½ä¸å¤äºä¸ä¸ªgoç®å½ï¼éé¢å³ä¸ºgolangçæºä»£ç ï¼å¨ç»ç«¯ä¸æ§è¡cdgoå½ä»¤è¿å ¥è¯¥ç®å½ã
æ§è¡ä¸é¢å½ä»¤æ£åºgo1.4.1çæ¬çæºä»£ç ï¼å 为ç°å¨å·²ç»ææ°ç代ç æ交ä¸å»äºï¼ææ°ç代ç å¯è½ä¸æ¯æ稳å®çï¼
gitcheckoutgo1.4.1
è³æ¤ï¼ææ°1.4.1åè¡ççæºä»£ç è·åå®æ¯
3ã设置golangçç¼è¯ç¯å¢åé
主è¦æGOROOTãGOOSãGOARCHãGOARMå个ç¯å¢åééè¦è®¾ç½®ï¼å 解éå个ç¯å¢åéçæä¹ã
3.1GOROOT
主è¦ä»£è¡¨golangæ ç»æç®å½çè·¯å¾ï¼ä¹å°±æ¯ä¸é¢gitæ£åºçgoç®å½ãä¸è¬å¯ä»¥ä¸ç¨è®¾ç½®è¿ä¸ªç¯å¢åéï¼å 为ç¼è¯çæ¶åé»è®¤ä¼ä»¥goç®å½ä¸srcåç®å½ä¸çall.bashèæ¬è¿è¡æ¶çç¶ç®å½ä½ä¸ºGOROOTçå¼ã为äºä¿é©èµ·è§ï¼å¯ä»¥ç´æ¥è®¾ç½®ä¸ºgoç®å½çè·¯å¾ã
3.2GOOSåGOARCH
åå«ä»£è¡¨ç¼è¯çç®æ ç³»ç»åå¹³å°ï¼å¯éå¼å¦ä¸ï¼
GOOSGOARCH
darwin
darwinamd
dragonfly
dragonflyamd
freebsd
freebsdamd
freebsdarm
linux
linuxamd
linuxarm
netbsd
netbsdamd
netbsdarm
openbsd
openbsdamd
plan
plan9amd
solarisamd
windows
windowsamd
éè¦æ³¨æçæ¯è¿ä¸¤ä¸ªå¼ä»£è¡¨çæ¯ç®æ ç³»ç»åå¹³å°ï¼èä¸æ¯ç¼è¯æºä»£ç çç³»ç»åå¹³å°ãæ èæ´¾çRaspBianæ¯linuxç³»ç»ï¼æ以è¿äºGOOS设置为linuxï¼GOARCH设置为armã
3.3GOARM
表示使ç¨çæµ®ç¹è¿ç®åå¤çå¨çæ¬å·ï¼åªå¯¹armå¹³å°æç¨ï¼å¯éå¼æ5ï¼6ï¼7ãå¦ææ¯å¨ç®æ å¹³å°ä¸ç¼è¯æºä»£ç ï¼è¿ä¸ªå¼å¯ä»¥ä¸è®¾ç½®ï¼å®ä¼èªå¨å¤æéè¦ä½¿ç¨åªä¸ä¸ªçæ¬ã
æ»ç»ä¸æ¥ï¼å¨æ èæ´¾ä¸è®¾ç½®golangçç¼è¯ç¯å¢åéï¼å¯ç¼è¾$HOME/.bashrcæ件ï¼å¨æ«å°¾æ·»å ä¸é¢å 容ï¼
exportGOROOT=ä½ çgoç®å½è·¯å¾
exportGOOS=linux
exportGOARCH=arm
ç¼è¾å®åä¿åï¼æ§è¡source~/.bashrcå½ä»¤è®©ä¿®æ¹çæã
4ãç¼è¯æºä»£ç
ç¯å¢åéé ç½®å®æèªåå°±å¯ä»¥å¼å§ç¼è¯æºä»£ç ãå¨goç®å½ä¸çsrcåç®å½ä¸ï¼ä¸»è¦æall.bashåmake.bash两个èæ¬ï¼å¦å¤è¿æ两个all.batåmake.batèæ¬éç¨äºwindowå¹³å°ï¼ãç¼è¯å®é ä¸å°±æ¯æ§è¡å ¶ä¸ä¸ä¸ªèæ¬ï¼ä¸¤è çåºå«å¨äºall.bashå¨ç¼è¯å®æåè¿ä¼æ§è¡ä¸äºæµè¯å¥ä»¶ãå¦æå¸æåªç¼è¯ä¸æµè¯ï¼å¯ä»¥è¿è¡make.bashèæ¬ã使ç¨cdå½ä»¤è¿å ¥goä¸srcç®å½ï¼æ§è¡./all.bashæè ./make.bashå½ä»¤å³å¯å¼å§ç¼è¯ãç±äºç¡¬ä»¶æ åµä¸åï¼ç¼è¯èè´¹çæ¶é´ä¸åãå¨æçBåæ èæ´¾ç¼è¯è¿ç¨è±è´¹äºå°è¿å个å°æ¶ï¼ç¼è¯å®æåæ§è¡çæµè¯å¥ä»¶åè±è´¹äºå·®ä¸å¤ä¸ä¸ªå°æ¶ï¼æ»å ±è±è´¹äºä¸ä¸ªåå°æ¶å·¦å³ã
5ãé ç½®golangè¿è¡ç¯å¢åé
ç¼è¯å®æåï¼goç®å½ä¸ä¼çæbinç®å½ï¼éé¢å°±æ¯goçè¿è¡èæ¬ã为äºä»¥å使ç¨æ¹æ³ï¼å¯ä»¥å°è¿ä¸ªbinè·¯å¾æ·»å å°PATHç¯å¢åéä¸ãåæ ·ç¼è¾~/.bashrcæ件ï¼å 为åé¢è®¾ç½®è¿GOROOTç¯å¢åéæågoç®å½äºï¼æ以åªéè¦å¨æ«å°¾å ä¸
exportPATH=$PATH:$GOROOT/bin
ä¿åååæ ·æ§è¡source~/.bashrcå½ä»¤è®©ç¯å¢åéçæã
è³æ¤ï¼golangæºä»£ç ç¼è¯å®è£ æåãæ§è¡goversionåºè¯¥å°±è½çå°å½ågolangççæ¬ä¿¡æ¯ï¼è¡¨ç¤ºç¼è¯å®è£ æåã
linuxä¸ARMå¹³å°ç¼è¯ç¼åçå®æç¨åºå¦ä½å¨windowsç¯å¢ä¸è¿è¡ï¼
ç´æ¥å¨windowä¸è¿è¡ä¸äºãåªè½å¨windowä¸å®è£ èææºï¼åå®è£ linuxç³»ç»ï¼å¨èææºä¸çlinuxégccç¼è¯ä½ çç¨åº.
armææ¯éè¦å¦ä»ä¹ä¸ä¸ï¼
åå¼å§ï¼1ï¼å¦ä¹ Linuxç³»ç»å®è£ ã常ç¨å½ä»¤ãåºç¨ç¨åºå®è£ ã2ï¼å¦ä¹ Linuxä¸çCç¼ç¨ãè¿æ¬ä¹¦å¿ å¦ãUNIXç¯å¢é«çº§ç¼ç¨ãããUNIXç½ç»ç¼ç¨ãï¼RechardStevensåçï¼Cé«æ大é½å¦ä¹ è¿ãCåæéãããC缺é·ä¸é·é±ãããé«è´¨éC/C++ç¼ç¨æåãããCä¸å®¶ç¼ç¨ãããThe源码CprogrammingLanguageã3ï¼ç¨åºå大é½è¦å¦ï¼æ°æ®ç»æï¼åµå ¥å¼ç¨åºåæ°æ®ç»æå¿ å¦ï¼4ï¼åºå±å¼å人å大é½è¦å¦ï¼å¾®æºåçã计ç®æºä½ç³»ç»æï¼åµå ¥å¼å¼å人åå¿ å¦ï¼5ï¼åçæºå¯ä»¥è®©ä¸ä¸ªä»äºè½¯ä»¶å¼åç人äºè§£åå¦ä½æä½ç¡¬ä»¶ï¼æå¿ è¦å¦ï¼å 为ä¸å¼å§å°±ä»ARMå ¥æï¼ä¸å¤ªç°å®ï¼6ï¼ARMä½ç³»ç»æï¼å ¶ä¸ææ±ç¼ã7ï¼æ°åçµè·¯æå¿ è¦å¦ä¹ ï¼ä¸ç¶ä½ å¨ååºå±å¼åæ¶ççä¼ä¸ç¥éæä¹çåçå¾ï¼èµ·ç ä¹å¾æä¸å ¥é¨å§ã8ï¼ARM+Linuxåºç¨ç¨åºå¼åï¼åææ¯è¦æå¼åæ¿ï¼å°æ¤ï¼å强ç®æ¯å¨åµå ¥å¼Linuxè¿ä¸ªè¡ä¸æäºåæ¥å ¥é¨äºï¼ä½éæ¾çæ¯è¿è¿è¿è¿ä¸å¤ï¼è¿å¾ç»§ç»ï¼å 为è¿ä¸åµå ¥å¼ï¼å¾åæé«æã9ï¼è¦ååºå±å¼åï¼å°±å¿ é¡»ç¥é软硬件ä¹é´æ¯å¦ä½è¡æ¥åé åå·¥ä½çï¼é£ä¹çµåææ¯åºè¯¥è¦å¥½å¥½å¦ä¹ äºï¼å¾å¤æ¶åä¼ç¨å°æ¨¡æçµè·¯ç¥è¯ï¼è¿æ¯åºå«å¥½æä¸èé¸çä¸åä¹å¤ä¹ä¸ãï¼Linuxä¸çæ±ç¼è¦å¦ï¼è¿æ ·ä½ æè½çæ£äºè§£ä½ åçç¨åºæ¯å¦ä½å¨ä¸ä¸ªç¹å®ç硬件ä¸è·çãè¿æ¯åºå«å¥½æä¸èé¸çä¸åä¹å¤ä¹äºãï¼TCP/IPåè®®æ è¦å¦ï¼ææçåµå ¥å¼é«æé½å¾ææ¡çä¸è¥¿ï¼è¿æ¯åºå«å¥½æä¸èé¸çä¸åä¹å¤ä¹ä¸ãï¼æäºè¿äºä¸è¥¿ï¼æ¿ä¸Linux驱å¨å·²ç»ä¸åè¯ä¸ï¼éè¦ä½ å»å¦ä¹ Linuxå æ ¸æºä»£ç åLinux驱å¨ç¨åºè®¾è®¡ï¼è¿æ¯ä¸ä¸ªææ¯ååãå°æ¤ï¼ä½ å·²ç»ç®æ¯åµå ¥å¼Linuxçä¸çº§äººç©äºï¼ç»§ç»å¾ä¸ï¼ï¼é³é¢ãè§é¢ç解ç è¯ç ææ¯ä½ å¾å¦ãï¼åç§ICï¼åç§bootloaderä½ è½å¤åä¸å ¶å¼å设计ãï¼èªè¡è®¾è®¡å¼åæ°äº§åï¼æ°ææ¯ã
armççubuntuå¯ä»¥å®è£ ä»ä¹è½¯ä»¶?å¯ä»¥åxubuntuç软件éç¨åï¼
æ¶æä¸ä¸æ ·ä¸ä¸ªxä¸ä¸ªarmï¼è½¯ä»¶ä¸è½éç¨ï¼ä¸è¿linuxä¸è¬é½æä¾æºä»£ç çï¼ç¨arm-linux-gccç¼è¯ä¸ä¸å°±è½ç¨äº.
qemu搭建arm linux kernel环境
搭建ARM Linux内核环境,包含详细步骤如下:
一、源码环境准备:
使用Ubuntu .系统,源码并下载最新版Linux内核源码(Linux Kernel Archives)。源码
安装交叉编译工具链,源码通过命令行使用`sudo apt-get install gcc--aarch-linux-gnu`或自行下载(开发者网站:developer.arm.com/downloads)。源码reddit 源码阅读
安装QEMU版本(最新版为`sudo apt-get install qemu-system-arm`)。源码
二、源码编译内核:
解压内核源码后,源码设置`config`文件,源码使用命令`make ARCH=arm CROSS_COMPILE=aarch-none-linux-gnu- defconfig`进行编译配置。源码确保`CROSS_COMPILE`前缀与自定义编译工具链名称一致。源码
执行`make ARCH=arm CROSS_COMPILE=aarch-none-linux-gnu- Image -j8`编译内核,源码生成kernel image`Image`和用于gdb调试的源码`vmlinux`文件。
可选步骤:编译内核模块(ko),源码使用命令`make ARCH=arm CROSS_COMPILE=aarch-none-linux-gnu- modules -j8`。
三、制作根文件系统:
选择便捷的busybox作为根文件系统,下载最新版本(busybox-1..1.tar.bz2)。进行编译配置并安装,confuserex源码分析根文件系统位于`busybox-1..1.tar.bz2/install/`。
构建ext4 image,合并busybox到img中,为后续实验提供方便。
四、使用QEMU启动内核:
创建启动脚本,包含内核`Image`和根文件系统`rootfs.img`的加载,确保脚本具有执行权限。启动脚本用于QEMU环境,简化实验过程。
完成步骤后,系统搭建完成。此过程记录于操作手册中,方便后续查看与避免重复错误。
在ARM上安装Linux操作系统arm安装linux
在 ARM 上安装 Linux 操作系统是一台被设计在嵌入式设备上的ARM处理器系统上安装 Linux 操作系统的过程。ARM处理器可以在大多数设备,如Android 智能手机、车载系统、网络摄像头和低功耗的商城全源码物联网设备上找到使用。Linux 操作系统也可以被移植到 ARM之上,这就使得开发者在一组软件实现框架的约束之内决定应用程序的功能。
安装 Linux 操作系统的过程包括对你的设备进行相关设置,使用特定固件准备内核文件,挂载文件系统,创建用户帐号,添加用户模块,安装开发工具,在最后创建可执行文件,使系统正常运行。
首先,让我们介绍安装 Linux 操作系统的准备工作,比如从ARM处理器开发板中提取应用软件开发所需的固件,以及使用特定固件准备文件,并编译为系统需要的内核文件:
# Download the kernel files
wget /linux-3.6.tar.gz
# Unpack the kernel source
tar -xvf linux-3.6.tar.gz
# Compile the kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=zImage
接下来,要挂载文件系统,创建用户帐号,添加用户模块,安装开发工具,badusb源码丢了并最终创建可执行文件:
# Mount the filesystem
mount -t ext4 /dev/sda1 /media
# Create user accounts
useradd -m username
passwd username
# Add root user module
usermod -a -G root username
# Install user development tools
apt-get update
apt-get install build-essential
# Create executable file
gcc -o hello hello.c
# Execute executable file
./hello
至此,Linux操作系统已经安装完毕。尽管安装 Linux操作系统的过程略有复杂,但它可以帮助您实现自己想要的功能。最后,请记住,在安装 Linux 操作系统之前,请将装备最新的固件文件,这样可以确保系统的稳定运行。
彻底理解Linux ARM系统调用
本文将逐步解析Linux ARM系统调用的工作原理,从用户程序如何通过系统调用进入内核并执行功能。首先,我们理解系统调用的本质:应用程序通过软中断的方式从用户态切换到内核态,然后由内核处理特定任务,再返回用户态。在ARMv8架构的ARM处理器中,这一过程涉及运行级别的划分,如EL0、EL1、odbc源码编译EL2和EL3,系统调用通常发生在从EL0到EL1的跳转。 在x架构中,使用int $0x汇编指令触发系统调用,而在ARMv8中,对应的指令是svc。glibc库的系统调用实现是关键,例如在glibc-2.源码中,以bind函数为例,可以看到通过INTERNAL_SYSCALL_RAW宏和svc指令实现的内核调用。接下来,我们将亲手模拟write函数的系统调用过程。 下面是一个简单的write函数实现示例,编译并运行它,你可以在我的GitHub项目javonhe/multi_experiments中获取源代码:GitHub - javonhe/multi_experiments: experiments for study。如果你觉得这个内容有价值,不妨分享或者收藏,你的支持将是我继续分享知识的动力。嵌入式Linux开发工具arm-linux-gcc安装及使用
嵌入式开发工具:arm-linux-gcc安装与使用指南
嵌入式开发涉及程序在特定硬件(如ARM微处理器)上运行的编译和调试,需要特殊的交叉编译器如arm-linux-gcc。这种工具允许在非目标平台上(如Windows开发机)生成适用于ARM/Linux系统的代码。 编译器分为两类:arm-none-eabi-gcc,用于编译裸机系统,不依赖于Linux。
arm-none-linux-gnueabi-gcc,针对Linux系统,利用GCC和Glibc库,如Codesourcery的优化版本。
安装步骤涉及下载编译器包,通常从Linaro官网获取,或者直接使用提供的链接。解压后,将gcc-4.6.4目录添加到环境变量和库路径中,通过编辑环境配置文件实现全局可用。 使用arm-linux-gcc编译时,遵循预处理、编译、汇编和链接的步骤,通过参数选项控制过程。例如,-E用于预处理,-S生成汇编文件,-c只编译不链接,-o指定目标文件名,-I和-I的区别,-l用于指定库,-L用于指定库搜索路径。 优化选项如-O0、-O1至-O3提供了不同程度的效率与大小之间的平衡。此外,-g选项在编译时包含调试信息。 课后作业中,涉及看门狗模块的硬件功能和编译命令,例如将fun.c编译成目标文件和链接库函数。ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核
基于 ARM & Linux 的基础学习 本文整理自“ask imx6ull”开发板的相关资料,以及菜鸟教程、C语言中文网等资源,旨在提炼核心内容,方便后续查阅。对于基础知识,本文将不再详述,如有错误,期待您的指正。请记住,文章基于IMX6ULL的A7内核,配置的交叉编译器对应ARMv7 位,对于A内核如i.mx8mm,则需使用ARMv8 位的工具链。保持清晰的学习态度,耐心探索。 获取Linux应用和驱动的编译指南,可以从三个途径入手:开发板供应商提供的SDK工具链、ARM官网下载、以及Linaro GCC编译器。具体操作涉及编辑~/.bashrc文件以添加环境变量,并测试编译器版本。 针对IMX6ULL,SDK中的工具链位于/.../ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin。通过添加至.bashrc并激活,验证工具链可用性。在编写和编译驱动程序时,需编写Makefile并确保环境变量设置正确。 编译内核时,需根据特定开发板的配置文件,如arch/arm/configs/目录下的内容进行。首先在Linux源码目录执行配置命令,生成内核文件和设备树文件。对于内核模块的编译,同样在Linux源码目录进行,完成后将模块导入目标板的lib/modules目录。 对于Buildroot构建系统,它简化了嵌入式Linux定制过程,自动化构建bootloader、内核和文件系统。通过一系列Makefile命令,可以快速生成适用于不同目标板的嵌入式Linux环境。学习Buildroot,可以参考相关文档。 构建过程可能耗时较长,但通过配置不同的配置文件,可以定制化地创建不同需求的文件系统。编译成功后,输出的文件需传输到嵌入式板并安装或烧录至SD卡或eMMC中。