嵌入式底层系统了解

当裸机功能不复杂的时候,即类似与点亮一个LED灯,驱动LCD和OLED这样的模块,以及各位大学生的搭积木式的毕业设计(狗头保命),此时可以简单地分为硬件和软件层(应用层),以及以中间层作为中间联系。

当需要实现更复杂的功能式,操作系统(OS)就显得非常必要了 。

没有操作系统:

  1. 功能有限:通常只能执行特定的、单一的任务,无法同时运行多个程序。例如,一个简单的单片机系统可能只用于控制一个特定的设备,如电子钟。
  2. 资源利用效率低:对硬件资源的管理较为简单粗糙,可能导致资源浪费或冲突。没有有效的内存管理机制,可能会出现内存泄漏等问题。
  3. 用户交互性差:缺乏友好的用户交互方式,操作相对复杂和困难。可能需要通过复杂的硬件开关或特定的编程指令来控制。
  4. 软件开发困难:没有统一的开发标准和接口,软件开发需要针对特定的硬件进行,难度较大。每次开发新的功能都需要从底层开始考虑硬件特性。
  5. 安全性和稳定性差:难以保障系统的安全性和稳定性,容易受到外部干扰和错误的影响。缺乏对病毒、恶意软件的防护机制。

有操作系统:

  1. 资源管理:能够有效地管理计算机的硬件资源,如内存、CPU 时间、磁盘空间、输入输出设备等,使得多个程序可以同时运行而不会相互干扰,资源分配更加合理和高效。例如,在多任务操作系统中,可以同时运行多个应用程序,如一边播放音乐一边编辑文档。
  2. 用户接口:提供了友好的用户界面,包括图形用户界面(GUI)和命令行界面(CLI),使用户能够方便地与计算机进行交互。像 Windows 和 macOS 这样的操作系统具有直观的图形界面,用户可以通过点击图标和菜单来执行操作。
  3. 软件支持:为各种应用软件提供了统一的运行环境和接口标准,使得软件的开发和安装更加便捷。大多数软件都是针对特定操作系统进行开发和优化的,如 Windows 上的 Office 套件。
  4. 安全性和稳定性:具备一定的安全机制来保护系统和用户数据,同时能够处理错误和异常情况,提高系统的稳定性。操作系统可以进行用户认证、权限管理,并自动处理一些软件崩溃的情况。
  5. 网络支持:集成了网络功能,方便计算机之间的通信和资源共享。可以轻松地连接到网络,进行文件共享、远程访问等操作。

步骤:

在 Linux 系统移植过程中,交叉编译环境是指在一个平台(通常是主机,如 x86 架构的 PC)上生成能够在另一个不同架构的平台(目标平台,如 ARM、MIPS 等)上运行的代码的编译环境。

交叉编译环境主要由以下几个部分组成:

  1. 交叉编译器:这是交叉编译环境的核心组件。它能够将针对一种架构编写的源代码编译为另一种架构的可执行代码。例如,将在 x86 架构上编写的 C 或 C++ 代码编译为 ARM 架构可执行的二进制文件。
  2. 相关的库和头文件:目标平台所需的各种库文件和头文件,以便在编译过程中正确链接和引用。
  3. 工具链:除了编译器,还可能包括链接器、汇编器、调试器等一系列工具,共同构成完整的工具链,支持整个编译、链接和调试过程。

使用交叉编译环境的主要原因是目标平台的资源有限(如计算能力、存储等),或者目标平台可能还不具备完整的开发环境,无法直接在上面进行编译。

例如,如果要将 Linux 系统移植到一个基于 ARM 架构的嵌入式设备上,就需要在 x86 架构的 PC 上建立一个交叉编译环境,将 Linux 内核及相关应用程序编译为适合 ARM 架构运行的代码。

在实际操作中,搭建交叉编译环境可能需要下载和安装特定的工具包,并进行一些配置,以确保编译器和工具链能够正确地针对目标平台进行工作。

bootloader的选择和移植:

  • 初始化硬件:Bootloader 是在操作系统内核运行之前运行的一段小程序,可以初始化硬件设备,为内核的运行准备好软硬件环境。
  • 建立内存空间映射图:Bootloader 可以建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。内存空间映射图是一种描述内存物理地址与逻辑地址之间对应关系的图表或数据结构。通过建立这个映射图,Bootloader 能够清晰地了解系统内存的布局和可用空间情况。 Bootloader 可以根据硬件的特性和需求,对内存进行初始化和配置,例如设置内存的读写权限、缓存策略等,从而为后续操作系统内核的运行提供一个稳定和可靠的内存环境。
  • 加载内核:Bootloader 可以将内核加载到内存 RAM 中去运行,没有 Bootloader,系统无法运行。
  • 支持多种处理器架构:不同的处理器架构需要不同的 Bootloader,选择和移植适合目标平台的 Bootloader 可以确保系统能够正常启动和运行。
  • 提供调试接口:Bootloader 通常提供一些调试接口,方便开发人员进行调试和测试。例如单片机学习中熟悉的串口、JTAG,还有网络接口(TCP/IP)等。

