Linux系统移植——系统移植初步介绍(一)

news2024/11/25 0:21:09

一、嵌入式Linux系统软件组成及分布

1.1 内核(Kernel)

  • 功能:负责管理硬件资源、进程调度、内存管理、文件系统、网络等。
  • 分布:通常是定制的Linux内核,以适应特定的硬件平台和应用需求。

1.2 根文件系统(Root Filesystem)

  • 功能:包含操作系统启动后所需的所有文件,如系统库、配置文件、用户程序等。
  • 分布:可以是只读文件系统(如SquashFS)或可写的文件系统(如JFFS2、UBIFS等),通常根据存储介质的特性进行选择。

1.3 系统库(Libraries)

  • 功能:提供系统调用的接口和标准C库(如glibc、musl等),供应用程序使用。
  • 分布:一般位于根文件系统的/lib/usr/lib目录下。

1.4 应用程序(Applications)

  • 功能:实现具体的功能,如用户界面、网络服务、数据处理等。
  • 分布:根据功能的不同,应用程序通常分布在根文件系统的/bin/sbin/usr/bin等目录下。

1.5 驱动程序(Drivers)

  • 功能:负责与硬件设备进行交互,管理外部硬件(如传感器、显示器、网络接口等)。
  • 分布:驱动程序通常是内核的一部分,或作为模块加载,存放在/lib/modules目录下。

1.6 启动程序(Bootloader)

  • 功能:负责系统启动时加载内核并传递参数,常见的有U-Boot、Barebox等。
  • 分布:通常在系统的存储介质的引导区域。

1.7 配置文件(Configuration Files)

  • 功能:用来配置系统和应用程序的行为。
  • 分布:一般存放在/etc目录下。

1.8 中间件(Middleware)

  • 功能:提供应用程序与操作系统之间的接口,通常用于简化开发和提供特定的服务(如网络协议栈、数据库等)。
  • 分布:根据应用需求,可以位于根文件系统的不同目录。

1.9 开发工具(Development Tools)

  • 功能:用于开发和调试应用程序的工具,如编译器、调试器等。
  • 分布:通常在开发环境中,生产环境中可能不直接包含。

二、什么是系统移植?

移植就是将bootloader的源代码,inux内核源代码,文件系统中用户态程序代码根据硬件做少量修改使其能够在目标硬件平台上运行起来的过程 。

2.1 Bootloader的移植

  • 源代码调整:根据目标硬件平台的架构(如ARM、MIPS、x86等)和启动设备的特性(如串口、SD卡、NAND闪存等)修改Bootloader的源代码。
  • 配置:设置Bootloader的配置选项,如内存布局、启动参数等。
  • 编译:编译生成目标硬件平台可以识别的Bootloader二进制文件。

2.2 Linux内核的移植

  • 内核配置:使用make menuconfig或其他工具,选择目标硬件平台的架构和所需的驱动程序、功能等。
  • 驱动程序:根据硬件特性,添加或修改设备驱动程序,使之能够正确识别和控制硬件。
  • 内核补丁:可能需要对内核源代码做一些补丁,以适应特定功能或修复问题。
  • 编译:生成目标硬件平台适用的内核映像(通常是zImage或uImage)。

2.3 根文件系统的移植

  • 用户态程序:根据目标硬件平台的特性,编译或调整用户态应用程序,如库和工具。根据硬件支持和功能需求,可能需要替换或修改某些库。
  • 文件系统布局:设计和生成适合目标平台的文件系统,可能采用SquashFS、JFFS2等格式。
  • 配置文件:根据目标硬件的特性和需求,调整配置文件(如/etc/fstab/etc/inittab等)。

2.4 测试和调试

  • 启动测试:完成以上步骤后,使用Bootloader启动系统,观察内核是否能成功引导,以及根文件系统是否能正常挂载。
  • 调试:如果系统不能正常启动,可能需要通过串口输出、调试工具或日志查看系统状态,进行问题排查和修复。

三、Bootloader定义

3.1 Bootloader的作用

1. 初始化硬件:Bootloader负责对系统硬件进行初始化,包括CPU、内存、外设等。在Linux内核启动之前,Bootloader确保所有必要的硬件已准备就绪,以便内核可以正常运行。

