uboot学习及内核更换_incomplete

官方文档
在前面

文章目录

  • uboot常见命令学习
    • 环境变量
    • 网络控制台
    • uboot标准启动
    • 其他
  • 升级uboot或内核
    • bin和uimg以及booti和bootm的区别
    • 制作uImage
    • 更换内核
    • 更换uboot
    • 后续计划

uboot常见命令学习

环境变量

Environment Variables环境变量
autostart 如果值为yes,则会在以下命令后自动执行bootm加载镜像

bootelf - Boot from an ELF image in memory
bootp - boot image via network using BOOTP/TFTP protocol
dhcp - boot image via network using DHCP/TFTP protocol
diskboot - boot from ide device
nboot - boot from NAND device
nfs - boot image via network using NFS protocol
rarpboot - boot image via network using RARP/TFTP protocol
scsiboot - boot from SCSI device
tftpboot - boot image via network using TFTP protocol
usbboot - boot from USB device

bootcmd 用户不进bootshell自动执行的命令
bootargs 传递给操作系统或镜像的参数
bootfile tftp时的镜像名
ipaddr tftpboot用到的ip地址
serverip tftpboot用到的tftp服务器地址

网络控制台

Network console
uboot启用network console
需要设置CONFIG_NETCONSOLE=y以启用特性。
使用方法:
使用ncip设置目的地址和端口号(默认6666),比如你的服务器ip是192.168.1.1:

=> setenv nc 'setenv stdout nc;setenv stdin nc'
=> setenv ncip 192.168.1.1
=> saveenv
=> run nc

在主机侧,使用脚本来访问控制台:

tools/netconsole <ip> [port]

主机侧也可以使用主机名
参考《【调试】netconsole的使用》
linux启用network console
如果想开启这个功能,需要内核编译支持,我这里的选项默认是:

CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=n

如果将netconsole编译进内核自动加载,还需要在内核启动参数中传递进去。格式如下:

netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]

例子:

netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc
netconsole=@/,@192.168.3.1/

然后查看linux控制台输出:

nc -u -l -p 6666

uboot标准启动

U-Boot Standard Boot
bootdev 可保存或访问发行版的设备
bootmeth 扫描bootdev发现bootflow的方法
bootflow 描述启动方法(发行版提供)

其他

bootmenu 生成一个选单

升级uboot或内核

bin和uimg以及booti和bootm的区别

参考文章《编译生成uImage过程——mips平台》

uboot.bin是U-boot bootloader的二进制文件。
uImage是一个小内核映像,带有Uboot的修改头,使U-boot能够加载此内核映像uboot.bin是U-boot bootloader的二进制文件。
uImage是一个小内核映像,带有Uboot的修改头,使U-boot能够加载此内核映像

booti和bootm命令的区别

bootz是启动zImage,而bootm是启动uImage,其中booti专门用来启动ARM64的kernel image。

制作uImage

使用uboot的tools目录下的mkimage命令可以创建用于uboot的镜像,即uImage。
先加下这个命令:

$ sudo update-alternatives --install /usr/bin/mkimage mkimage /home/wsl/project/raspberry_pi/u-boot/tools/mkimage 10

常见参数

Usage: ./mkimage [-T type] -l image-l ==> list image header information-T ==> parse image file as 'type'-q ==> quiet./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image-A ==> set architecture to 'arch'-O ==> set operating system to 'os'-T ==> set image type to 'type'-C ==> set compression type 'comp'-a ==> set load address to 'addr' (hex)-e ==> set entry point to 'ep' (hex)-n ==> set image name to 'name'-R ==> set second image name to 'name'-d ==> use image data from 'datafile'-x ==> set XIP (execute in place)-s ==> create an image with no data-v ==> verbose./mkimage [-D dtc_options] [-f fit-image.its|-f auto|-f auto-conf|-F] [-b <dtb> [-b <dtb>]] [-E] [-B size] [-i <ramdisk.cpio.gz>] fit-image<dtb> file is used with -f auto, it may occur multiple times.-D => set all options for device tree compiler-f => input filename for FIT source-i => input filename for ramdisk file-E => place data outside of the FIT structure-B => align size in hex for FIT structure and header-b => append the device tree binary to the FIT-t => update the timestamp in the FIT
Signing / verified boot options: [-k keydir] [-K dtb] [ -c <comment>] [-p addr] [-r] [-N engine]-k => set directory containing private keys-K => write public keys to this .dtb file-g => set key name hint-G => use this signing key (in lieu of -k)-c => add comment in signature node-F => re-sign existing FIT image-p => place external data at a static position-r => mark keys used as 'required' in dtb-N => openssl engine to use for signing-o => algorithm to use for signing./mkimage -V ==> print version information and exit
Use '-T list' to see a list of available image types
Long options are available; read the man page for details

