学习笔记——Linux内核与嵌入式开发2
一、Linux启动流程详解1.1 SD卡启动流程1.1.1 四阶段启动过程第一阶段i.MX6内部ROM启动 第二阶段SD卡中的Bootloader执行 第三阶段内核加载与启动 第四阶段根文件系统挂载1.1.2 详细步骤系统上电执行内部ROM程序i.MX6内部有96KB ROMROM中的程序根据boot mode选择启动设备SD卡、eMMC、USB等如果选择SD卡启动从SD卡特定位置读取Bootloader加载Bootloader第一部分拷贝SD卡中的Bootloader前半部分到i.MX6内部RAM128KB内部RAM大小有限Bootloader必须分阶段执行Bootloader第一部分SPL负责初始化DDR内存Bootloader第二阶段执行Bootloader在自身前半部分初始化好DDR内存将自己后半部分从SD卡搬移到DDR内存执行完成完整的硬件初始化内核加载与启动Bootloader从SD卡读取内核镜像zImage将zImage加载到内存地址0x80800000处PC指针指向0x80800000启动内核执行挂载根文件系统内核启动完成后根据启动参数挂载SD卡上的根文件系统进入用户空间1.2 网络启动流程TFTPNFS1.2.1 网络启动环境硬件连接 开发板192.168.1.100 ↔ 交换机/路由器 ↔ Ubuntu服务器192.168.1.3 软件服务 TFTP服务器提供内核镜像下载 NFS服务器提供根文件系统共享1.2.2 详细步骤Bootloader网络初始化Bootloader初始化网卡驱动设置IP地址192.168.1.100设置服务器IP192.168.1.3TFTP下载内核Bootloader通过TFTP协议从Ubuntu下载zImage命令tftp 0x80800000 zImage将zImage下载到内存0x80800000地址处TFTP下载设备树下载设备树二进制文件.dtb命令tftp 0x83000000 imx6.dtb将设备树加载到内存0x83000000地址处启动内核命令bootz 0x80800000 - 0x83000000从0x80800000启动内核设备树在0x83000000NFS挂载根文件系统内核通过NFS协议挂载Ubuntu上的根文件系统根据bootargs参数配置NFS挂载1.3 混合启动方式1.3.1 内核在SD卡根文件系统在NFS优点 - 内核启动速度快本地加载 - 根文件系统方便更新网络共享 - 适合内核稳定、根文件系统频繁修改的场景1.3.2 内核通过网络根文件系统在SD卡优点 - 内核更新方便网络下载 - 根文件系统稳定本地存储 - 适合内核频繁调试的场景二、Ubuntu开发环境准备2.1 TFTP服务器配置2.1.1 安装TFTP服务# 安装TFTP服务器 sudo apt install tftpd-hpa # 安装TFTP客户端用于测试 sudo apt install tftp-hpa2.1.2 配置TFTP服务# 编辑配置文件 sudo vim /etc/default/tftpd-hpa # 配置文件内容示例 TFTP_USERNAMEtftp TFTP_DIRECTORY/tftpboot TFTP_ADDRESS:69 TFTP_OPTIONS--secure --create2.1.3 创建TFTP目录# 创建TFTP服务目录 sudo mkdir /tftpboot # 设置目录权限 sudo chmod 777 /tftpboot sudo chown nobody:nogroup /tftpboot2.1.4 重启服务# 重启TFTP服务 sudo systemctl restart tftpd-hpa # 查看服务状态 sudo systemctl status tftpd-hpa # 设置开机自启 sudo systemctl enable tftpd-hpa2.1.5 放置内核文件# 将内核镜像复制到TFTP目录 cp zImage /tftpboot/ cp imx6.dtb /tftpboot/ # 确保文件可读 chmod 644 /tftpboot/zImage chmod 644 /tftpboot/imx6.dtb2.2 NFS服务器配置2.2.1 安装NFS服务# 安装NFS服务器 sudo apt install nfs-kernel-server # 安装NFS客户端可选 sudo apt install nfs-common2.2.2 配置NFS共享# 编辑配置文件 sudo vim /etc/exports # 添加共享配置 /home/linux/nfs *(rw,sync,no_root_squash,no_subtree_check) # 或者更安全的配置 /home/linux/nfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)参数说明rw读写权限sync同步写入no_root_squash信任root用户no_subtree_check不检查子目录权限192.168.1.0/24只允许指定网段访问2.2.3 创建共享目录# 创建NFS共享目录 mkdir -p /home/linux/nfs # 创建根文件系统子目录 mkdir -p /home/linux/nfs/imx6/rootfs2.2.4 解压根文件系统# 进入NFS目录 cd /home/linux/nfs/imx6 # 解压根文件系统 sudo tar -xvf rootfs.tar.bz2 -C rootfs/ # 设置权限如果需要 sudo chmod 755 rootfs2.2.5 重启NFS服务# 重新导出共享目录 sudo exportfs -arv # 重启NFS服务 sudo systemctl restart nfs-kernel-server # 查看服务状态 sudo systemctl status nfs-kernel-server # 查看共享目录 sudo showmount -e localhost2.3 网络配置检查2.3.1 网络连通性测试# 检查Ubuntu IP地址 ip addr show # 检查网络连通性开发板ping服务器 # 在开发板上执行ping 192.168.1.3 # 检查服务器是否能访问开发板 ping 192.168.1.1002.3.2 防火墙配置# 检查防火墙状态 sudo ufw status # 如果防火墙开启需要开放端口 sudo ufw allow 69/tcp # TFTP sudo ufw allow 69/udp # TFTP sudo ufw allow 111/tcp # NFS sudo ufw allow 2049/tcp # NFS sudo ufw allow 2049/udp # NFS # 或者临时关闭防火墙开发环境 sudo ufw disable三、U-Boot命令详解3.1 基础命令操作3.1.1 帮助与信息查询# 查看所有可用命令 help 或 ? # 查看特定命令帮助 help command_name 例help tftp3.1.2 重启命令# 重启系统 reset # 重启到不同模式 reset recovery # 恢复模式 reset fastboot # 快速启动模式3.2 环境变量管理3.2.1 环境变量查看# 查看所有环境变量 printenv 或 print # 查看特定环境变量 printenv variable_name 例 printenv ipaddr printenv bootargs3.2.2 环境变量设置# 设置环境变量 setenv name value # 示例 setenv ipaddr 192.168.1.100 setenv serverip 192.168.1.3 setenv bootdelay 3 # 设置多行变量用于bootargs setenv bootargs consolettymxc0,115200 root/dev/nfs nfsroot192.168.1.3:/home/linux/nfs/imx6/rootfs,nfsvers3 ip192.168.1.100 init/linuxrc3.2.3 环境变量删除# 删除环境变量将值设为空 setenv name # 示例 setenv old_ip setenv unused_var3.2.4 环境变量保存# 保存环境变量到存储设备 saveenv # 保存位置一般为MMC/SD卡或Flash # 查看保存的设备 printenv boot_device3.3 网络相关环境变量3.3.1 必需的网络变量# 开发板IP地址 setenv ipaddr 192.168.1.100 # 服务器IP地址TFTP/NFS服务器 setenv serverip 192.168.1.3 # MAC地址硬件唯一标识 setenv ethaddr 00:04:9f:01:02:03 # 子网掩码 setenv netmask 255.255.255.0 # 网关地址 setenv gatewayip 192.168.1.13.3.2 可选网络变量# 第二个网卡MAC地址 setenv eth1addr 00:04:9f:01:02:04 # 网络设备名 setenv nvlan 1 setenv vlan 1 setenv devtype ethernet3.4 TFTP操作命令3.4.1 TFTP下载命令格式# 基本格式 tftp [loadAddress] [[hostIPaddr:]bootfilename] # 下载内核到内存 tftp 0x80800000 zImage # 下载设备树到内存 tftp 0x83000000 imx6.dtb # 指定服务器IP下载 tftp 0x80800000 192.168.1.3:zImage3.4.2 TFTP下载过程设置服务器IPsetenv serverip 192.168.1.3设置开发板IPsetenv ipaddr 192.168.1.100测试网络连接ping 192.168.1.3下载内核tftp 0x80800000 zImage下载设备树tftp 0x83000000 imx6.dtb3.5 内核启动命令3.5.1 启动命令格式# 基本格式 bootz [内核地址] [initrd地址] [设备树地址] # 常用格式无initrd bootz 0x80800000 - 0x83000000 # 含义 # 0x80800000 - 内核zImage加载地址 # - - 无initrdramdisk # 0x83000000 - 设备树加载地址3.5.2 启动参数设置# 设置完整的启动参数 setenv bootargs consolettymxc0,115200 root/dev/nfs nfsroot192.168.1.3:/home/linux/nfs/imx6/rootfs,nfsvers3 ip192.168.1.100 init/linuxrc # 参数解析 # consolettymxc0,115200 - 串口控制台波特率115200 # root/dev/nfs - 根文件系统类型为NFS # nfsroot192.168.1.3:/home/linux/nfs/imx6/rootfs - NFS服务器路径 # nfsvers3 - NFS版本3 # ip192.168.1.100 - 开发板IP地址 # init/linuxrc - 第一个用户空间进程3.5.3 自动启动设置# 设置自动启动命令 setenv bootcmd tftp 0x80800000 zImage; tftp 0x83000000 imx6.dtb; bootz 0x80800000 - 0x83000000 # 保存设置 saveenv # 测试自动启动 run bootcmd3.6 其他实用命令3.6.1 内存操作# 查看内存内容 md.b 0x80800000 10 # 以字节格式查看 md.w 0x80800000 10 # 以字格式查看 md.l 0x80800000 10 # 以长字格式查看 # 修改内存内容 mw.l 0x80800000 0x12345678 1 # 内存比较 cmp 0x80800000 0x80900000 1003.6.2 存储设备操作# 查看MMC设备 mmc list # 选择MMC设备 mmc dev 0 # 选择设备0 mmc dev 0 1 # 选择设备0的分区1 # 读取MMC信息 mmc info # 从MMC读取数据 mmc read 0x80800000 0x600 0x800四、启动参数详解4.1 bootargs参数解析4.1.1 控制台配置consolettymxc0,115200 # ttymxc0 - i.MX6的串口设备名 # 115200 - 波特率 # 其他可选值9600, 19200, 38400, 57600, 1152004.1.2 根文件系统配置root/dev/nfs # /dev/nfs - 表示使用NFS作为根文件系统 # 其他选项/dev/mmcblk0p2SD卡分区, /dev/mtdblock2Flash4.1.3 NFS配置nfsroot192.168.1.3:/home/linux/nfs/imx6/rootfs,nfsvers3 # 192.168.1.3 - NFS服务器IP # /home/linux/nfs/imx6/rootfs - 共享目录路径 # nfsvers3 - NFS协议版本4.1.4 网络配置ip192.168.1.100 # 开发板IP地址 # 完整格式ipclient-ip:server-ip:gw-ip:netmask:hostname:device:autoconf4.1.5 Init进程配置init/linuxrc # /linuxrc - 第一个用户空间进程 # 通常是/bin/init或/sbin/init的符号链接4.2 其他常用参数4.2.1 内存参数mem512M # 指定内存大小 # 当系统内存检测不正确时使用4.2.2 调试参数debug # 启用内核调试信息 loglevel8 # 设置日志级别0-88最详细 earlyprintk # 早期控制台输出用于调试启动问题4.2.3 文件系统参数rw # 以读写方式挂载根文件系统 noinitrd # 不使用initrdramdisk五、故障排查指南5.1 常见问题与解决方案5.1.1 TFTP下载失败问题tftp命令执行后没有反应或超时 解决 1. 检查网络连接ping 192.168.1.3 2. 检查TFTP服务状态sudo systemctl status tftpd-hpa 3. 检查文件权限确保/tftpboot/zImage可读 4. 检查防火墙sudo ufw status5.1.2 NFS挂载失败问题内核启动后卡在NFS挂载 解决 1. 检查NFS服务sudo showmount -e localhost 2. 检查exports配置sudo cat /etc/exports 3. 检查目录权限确保共享目录存在且可访问 4. 检查网络配置ip addr show5.1.3 内核启动失败问题bootz命令后系统无响应 解决 1. 检查内核地址确保与加载地址一致 2. 检查设备树地址确保正确加载 3. 检查串口输出查看错误信息 4. 检查内存配置确保足够内存5.1.4 环境变量丢失问题重启后环境变量恢复默认 解决 1. 确保执行saveenv保存 2. 检查存储设备printenv boot_device 3. 检查存储空间确保有足够空间