2. 建立内存映射Bootloader创建内存空间映射,确保内核可以访问所需的内存区域。这对于嵌入式系统尤其重要,因为它们的内存布局通常是固定的,需要精确配置。

3. 加载内核映像:Bootloader将Linux内核从存储介质(如闪存、SD卡等)加载到系统内存中。它通常会选择合适的内核映像文件(如zImage或uImage)并将其加载到指定的内存地址。

4. 设置启动参数:Bootloader可以传递启动参数给Linux内核,这些参数可以控制内核的行为(如根文件系统的位置、调试级别等)。

5. 提供用户交互:在某些情况下,Bootloader提供一个交互界面,让用户选择不同的内核或操作系统版本。这在多系统或多版本的嵌入式环境中非常有用。

6. 故障恢复: 一些Bootloader具备故障恢复的能力,可以在系统启动失败时提供恢复选项,或从备份映像启动。

3.2 为什么嵌入式系统需要Bootloader

使得Linux内核可以在系统主存中跑起来, 系统必须符合Linux内核启动的必要条件。

1. 缺乏BIOS:嵌入式系统通常没有传统PC中的BIOS或类似固件。这意味着没有一个预先存在的程序来初始化硬件和启动操作系统,因此Bootloader承担了这个重要任务。

2. 硬件多样性:嵌入式系统硬件的种类繁多,Bootloader可以针对特定硬件进行优化和定制,以确保不同平台上内核的顺利启动。

3. 简化启动过程:Bootloader通过将复杂的硬件初始化和内核加载过程封装为简单的步骤,简化了整个启动过程,使得开发者可以更专注于应用程序开发。

4. 灵活性和可扩展性:Bootloader的存在使得嵌入式系统更加灵活和可扩展。开发者可以在Bootloader中添加新的功能或支持新的硬件,而无需对内核做太多修改。

Bootloader在嵌入式Linux系统中不可或缺,承担着初始化硬件、加载内核、设置环境和提供用户交互等关键任务。它使得整个系统能够顺利地启动和运行,为开发者提供了更大的灵活性和可调试性。

3.3 非操作系统内核的特性

1.独立性Bootloader本身并不属于操作系统内核的一部分,它在操作系统加载之前运行,负责初始化硬件和准备环境。

2.汇编语言大多数Bootloader都是用汇编语言或C语言编写,因为它们需要直接与硬件交互以及进行底层操作,而汇编语言能够提供对硬件的精细控制。

3.4 针对不同CPU体系结构的不可移植性

1. CPU依赖性:由于Bootloader需要直接操作CPU硬件(如寄存器、内存管理等),因此它们的实现是高度依赖于特定CPU架构的。不同的CPU体系结构(如ARM、MIPS、x86)有不同的指令集和硬件特性,这使得Bootloader的代码不具备可移植性。

2. 定制化:在移植操作系统时,Bootloader的代码通常需要根据目标硬件的CPU体系结构进行相应的修改和重新编写,以满足特定硬件的要求。

3.5 依赖于嵌入式系统的板级配置

1. 硬件特性Bootloader不仅需要对CPU进行初始化,还需要根据嵌入式系统的特定硬件配置(如内存布局、外设接口、存储介质等)进行相应的调整。这使得Bootloader必须针对特定的硬件平台进行定制。

2. 外设支持:不同的嵌入式系统可能配备不同的外设(如网络接口、串口、存储设备等),Bootloader需要能够识别并正确配置这些外设,以确保系统能够正常启动。

3.6 移植过程中的注意事项

1. 修改与测试:在移植Bootloader时,开发者需要仔细分析目标硬件的手册和数据表,确保所有硬件特性都能够被正确地初始化和配置。此过程通常需要反复测试和调试,以确保Bootloader能够正常工作。

2. 参考已有的实现:为了加快Bootloader的移植过程,开发者通常会参考已有的Bootloader实现(如U-Boot、Barebox等),并根据需求进行修改。

四、Linux内核功能及本质

4.1 功能:

4.1.1 进程管理

(1)进程的创建与终止:

Linux内核使用fork()系统调用创建新进程,exec()系统调用则用于加载新程序。在进程完成任务后,内核通过exit()终止进程。

