内核驱动开发之系统移植
系统移植
系统移植:定制linux操作系统
- 系统移植是驱动开发的前导,
- 驱动开发是系统运行起来之后,在内核中新增一些子功能而已
系统移植就四个部分:
- 交叉编译环境搭建好
- bootloader的选择和移植:BootLoader有一些很成熟的开源项目,项目中更多的是选型,选型后修改移植。
- 内核核心子系统编译:kernel的配置、编译、移植和调试
- 文件系统编译:根文件系统的制作
前两个步骤,芯片公司基本都已经做好了,没什么工作量。产品公司,根据需求,对内核的二次配置、开发和编译,以及根文件系统制作。所以,芯片公司重点在1、2,产品公司重点在3、4。
学习方法和思路:
- 先整体(知道是什么,建立框架、地图),后局部(朝一个方向深入)
- 理解嵌入式系统的启动流程
1 嵌入式系统启动流程
1.1 PC机启动流程
- 系统上电后,首先加载主板ROM上的BIOS程序。bios保存基本的输入输出程序、开机自检程序和系统自启动程序,主要功能是初始化CPU、内存、主板芯片组、显卡、外围设备。比如初始化CPU,会初始化CPU的时钟信号。
- BIOS自检完成后,运行引导加载程序bootloader,bootloader可以从硬盘装载到主内存中。引导程序的主要功能是加载操作系统到内存中运行。
- linux常用的bootloader — GNU GRUB。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。
- GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
- LlLO:Linux引导程序
- 操作系统启动
- 挂载文件系统
- 运行应用程序
1.2 嵌入式系统启动流程
- 嵌入式系统没有BIOS,无法通过BIOS初始化硬件设备。芯片公司在设计芯片的时候,在片内的iROM一段区域(ARM核芯片一般是0地址开始)中写入了一段代码:对芯片基本硬件初始化,然后判断启动方式(判断启动管脚的高低电平),最后从判断的启动设备中将bootloader程序的一部分数据读到SRAM(iRAM)中;
- 运行bootloader第一阶段代码:在SRAM(是芯片内部的内存,很小,几十k)中运行。初始化系统时钟(让CPU主频更快)、初始化内存、自搬移bootloader代码到内存(可以是搬移剩下的,也可以整个搬移)
- 运行bootloader第二阶段代码(Secondary Program Loader,SPL):在内存中运行。初始化外围硬件设备、加载linux内核到内存、跳转到linux内核地址
- 在内存中启动操作系统
- 挂载文件系统
- 运行应用程序
可见,嵌入式BootLoader = PC机的BIOS + 引导程序
2 交叉编译工具集介绍
2.1 为什么要有交叉编译?
没有arm硬件,想在x86宿主机编译arm的目标机内核。(要知道同一个命令,转换为二进制指令,arm和x86架构系统可能是不同的,所以要分别编译)
目标机和主机内核架构相同:称为普通编译;架构不同,称为交叉编译
file命令:可以查看文件的属性,可以知道是在什么架构下编译的。
# 如下:build文件是ELF头 64bit的**小端(LSB表示小端)**可执行程序,arm架构
linx:~# file build
build: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=8d124a17e08ca48f653bb83666ac3a74f9872c6c, not stripped
2.2 交叉编译工具集:arm-linux-gnueabihf
名称说明:第一位架构;第二位厂商(一般为none,表示开源);第三位工具适用的操作系统(比如这里的Linux);第四位 GNU–表示开源规则,eabi–表示嵌入式标准库接口。
2.3 交叉编译工具集安装
1、arm-linux-gnueabihf
安装:https://blog.csdn.net/qq_40296728/article/details/135458955
工具集中,用得最多的就是arm-linux-gnueabihf-gcc
。
使用工具集时建议使用绝对路径,避免机器上存在多个版本的编译器时,用错编译器出各种问题。
2、32库安装:yum provides libstdc++.so.6
查询匹配的32位版本,然后安装查询的匹配版本。
2.4 arm-linux-gnueabihf工具集常用命令简介
readelf
:用于显示elf
格式目标文件的信息(windows叫PE头,Linux叫ELF头),如readelf -h filename
。
size
::读取可执行程序的大小。可以知道代码段、数据段有多少个字节,如size filename
。
nm
:查看目标文件符号表。符号表中T
表示全局函数标签,D
表示全局变量区,d
表示本文件内有效的即被static修饰的变量区,t
表示被static修饰的函数区。
strip
:踢除符号表。编译出的目标文件,本身是包含符号表的,可以使用strip filename
剔除符号表节省空间。可以ls -l obj_filename
观察剔除前和剔除后目标文件的大小。
strings
:查询可执行程序的常量字符串。
objdump
:反汇编。objdump -d
。
objcopy
:把某些代码段拷贝出来。
add2line
:调试中可以把行号标示出来。
3 移植步骤
1、确定目标机、主机的连接方式。目标机是版子,成本低接口没有主机(PC)丰富,所以一定要确定目标机能够支持的数据传输接口。4种常用的连接接口:
- 串口(UART异步串行通信接口,速率低,实用性强),比如路由器
- USB串行通信接口(速度快、驱动要移植修改)
- TCP/IP网络通信接口(速度快、驱动要移植)
debug jtag
调试接口(方便快捷、价格奇高)
主机中的数据如何传递到开发板上?
第一种是普通的数据,如 uboot kernel
,可以使用UART
或者网络接口TFTP
,一般用TFTP
传输kernel
数据。
第二种是调式:挂载调试。将主机的一块分区直接挂载到板子上。这样就需要使用TCP/IP
的应用层NFS
协议。
2、安装交叉编译器
- 安装芯片厂商编译好的工具链(推荐)
- 手动编译交叉工具链(一般不建议用)
3、搭建主机、目标机数据传输通道:相关服务安装。比如使用TCP/IP
网络通信接口,需要TFTP
服务,NFS
服务。
4、编译三大子系统:bootloader功能子系统、内核子系统、文件系统子系统
5、烧写测试。
ps:串口一般与主机连接,用于显示printf信息,而不是用于数据传输。
4 台式机环境搭建
环境搭建的目的是保证主机和板子网络互通。可以将板子与主机连在同一个交换机上,配同一个子网。
5 系统移植
5.1 uboot和常用命令uboot
uboot是BootLoader的一个子功能(子软件)。常用命令:
1、print:查看uboot软件的环境变量
2、setenv:设置、修改、删除环境变量。setenv带环境变量名不带值,就是删除。设置/修改环境变量格式:setenv var var_value
。
3、saveenv:将环境变量刷写到flash,持久化。
环境变量中,ipaddr
变量,用于配置板子与主机的局域网,及网络层。如何测试网络通不通呢?注意,uboot配置网络层ICMP协议的时候,很精简,ping的echo响应数据包都省略了,所以不能从主机ping板子,只能通过板子ping主机。从板子ping主机的响应信息中有alive
,代表是通的。
4、tftp:传输层协议,也是uboot中的命令。uboot中是采用基于udp的文件传输协议,即tftp协议。client:开发板,server:主机。
client:uboot中,环境变量serverip
指定server IP,port由tftp命令写死了。所以使用tftp命令只需在后面跟上内存地址和下载的文件名,格式:tftp 20008000 filename
。
server:windows server可直接搜索下载tftpd32
软件。linux server搭建:
- 安装tftp服务:apt-get install tftpd openbsc-xinetd
相关文章:
内核驱动开发之系统移植
系统移植 系统移植:定制linux操作系统 系统移植是驱动开发的前导,驱动开发是系统运行起来之后,在内核中新增一些子功能而已 系统移植就四个部分: 交叉编译环境搭建好bootloader的选择和移植:BootLoader有一些很成熟…...
前端在网络安全攻击问题上能做什么?
前端在Web网络安全攻击问题上扮演着至关重要的角色,可以通过多种措施来增强Web应用的安全性。以下是前端在应对Web网络安全攻击时可以采取的具体行动: 1. 输入验证和过滤 严格验证用户输入:前端应对所有用户输入进行严格的验证,…...
IntelliJ IDEA 创建 HTML 项目教程
传送门 IntelliJ IDEA 是 JetBrains 提供的一款强大且多功能的集成开发环境(IDE),不仅可以用于 Java 开发,还支持多种其他编程语言和技术,包括 HTML、CSS 和 JavaScript 等前端开发工具。本文将带你逐步了解如何使用 IntelliJ IDEA 创建一个 HTML 项目,并配置适合前端开…...

YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
摘要 轻量级视觉变换器(ViTs)在资源受限的移动设备上表现出优越的性能和较低的延迟,相比之下轻量级卷积神经网络(CNNs)稍显逊色。研究人员发现了许多轻量级 ViTs 和轻量级 CNNs 之间的结构联系。然而,它们在块结构、宏观和微观设计上的显著架构差异尚未得到充分研究。在…...

VBS学习1 - 语法、内置函数、内置对象
文章目录 概述执行脚本语法转义字符文本弹框msgbx定义变量dim(普通类型)定义接收对象set字符拼接&用户自定义输入框inputbox以及输入判断ifelse数组(参数表最大索引,非数组容量)有容量无元素基于元素确定容量 循环…...
11 vue3之插槽全家桶
插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。 匿名插槽 1.在子组…...
Excel 基础知识-操作手册1
Excel基础操作知识 一、工作窗口的视图控制 1、创建新窗口:依次点击【视图】----【新建窗口】命令,即可为当前工作簿创建新的窗口。在原有的工作簿中更改标题或表格内容时,新建的工作簿也会相应的更改。 2、窗口切换:在【视图】…...
Python 类的继承
Python 的代码组织如下: moudle:模块,和实例名和函数都是小写加下划线的方法表示。 class:类,使用首字母大写驼峰的写法表示。 类里面包含类的属性,__init__ ()方法和类的方法。 __init__() 方法在类的创建…...