参考《uboot-tool工具命令mkimage详解uboot-tool工具命令mkimage详解》,一个典型的生成命令如下:

mkimage -A arm64 -O linux -T kernel -a 0x00080000 -e 0x00080040 -C none -n kernel-myconfig -d arch/arm64/boot/Image kernel.uImage

比较关键的是-e参数,-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头),关于参数,这里还有一份更全的文档可以参考。
使用上述命令后,内核无法启动,报错:

Working FDT set to 0Loading Kernel Image
FDT and ATAGS support not compiled inresetting ...

后面再看

更换内核

暂时搞了这么几个env,可以用来运行

booti_kernel=booti ${kernel_addr_r} - ${fdt_addr}
dhcp_get_kernel=dhcp ${kernel_addr_r} kernel-myconfig.img
dhcpboot=run dhcp_get_kernel;run booti_kernel
fat_get_kernel=fatload mmc 0:1 ${kernel_addr_r} kernel-myconfig.img
fatboot=run fat_get_kernel;run booti_kernel

更换uboot

暂时用了个笨办法,先用dhcp把u-boot.bin取过来,然后用fatwrite写到boot分区,然后reset重新启动

后续计划

看是否能较方便的一次性更换内核,设备树,模块等。
一个自定义的uboot环境变量

HWID=TS-SG5036FX:02:04:01:0E:101:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
ID=000000000000000000
appauto=1
baudrate=115200
boardmodel=RTL9311_6x8214QF_1x8218E_4XGE_24GF_8GE_4XF
boot_flag=0
bootargs=mem=512M console=ttyS0,115200 rd_start=0x82000000 rd_size=0xd00000 root=/dev/ram0 rw init=/linuxrc
bootcmd=boota
bootdelay=1
bootflag=0
da=tftp 0x81000000 boot.bin.img; flwrite
dh_keyboard=0
dr=tftp 0x81000000 krootfs.bin.img; flwrite
drb=tftp 0x81000000 krootfs_backup.bin.img; flwrite
ethact=rtl9310#0
ethaddr=20:23:04:19:13:38
fileaddr=81000000
filesize=D74F38
gatewayip=172.14.48.1
ipaddr=172.14.49.120
ledModeInitSkip=0
netmask=255.255.255.0
serverip=10.33.7.176
stderr=serial
stdin=serial
stdout=serial
tk=tftp 0x81000000 krootfs.bin.img; bootm 0x81000000
up=tftp 0x81000000 update.img; flwrite

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

labelme将JSON标记文件转换为二值PNG图像

看了好几篇博客。在使用他们的代码时&#xff0c;出现了各种各样的问题&#xff1b;在底下留言时&#xff0c;博主大多是充耳不闻。感觉CSDN的质量越来越次了&#xff0c;有时候真还不如直接问chatGPT呢。 要将labelme生成的JSON标记文件转换为PNG二值图像&#xff0c;只需运行…

【Shell编程练习】监控内存和磁盘容量,小于给定值时报警

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 系列文章目录分析代码实现运行结果 分析 对于磁盘容量&#xff0c;可以使用df命令查看指定指定分区的磁盘使用情况。比如 然后我们需要从这段输出中提取我们想要的信息。在这里就是Available字段的值。…

【wargames】bandit0~9关wp

第1关直接ssh连接&#xff0c;获得密码NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL&#xff0c;用这个密码连接第2关 第2关&#xff0c;连接之后查看 存在特殊字符的文件 因为使用 - 作为参数是指 STDIN/STDOUT 即 dev/stdin 或 dev/stdout 。所以如果你想打开这种类型的文件&#xff0…

数据结构--二叉搜索树的实现

目录 1.二叉搜索树的概念 2.二叉搜索树的操作 二叉搜索树的插入 中序遍历(常用于排序) 二叉搜索树的查找 二叉搜索树的删除 完整二叉树代码&#xff1a; 二叉搜索树的应用 key/value搜索模型整体代码 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一…

基于JAVA的考研专业课程管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

SAP CO系统配置-获利能力分析-(机器人制造项目实例)

创建经营组织 配置路径 IMG菜单路径:企业结构>定义>控制>创建经营组织 事务代码 KEP8 屏幕截图: 维护特性 配置路径

nodejs+vue+ElementUi农产品团购销售系统zto2c

目标是为了完成小区团购平台的设计和实现&#xff0c;在疫情当下的环境&#xff0c;方便小区业主购入生活所需&#xff0c;减小居民的生活压力 采用B/S模式架构系统&#xff0c;开发简单&#xff0c;只需要连接网络即可登录本系统&#xff0c;不需要安装任何客户端。开发工具采…