(2)进程调度:

内核通过调度算法(如完全公平调度(CFS))来管理进程的执行顺序,确保多任务处理的高效性。调度器会根据优先级、时间片等策略决定哪个进程获得CPU的控制权。

(3)进程状态管理:

每个进程在运行时有不同的状态(如运行、就绪、阻塞)。内核负责管理这些状态,确保在适当时机切换进程。

(4)进程间通信(IPC):

Linux提供多种机制(如管道、消息队列、共享内存、信号量等)来实现进程之间的数据交换和同步。

4.1.2 文件系统

(1)文件管理:

Linux内核支持多种文件系统(如ext4、XFS、Btrfs等),负责文件的创建、删除、读取和写入操作。

(2)目录结构:

内核维护文件系统的目录结构,以树形方式组织文件和文件夹,支持层次化管理。

(3)权限与安全:

内核通过用户、组、其他的权限位(读、写、执行)来控制对文件和目录的访问,确保文件安全。

(4)挂载与卸载:

内核支持动态挂载和卸载文件系统,使得用户可以在运行时添加新的存储设备或文件系统。

4.1.3 内存管理

(1)内存分配与回收:

内核负责动态分配和回收内存,使用页(page)作为管理单位。它实现了伙伴系统和slab分配器,以提高内存分配的效率。

(2)虚拟内存:

Linux使用虚拟内存机制,为每个进程提供独立的地址空间,允许多个进程共享物理内存而不相互干扰。

(3)页面替换算法:

当物理内存不足时,内核使用页面替换算法(如LRU)将不活跃的页面交换到磁盘上,从而腾出内存给活跃进程。

(4). 内存映射:

 内核支持将文件或设备直接映射到进程的地址空间,通过mmap()系统调用提供更高效的文件访问。

4.1.4 设备管理

(1)设备驱动程序:

Linux内核通过设备驱动程序与硬件设备进行交互。每种设备(如硬盘、打印机、网络卡)都有对应的驱动程序,提供统一接口。

(2)设备文件:

内核在`/dev`目录下创建设备文件,使得用户空间程序可以通过标准文件操作接口访问硬件设备。

(3)中断处理:

内核通过中断处理机制响应硬件事件(如按键按下、数据接收等),确保及时处理来自设备的信号。

(4)I/O调度:

内核通过I/O调度算法(如CFQ)优化设备的输入输出操作,管理多个进程对设备的访问请求,确保高效利用存储和外设。

4.1.5 网络协议

(1)网络协议栈:

Linux内核实现了完整的网络协议栈,支持多种网络协议,如TCP/IP、UDP、ICMP等。它负责数据的封装、解封装和路由。

(2)网络设备管理:

内核管理网络接口和设备,处理数据包的接收和发送,支持多种网络接口(如以太网、Wi-Fi等)。

(3)套接字接口:

内核提供套接字(socket)接口,使得应用程序可以通过标准API进行网络通信。套接字允许不同主机间进行数据交换。

(4)防火墙与安全:

Linux内核支持防火墙功能(如Netfilter),允许用户设置规则,控制网络流量的进出,提高系统安全性。

Linux内核在进程管理、文件系统、内存管理、设备管理和网络协议等方面发挥着关键作用,确保系统高效、稳定地运行。每个功能模块相互协作,共同构成了一个完整的操作系统环境。

4.2 内核本质

1. 从C语言角度来看内核Linux内核主要是用C语言编写的,其中包含了大量的函数。这些函数负责各种操作,包括进程管理、内存管理、文件系统、网络协议等。内核将这些函数组织成模块化的结构,使得功能实现更加清晰和可维护。

2. 从硬件角度来看内核Linux内核充当硬件资源的管理者,负责对CPU、内存、存储设备、网络接口等硬件资源的调度和分配。它通过设备驱动程序与具体硬件交互,处理硬件的输入/输出操作。

3.从应用程序的角度来看内核Linux内核是应用程序的服务提供者,通过系统调用和API为应用程序提供基本服务,如文件操作、进程控制、网络通信等。

五、三者区别:

5.1 Bootloader

1. 硬件上电后跳到一个固定位置执行相应的代码:当计算机上电后,处理器会执行特定的启动序列,通常跳转到固件(如BIOS或UEFI)中固定的地址,以执行初始化流程。