gRPC介绍
gRPC 是一个由谷歌开发的现代开源高性能 RPC 远程过程调用( Remote Procedure Calls)框架,具备良好的兼容性,可在多个开发环境下运行。 相较于目前主流的 HTTP API 接口,gRPC 接口采用了领先的 HTTP/2 底层架构设计作…...

Git之误执行git rm -r解决方案(六十七)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
html文件指什么
HTML 文件指的是超文本标记语言文件(HTML,HyperText Markup Language),它是用于构建网页内容的文件格式。HTML 文件包含一系列的标签(tags),这些标签用于定义网页的结构和元素,例如文…...

AAAI2024--频谱在多模态表示和融合中的作用更为有效:A Multimodal Spectrum Rumor Detector
https://github.com/dm4m/FSRU 多模态内容,如将文本与图像混合,对社交媒体中的谣言检测提出了重大挑战。现有的多模态谣言检测侧重于在空间和序列位置之间混合令牌进行单模态表示,或者在模态间融合谣言真实性的线索。然而,它们受…...

【Python报错已解决】SyntaxError invalid syntax
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

CI/CD持续集成和持续部署以及相关软件的使用
目录 一:CI/CD是什么? 1.1 持续集成(Continuous Integration) 1.2 持续部署(Continuous Deployment) 1.3 持续交付(Continuous Delivery) CI/CD 的好处包括: 二:git…...
Charles mac电脑配置
安装 Charles: 如果你还没有安装 Charles,可以从官方网站下载安装包并按照提示完成安装。 启动 Charles: 安装完成后,启动 Charles 应用程序。 设置 Charles 代理: Charles 默认的代理端口是 8888。你可以通过以下步…...

FPGA基本结构和简单原理
前言: FPGA全程为(Field Programmable Gate Array)现场可编程逻辑阵列,以基本的逻辑为主可以实现大多数芯片可以实现的功能,比如说:ASIC芯片等,在半导体领域有着重要的作用。 本文…...

【machine learning-七-线性回归之成本函数】
监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b,使成本函数值最小化? 在线性回归中,我们说到评估模型训练中好坏的一个方法,是用成本函数来衡量,下面来详细介绍一下 成本函数…...

Stable Diffusion Fooocus批量绘图脚本
当当当挡~,流动传热数值计算之余发布点AIGC相关文章,希望大家能喜欢~ 1 Stable Diffusion各种UI分析对比 提示:此部分主要是对SD各种界面的简要介绍和对比,只关注Fooocus批量绘图的读者可直接跳到第二部分。 Stable Diffusion …...

Web 安全基础教程:从零基础入门到精通
一、Web 安全概述 (一)Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁,确保 Web 服务的保密性、完整性和可用性。在当今数字化时代,Web 应用广泛存在于各个领域,从电子商务到社交媒…...
ubuntu 20.04 ‘Wired Unmanaged‘ 网络无法配置解决方法
问题描述 系统:ubuntu20.04连上网线后右上角没有有线网络连接的图标,在网络配置界面也只有VPN和无线网络的配置;实际上此时电脑已经连接网络,通过DHCP获得IP地址可以正常访问网络。 解决办法 ubuntu有有两套网络管理软件:serve…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...