Kernel:

配置(Configuration)
这一步是根据目标硬件平台的特性和需求,对 Linux 内核进行定制化设置。例如,选择支持的硬件设备驱动、文件系统类型、内核模块、网络协议等。配置过程通常通过修改内核的配置文件(如 .config)或使用图形化的配置工具来完成。

编译(Compilation)
在完成配置后,使用相应的交叉编译工具链将内核源代码编译成可在目标平台上运行的二进制文件。编译过程会将选择的内核模块和功能编译到最终的内核映像中。

移植(Porting)
将编译生成的内核映像和相关的模块文件部署到目标硬件平台上。这可能涉及将内核映像烧录到存储设备(如闪存)中,或者通过其他方式加载到目标系统的内存中。

调试(Debugging)
在移植后,对内核在目标平台上的运行情况进行监测和调试,以确保其正常工作。调试可能包括查看内核的启动日志、处理内核崩溃或异常、优化性能、解决设备驱动的兼容性问题等。可以使用调试工具(如 JTAG 调试器、串口输出等)来获取调试信息。

例如,假设要将 Linux 内核移植到一个基于特定型号 ARM 处理器的开发板上。首先,根据开发板的硬件配置,如处理器型号、内存大小、存储设备、网络芯片等,进行内核配置,选择对应的驱动和功能。然后,使用针对 ARM 架构的交叉编译工具链进行编译。接着,将生成的内核映像通过烧写工具烧录到开发板的闪存中。最后,在开发板上电启动后,通过串口查看内核的启动信息,检查是否能正确识别硬件设备,处理可能出现的错误,如驱动加载失败、内存分配异常等,以完成整个调试过程。

根文件系统的制作:

在 Linux 移植中,根文件系统的制作指的是创建一个包含了 Linux 系统启动和运行所需的基本文件和目录结构的文件系统。

根文件系统是 Linux 系统的基础,它包含了系统启动时必需的文件和目录,例如:

  1. 基本的命令和工具,如 bash 外壳程序、lscat 等命令。
  2. 系统配置文件,如 /etc/passwd(用户信息)、/etc/fstab(文件系统挂载配置)等。
  3. 设备文件,例如 /dev 目录下的各种设备节点。
  4. 初始化脚本和服务配置文件,用于系统启动时的初始化和服务管理。
  5. 库文件,为应用程序提供必要的函数库支持。

制作根文件系统通常包括以下步骤:

  1. 选择一个基础的文件系统格式,如 ext4jffs2 等。
  2. 创建必要的目录结构,如 /bin/etc/dev/lib 等。
  3. 移植或安装所需的命令和工具。
  4. 配置系统的初始化脚本,如 init 或 systemd 的相关配置。
  5. 可能需要根据目标硬件和应用需求,添加特定的驱动模块或配置文件。

例如,如果要将 Linux 移植到一个嵌入式设备上,可能会制作一个精简的根文件系统,只包含该设备运行所需的最基本的命令和配置,以节省存储空间和提高系统启动速度。

一种电子产品的不同型号可能就需要不同大小的系统,这也是这一行的需求所在。

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

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

相关文章

深入Kafka:如何保证数据一致性与可靠性?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello, 大家好!我是小米,今天我们来聊一聊Kafka的一致性问题。Kafka作为一个高性能的分布式流处理平台,一直以来都备受关注。今天,我将深入探讨Kaf…

C++(第四天----拷贝函数、类的组合、类的继承)

一、拷贝构造函数(复制构造函数) 1、概念 拷贝构造函数,它只有一个参数,参数类型是本类的引用。如果类的设计者不写拷贝构造函数,编译器就会自动生成拷贝构造函数。大多数情况下,其作用是实现从源对象到目…

Python获取QQ音乐歌单歌曲

准备工作 歌单分享的url地址 比如: https://i.y.qq.com/n2/m/share/details/taoge.html?hosteuin=oKvzoK4l7evk7n**&id=9102222552&appversion=130605&ADTAG=wxfshare&appshare=iphone_wx 代码实现 def mu(share_url):share_url = share_url.split(id=)[1…

目标检测入门:3.目标检测损失函数(IOU、GIOU、GIOU)

目录 一、IOU 二、GIOU 三、DIOU 四、DIOU_Loss实战 在前面两章里面训练模型时,损失函数都是选择L1Loss(平均绝对值误差(MAE))损失函数,L1Loss损失函数公式如下: 由公式可知,L1Loss损失函数…

为PPT加密:如何设置和管理“打开密码”?