2. 初始化相应的硬件设备:Bootloader会进行最基本的硬件初始化,包括内存检测、CPU配置、外围设备(如硬盘、USB)的识别等。

3. 加载操作系统内核代码到内存: Bootloader会从存储介质(如硬盘、闪存)中读取操作系统内核镜像(通常是一个压缩文件),并将其解压缩到内存中的一个特定地址。

4. 跳到内核代码起始位置执行:一旦内核被加载到内存中,Bootloader会将控制权转交给内核,通常通过跳转到内核代码的起始地址来实现。这标志着操作系统的真正启动。

5.2 Kernel

1. 内核自解压 (uImage):内核镜像(如uImage)通常是经过压缩的,内核在启动时会自我解压,以便在内存中运行。

2. 初始化相应的硬件设备:内核会识别并初始化所有的硬件设备,包括CPU、内存、各类总线和外设。内核中的设备驱动程序在此时被加载并初始化。

3. 初始化静态编译进内核的驱动模块:如果内核静态编译了某些驱动程序,这些驱动会在内核启动时自动加载。它们负责管理相应的硬件设备。

4. 挂载根文件系统:内核需要找到并挂载根文件系统(root filesystem),这是操作系统文件结构的基础。根文件系统通常在硬盘或其他存储设备上。

5. 直接执行第一个用户空间程序:一旦根文件系统挂载成功,内核会找到第一个用户空间程序(通常是`init`或`systemd`),并将控制权转给它。这是用户空间中的第一个进程。

5.3 第一个用户空间程序

1. 配置用户环境:第一个用户空间程序负责设置用户环境,包括设置必要的环境变量、用户权限等。

2. 执行服务进程:该程序通常会启动一系列服务和守护进程,负责管理系统的各种功能(如网络服务、文件服务、设备管理等)。它确保系统能够正常运行,并为用户提供服务。

整个启动过程从Bootloader到Kernel,再到第一个用户空间程序,构成了计算机系统启动的完整流程。Bootloader负责将内核加载到内存并启动,而内核则初始化硬件、挂载文件系统并启动用户空间进程。这个过程确保了操作系统能够在硬件上正常运行,并提供各种服务给用户和应用程序。

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

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

相关文章

sql实验代码整理:创建表文件Student、Course、Sc完成下列问题

使用SQL语句创建数据库students. create database students; 创建表文件Student、Course、Sc,表结构如表3-7~表3-9所示。 代码及运行结果: 代码及运行结果: 代码及运行结果: 为表Student 添加地址列Address,数据类型为…

14.3 Matplotlib与Seaborn数据可视化

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

汽车保养系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,门店信息管理,员工信息管理,配件信息管理,保养信息管理,管理员管理,系统管理 微信端账号功能包括:系统首页…

k8s部署ingress-nginx

一、拉取ingress-nginx的安装代码 地址:https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml 如果上面的地址访问不通的话,可以直接使用下面的内容: 由于官方镜像存放…

Keepalived详解

目录 1、高可用集群keepalived 高可用集群 VRRP 相关概念 keepalived 简介 2、基础实验环境搭建 3、keepalived的虚拟路由管理 全局配置 ​编辑 配置虚拟路由器 4、虚拟路由的通讯设置 5、keepalived的日志分离 6、实现独立子配置文件 7、keepalived的抢占模式和非抢占…

ubuntu 20 安装mysql workbench 过程

ubuntu 20 安装mysql workbench 过程_ubuntu 安装mysql workbench-CSDN博客 How To Install And Use MySQL Workbench On Ubuntu 18.04 or 20.04 MySQL :: Begin Your Download sudo apt install ./mysql-apt-config_0.8.32-1_all.deb snap install mysql-workbench-communi…

【鸿蒙学习】HarmonyOS应用开发者基础 - 从简单的页面开始

学完时间:2024年8月13日 我的纸飞机呀!飞呀飞!飞到了代码中!!! 一、前言叨叨 今天是HarmonyOS学习教学课第一课的第五课内容了,课后练习的人数已经降到了4150人了,预测下到 ”Harmon…

Win10 去掉桌面右上角 了解有关此图片的信息