相关新闻

Skill这么火,但我劝你先别急着学

Skill这么火,但我劝你先别急着学

Skill这么火,但我劝你先别急着学 有人说太香了,工作效率翻倍;有人说根本不会用,摸不着门道;还有说太多了根本用不过来,选择困难症犯了;……同样是这个Skill,为什么大家的体验差这么多…

2026/7/13 1:19:04 阅读更多 →
元气AI Bot横空出世:元气Bot实现手机遥控电脑+飞书深度联动

元气AI Bot横空出世:元气Bot实现手机遥控电脑+飞书深度联动

前言 当全球AI赛道还在围绕"对话框"内卷时,一场静悄悄的生产力革命正在中国本土发生。2026年初,一款名为元气AI Bot的国产智能助手突然在技术社区引爆讨论,它不同于任何传统AI聊天机器人——这是一个能直接接管你电脑操作、深度融…

2026/7/11 20:56:23 阅读更多 →
快速定位系统:实现空间精准感知的技术底座

快速定位系统:实现空间精准感知的技术底座

在当今的工业协作与移动互联网生态中,定位精度与反馈速度已成为衡量数字化水平的关键指标。传统的全球定位系统虽然解决了大尺度下的坐标获取问题,但在面对高频率位移和复杂室内环境时,往往显得力不从心。于是,一套能够实现厘米级…