在保护演示文稿的内容时,给PPT文件设置“打开密码”是一个简单而有效的方法。今天一起来看看如何设置和管理PPT文件的“打开密码”吧! 一、设置PPT“打开密码” 首先,打开需要加密的PPT文件,点击左上角的“文件”选项卡&#x…

oracle如何判定数据库的时区并进行时间的时区转换

在Oracle数据库中,判断和设置时区以及进行时区的转换是很重要的功能。以下是一些基本的步骤和方法: 1. 判定数据库的时区 要查看Oracle数据库的时区,你可以查询DBTIMEZONE。例如: sql SELECT DBTIMEZONE FROM DUAL; 这将返回…

大数据------JavaWeb------JSP(完整知识点汇总)

JSP 定义 JSP(Java Server Pages),即Java服务端页面。它是一种动态的网页技术,其中可以定义HTML、CSS、JS等静态内容,还可以定义Java代码的动态内容JSP HTML Java 说白了JSP就是一个页面,它既可以写HTML标…

iOS App 测试环境升级,遇到的问题以及解决方法

iOS App 测试环境升级,遇到的问题以及解决方法 Mac 实体机升级到 Sonima 14.5 Xcode 升级到 15.3 问题1: Xcode 编译 WebDriverAgent 失败 尝试下载 最新版本的WDA 源码编译,可以编译成功。 问题2:具体坐标直接点击的代码都会报错…

Meta自动化脚本机器人:构建高效社交平台工具

社交平台的自动化工具可以极大提升运营效率,本文将指导您如何构建一个Meta自动化脚本机器人,实现消息自动回复、内容定时发布等功能。 引言 Meta平台拥有庞大的用户群体,自动化脚本机器人可以帮助管理员高效管理社群、自动化日常任务。本教…

C#面:String str=new String(“a“)和String str = “a“有什么区别

String str new String(“a”)和String str “a”的区别在于对象的创建方式和内存分配方式。 字符串 str new String(“a”): 使用new关键字显式地创建了一个新的String对象。 每次执行这行代码时,都会…

uniapp中 uni.previewImage用法

查看多张照片,图片地址用逗号分隔 showimig(item) {if (item.trainingRoom) {const urls item.trainingRoom.split(,);uni.previewImage({urls: urls,current: ,success: function(res) {// 成功的回调},fail: function(res) {// 失败的回调},complete: function(…

Linux常用命令sed -i 文本替换(常应用:修改linux<华为openEuler>repo源)

目录 sed -i应用场景sed -i命令详解 sed -i应用场景 修改Linux系统软件源(以openEuler为例) sed -i s|http://repo.openeuler.org/|https://mirrors.huaweicloud.com/openeuler/|g /etc/yum.repos.d/openEuler.repo默认情况下,sed 使用斜杠&…

亮相2024世界人工智能大会,扫描全能王AIGC“黑科技”助力敦煌遗书数字化修复

7月4日,2024年世界人工智能大会(简称“大会”)在上海举行。这次这场科技与创新的盛会上,一张古朴、典雅的卷轴吸引了众人的目光。这张被修复的卷轴脱胎于敦煌遗书系列古籍,在被机器拍摄扫描后,卷轴上脏污、…

通过ip获取用户位置信息以及地区时间

项目需要获取用户得位置信息以及地区时间,因为第一次搞,以防还有下次,特此记录 1.首先就是显得拿到用户得ip地址 先上代码: public boolean checkIp(String ip) {return null ip || ip.isEmpty() || "unknown".equa…

Leetcode 90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 示例 1: 输入:nums [1,2,2] 输出:[[],[1],[1,2],[…

0060__创建命名共享内存

创建命名共享内存 - Win32 apps | Microsoft Learn

【Linux】性能分析器 perf 详解(三):kmem、mem

上一篇:【Linux】性能分析器 perf 详解(二) 1、perf kmem 1.1 简介 kmem 用于跟踪/测量内核内存属性的工具,如分配、释放、碎片率等。可以帮助开发者和系统管理员理解内核内存的分配和释放模式,从而诊断内存泄漏、过度分配等问题。 功能: 跟踪内存分配和释放:监控内…

新手教学系列——【Ubuntu】SSH配置详解

在使用Ubuntu进行远程管理和开发时,SSH(Secure Shell)是必不可少的工具。SSH不仅提供安全的远程登录功能,还支持安全的文件传输和端口转发。然而,有时我们可能会遇到SSH连接中断的问题。本文将详细介绍如何配置SSH以提高其稳定性,并解释关键配置项。 为什么会出现SSH连接…

实验二 图像的代数运算

一、实验目的: 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 二、实验内容: 1.图像的加法运算 图像相加一般用于对同一场景的多幅图像求平均效果&…

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中,软件通常要设置只允许存在一个进程,像一些熟知的音乐软件,QQ音乐这种。而这些软件在限制只有一个进程的同时,通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…