1. 进入注册表 Win R运行regedit 2. 找到以下路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel 3. 新建 DWORD(32位)值(D) 右击 NewStartPanel新建 DWORD…

前端技术day01-HTML入门

一、前端介绍 技术描述HTML用于构建网站的基础结构的CSS用于美化页面的,作用和化妆或者整容作用一样JS实现网页和用户的交互Vue主要用于将数据填充到html页面上的Element主要提供了一些非常美观的组件 二、工具软件 VsCode 在前端领域,有一个公认好用…

C语言问答进阶--6、函数(1)

A:现在我们将研究函数这个概念。 其实这个概念很简单,和中学的时候学的yf(x)来对照着看,对于一个参数x,会得到一个值y,就会发现它和C中的函数是一个道理。 只是C函数中可以包含不传入任何参数的函数。 A:函…

自学嵌入式第十九天高级编程篇 文件2

标准IO的返回值判断 feof:判断文件流指针是否到达结尾。 feof(src) //如果文件流指针到达末尾,函数返回值为真 ferror:判断文件流指针是否出错。搭配clearerr使用可以跳过报错的地方,读取后面的数据 ferror(src) //如…

短视频SDK解决方案,良好的二次开发可扩展性

短视频已成为当代社交与内容消费的重要载体,其影响力与日俱增,面对这一蓬勃发展的市场,如何高效、创新地打造短视频应用,成为众多开发者和企业的核心关切。在此背景下,美摄科技凭借其深厚的技术积累与前瞻性的市场洞察…

奇异值分解(SVD)

1 奇异值分解(SVD)简介 Beltrami 和 Jordan 被认为是奇异值分解(Singular Value Decomposition,SVD)的共同开创者,二人于19世纪70年代相继提出了相关理论。奇异值分解主要解决的问题是数据降维。在高维度的数据中,数据…

什么是流批一体?怎样理解流批一体?

目录 一、流式处理与批量处理概述 1.流式处理 2.批量处理 3.流批一体的定义 二、流批一体的关键特点 三、流批一体的技术实现 四、应用场景 五、实施流批一体的考虑因素 流批一体听起来很简单,但内涵却十分复杂。它包含了计算语义、编程模型、API、调度、执行、shuf…

Halcon玩转机器视觉专栏特殊声明

欢迎来到 PaQiuQiu 的空间 本文为【Halcon玩转机器视觉专栏特殊声明】,方便大家更合理的订阅! 📢 ~特殊声明~ 鉴于很多童鞋在订阅专栏过程中,对于专栏中涉及到的资料(比如中文学习手册)和源码(C#联合Halco…

背包九讲(动态规划)

文章目录 01背包问题题目描述解题思路:上代码:思路2:二维代码:优化代码: 完全背包问题题目描述:解题思路:二维代码:优化代码: 多重背包问题题目描述:解题思路…

有趣的rce漏洞复现分析(1)

目录 eval长度限制突破 第一种方法 第二种方法 无字母数字webshell之命令执行 php7 php5 eval长度限制突破 php eval函数参数限制在16个字符的情况下,如何拿到webshell呢 首先,我们还是先把环境搭好(此次的所有漏洞环境我都部署在Ubu…

MySQL的索引事务和JDBC编程

目录 索引 查看索引 创建索引 删除索引 底层数据结构(这个很重要哦,面试容易问) 事务 事务的使用 事务的基本特性 并发执行事务可能产生的问题 MySQL提供的四种事务隔离级别 JDBC编程 JDBC的来源(一定要了解&#xff…

[WUSTCTF2020]颜值成绩查询

打开题目 输入1 输出 输入1会提示学号不存在 输入1/**/or/**/11#,过滤了空格。 1/**/order/**/by/**/3# 存在 1/**/order/**/by/**/4# 不存在 绕过 爆破表名 -1/**/Union/**/Select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/tabl…

8.1.数据库基础技术-数据库基本概念

数据库基本概念 数据库系统概述三级模式两级映射概念模式内模式外模式三级模式两级映像练习题 数据库设计练习题 数据库系统概述 数据:是数据库中存储的基本对象,是描述事物的符号记录。 数据的分类:文本、图形、图像、音频、视频。 数据库…