Python/R/GUI/BI类型常用数据可视化工具

什么是数据可视化工具&#xff1f; 数据可视化工具是指旨在可视化数据的所有形式的软件。它们处理数据输入&#xff0c;将其转换为用户可以根据自己的需求进行定制的视觉效果。 不同的工具可以包含不同的功能&#xff0c;但最基本的是&#xff0c;数据可视化工具提供输入数据集…

CDN:内容分发的高速公路(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

百度编辑器常用设置

1、创建编辑器 UE.getEditor(editor, { initialFrameWidth:"100%" //初始化选项 }) 精简版 UE.getEditor(editor) 2、删除编辑器 UE.getEditor(editor).destroy(); 3、使编辑器获得焦点 UE.getEditor(editor).focus(); 4、获取编辑器内容 UE.getEditor(editor).getCo…

蓝牙曝底层安全漏洞,数十亿设备受影响

内容概括&#xff1a; Eurecom的研究人员近期分享了六种新型攻击方式&#xff0c;统称为"BLUFFS"&#xff0c;这些攻击方式能够破坏蓝牙会话的保密性&#xff0c;使设备容易受到冒充和中间人攻击(MitM)。攻击发现者Daniele Antonioli解释道&#xff0c;"BLUFFS…

flask之文件管理系统-项目 JRP上线啦!!! ---修订版,兼容Windows和Linux系统

上一章的版本https://blog.csdn.net/weixin_44517278/article/details/135275066&#xff0c;在Windows下debug完成无异常后&#xff0c;上传到我的树莓下开始正式服役 由于开发环境是Windows&#xff0c;使用环境是Linux&#xff0c;导致最后没能成功运行起来 这个版本是今天去…

数据预处理中,异常值的检测方法

在数据预处理中&#xff0c;异常值&#xff08;outlier&#xff09;是指与其他数据明显不同的数据点&#xff0c;它们可能是由于测量误差、数据录入错误、样本选取错误或者随机事件等原因导致的。异常值可能会对数据分析和建模产生负面影响&#xff0c;因此需要对其进行检测和处…

HTML滚动字幕怎么实现?一招教你解决

滚动字幕标签&#xff1a;marquee 使用<marquee>标签可以将文字设置为动态滚动的效果。 语法&#xff1a; <marquee>标签语法 滚动方向属性 <marquee direction"滚动方向">滚动文字</marquee> 滚动方式属性 <marquee behavior"滚…

Python If语句以及代码块的基本介绍

if语句 在编程中if语句是一种根据条件执行不同代码块的控制结构,他根据条件的真假来分支程序的执行路径,所以我们可以通过if语句根据不同情况而执行不同的程序 格式 if [条件(bool值或者计算结果为bool类型的算式)] : a11if a>10:print("a大于10") # --> a大…

欧洲十大跨境电商平台,自养号测评下单的重要性及优势

在欧洲站&#xff0c;用户体量非常庞大&#xff0c;这与近几年人们的消费习惯密不可分&#xff0c;越来越多的人开始网购&#xff0c;据欧盟委员的最新调研显示&#xff0c;在欧盟&#xff0c;近一半(42%)的中小企业通过在线市场销售产品和服务。 所以&#xff0c;逸居海外给大…

二、typescript变量声明

var声明let声明const声明declare 声明文件declare var 声明全局变量declare function 声明全局函数declare class 声明全局类declare enum 声明全局枚举类型declare namespace 声明&#xff08;含有子属性的&#xff09;全局对象interface 和 type 声明全局类型export 导出…

re:Invent 2023技术上新|Amazon DynamoDB与OpenSearch Service的Zero-ETL集成

Amazon DynamoDB 与 Amazon OpenSearch Service 的 Zero-ETL 集成已正式上线&#xff0c;该服务允许您通过自动复制和转换您的 DynamoDB 数据来搜索数据&#xff0c;而无需自定义代码或基础设施。这种 Zero-ETL 集成减少了运营负担和成本&#xff0c;使您能够专注于应用程序。这…

蓝桥杯python比赛历届真题99道经典练习题 (8-12)

【程序8】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include "stdio.h" main() {int i,j,result;printf("\n");for (i=1;i<10;i++){ for(j=1;j<10;j++){result=i*j;printf("%d*%d=%-3…

js for和forEach 跳出循环 替代方案

1 for循环跳出 for(let i0;i<10;i){if(i5){break;}console.log(i) }在函数中也可以return跳出循环 function fn(){for(let i0;i<10;i){if(i5){return;}console.log(i)} } fn()for ... of效果同上 2 forEach循环跳出 break会报错 [1,2,3,4,5,6,7,8,9,10].forEach(i>…