2026/7/12 0:49:08 阅读更多 →

最新新闻

数据科学项目如何将Jupyter Notebook转为可分享网页

数据科学项目如何将Jupyter Notebook转为可分享网页

我理解您的要求,但需要明确说明:您提供的输入内容存在严重合规风险。该原文标题与正文多次嵌入外部平台导流信息(如“Read the full blog for free on Medium”、“Join thousands of data leaders on the AI newsletter”、“Published via …

2026/7/14 2:30:04 阅读更多 →
PyTorch动态计算图与深度学习开发实战指南

PyTorch动态计算图与深度学习开发实战指南

第一次在本地环境跑通 PyTorch 训练脚本的那个下午,我盯着终端里跳动的损失值曲线,突然意识到一件事:很多人把 PyTorch 当作又一个需要“学习”的框架,但它的核心价值其实藏在那个看似简单的动态计算图里——不是让你多写几行代码…

2026/7/14 2:26:03 阅读更多 →
OpenCV图像处理实战:从环境搭建到目标检测完整指南

OpenCV图像处理实战:从环境搭建到目标检测完整指南

1. 为什么OpenCV值得投入时间学习OpenCV(Open Source Computer Vision Library)是计算机视觉领域最基础、应用最广的开源库。无论你是刚接触AI的新手,还是已经有深度学习经验但想夯实基础的老手,OpenCV都是绕不开的必备技能。它最…

2026/7/14 2:26:03 阅读更多 →
Docker容器清理:从单个删除到批量清理的完整指南

Docker容器清理:从单个删除到批量清理的完整指南

1. Docker容器清理的必要性每次项目迭代或环境重置时,Docker主机上总会堆积大量停止运行的容器。这些"僵尸容器"不仅占用磁盘空间,还会导致以下问题:资源浪费:每个停止的容器仍保留着可写层,长期积累可能占用…

2026/7/14 2:26:03 阅读更多 →
ROS 2核心原理:DDS通信、QoS策略与实时性调优实战

ROS 2核心原理:DDS通信、QoS策略与实时性调优实战

1. 项目概述:这不是“升级版ROS”,而是一次从内核重写的系统级重构“The ROS 2 Project”——这个看似平淡的标题背后,藏着过去十年机器人软件开发领域最彻底、最艰难、也最具长远价值的一次技术跃迁。它不是ROS 1.x的补丁式迭代,…

2026/7/14 2:20:01 阅读更多 →
主流AI服务集成实战:OpenAI、Claude、Gemini与Grok接入指南

主流AI服务集成实战:OpenAI、Claude、Gemini与Grok接入指南

在技术项目开发中,集成第三方 AI 服务已经成为提升应用智能能力的重要方式。无论是为产品添加对话交互、内容生成、代码辅助还是数据分析功能,掌握主流 AI 工具的接入流程都是现代开发者必备的技能。本文将以工程实践的角度,详细解析如何在项…

2026/7/14 2:18:00 阅读更多 →

日新闻

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:01:13 阅读更多 →
Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

更多请点击: https://codechina.net 第一章:Perplexity 怎么用 Perplexity 是衡量语言模型预测能力的核心指标,数值越低表示模型对文本序列的不确定性越小、预测越精准。它本质上是交叉熵损失的指数形式,计算公式为:…

2026/7/14 0:01:13 阅读更多 →
全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

五一视界发布公告,近日,公司与环天智慧科技股份有限公司(“环天智慧”)正式达成空天领域战略合作。环天智慧是国内领先、聚焦天基对地观测遥感卫星总体研制与在轨运营的商业航天企业,同时也是西南地区规模最大、具备全自主可控遥感卫星星座建…

2026/7/14 0:03:13 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