嵌入式八股大纲介绍

alt

【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM

【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym

【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM

【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0

特点:

  • 八股:整理上千份嵌入式面试问题,完全面向面试,不该学的没有。
  • 整理:按知识点分类和先后逻辑关系整理,方便学习和记忆。
  • 重点:一般题目(蓝色)次重点(橙色)重点题目(红色)。
  • 联系:注明各部分知识点的联系,学的时候一起学更好。
  • 推荐:较难知识点有推荐学习的博客和视频。

〇.简历/面试

alt

一.语言篇

alt

01.汇编

汇编主要了解一些指令

汇编语言是一种低级的计算机语言,它与计算机硬件直接相关,包括机器指令和指令集架构。汇编语言通过使用助记符和符号代替二进制代码来编写,使程序员能够更容易地理解和编写代码。

在计算机发展的早期,汇编语言是编写软件程序的主要方式。虽然现代编程语言已经取代了汇编语言的地位,但在某些特定的应用场景下,如嵌入式系统开发、驱动程序开发、操作系统内核开发等,汇编语言仍然有其重要的地位。

汇编语言是一种面向机器的语言,因此需要对底层计算机硬件的结构和工作原理有深刻的理解。在编写汇编代码时,程序员需要直接操作计算机寄存器、内存地址和其他底层硬件组件,因此需要具备较高的技能水平和经验。

汇编语言的编程难度较大,代码可读性较差,但它具有执行效率高和可控性强等优点。对于需要高效运行和对底层硬件进行直接控制的应用程序,汇编语言仍然是一种重要的编程工具。

02.C/C++

C和C++整理在一起了,主要整理以下几点:

  • 关键字、基本函数、预处理

关键字有static、extern、const、volatile、sizeof和strlen、struct和union、typedef和#define、auto、register、attribute、inline、final和override、mutable和explicit的相关问题

基本函数有strcpy、strncpy、sprintf与memcpy、memmove、strlen(), strstr(), strcat(), strcmp()的相关问题

预处理有头文件宏定义等问题

  • 内存分配

C内存分配/堆栈、内存泄漏、C++内存管理、大小端、越界、字节对齐

  • 指针

指针类型转换、指针的指针、指针与常量、指针与数组、指针与函数、结构体指针、其他(指针和引用、野指针、智能指针)

  • C++

相关基础、函数(函数默认参数、函数重载)、类和封装(封装、对象的初始化和清理、对象模型和this指针、友元、运算符重载)继承、多态、模板、STL、面向对象、C++11新标准

  • 其他

选填、代码分析等

C和C++是两种广泛使用的计算机编程语言。它们都是面向过程和面向对象的编程语言,用于编写系统软件、应用程序、驱动程序等。

C语言是由贝尔实验室的Dennis Ritchie在1972年至1973年间设计开发的。它具有简单、高效、跨平台等特点,被广泛应用于系统软件、操作系统、编译器、嵌入式系统、游戏开发等领域。C语言的语法简单、控制结构灵活、运算符丰富,它不提供面向对象编程的支持,但可以使用结构体和指针等特性来实现数据抽象和封装。

C++语言是在C语言的基础上发展而来的。它由Bjarne Stroustrup于1980年代开发,旨在扩展C语言的特性并添加面向对象编程的支持。C++语言是一种多范式编程语言,支持面向对象、泛型编程和过程式编程。C++语言提供了类、继承、多态等特性,使得代码可重用性更高、可维护性更好、开发效率更高。C++语言被广泛应用于游戏开发、图形图像处理、科学计算等领域。

总的来说,C语言和C++语言都是强大而广泛使用的编程语言。C语言适用于需要高效的、底层的编程任务,而C++语言适用于需要面向对象编程和模板元编程的任务。两种语言都有各自的优点和缺点,开发人员可以根据具体需求选择适合的语言。

03.Python

Python是一种高级编程语言,由Guido van Rossum于1991年开发。Python是一种解释型语言,它具有简单、易学、易用等特点,被广泛应用于Web开发、数据科学、人工智能、机器学习、科学计算等领域。

Python具有丰富的标准库和第三方库,使得开发人员可以更快速、更高效地开发应用程序。Python的语法简洁,支持面向对象编程、函数式编程等多种编程范式。Python语言还有许多流行的框架和工具,如Django、Flask、Pytorch、Tensorflow等。

Python的语法结构简单易读,适合初学者学习。在编写Python代码时,无需担心内存管理、类型声明等问题,使得开发人员可以更专注于业务逻辑的实现。同时,Python也是一种跨平台的语言,可以运行在多种操作系统上。

总的来说,Python是一种流行且实用的编程语言,它可以帮助开发人员快速开发高质量的应用程序。它的简洁性、易读性和灵活性使得它成为学习编程的良好入门语言,同时也是许多大型项目和数据科学项目的首选语言。

04.版本控制工具

主要是SVN和Git

Git和SVN是两种常见的版本控制工具,它们都可以帮助团队协作开发软件项目。

Git是由Linus Torvalds于2005年开发的分布式版本控制系统。Git的主要特点是速度快、极端分支策略、有强大的命令行界面和大量的第三方工具支持。Git将版本库存储在本地,每个人都可以在自己的计算机上进行开发,并在需要时将其推送到中央存储库(例如GitHub、GitLab、Bitbucket等)。Git支持多个分支同时进行开发,可以合并多个分支的修改,非常适合大型项目和团队协作开发。

SVN是Subversion的缩写,是一种集中式的版本控制系统,由Apache软件基金会开发。与Git不同,SVN的版本库是集中存储在中央服务器上的,开发人员需要从服务器上获取最新代码并将其修改后提交到服务器上。SVN支持锁定机制,即开发人员在修改文件之前必须先锁定文件,以确保文件的一致性。SVN支持基于路径的访问控制和单个文件的版本控制,但对于大型项目和并行开发的场景可能不太适合。

总的来说,Git和SVN都是可靠的版本控制工具,它们各有优点和缺点。Git适合大型项目和分布式团队,支持分支策略和快速版本控制,SVN适合小型项目和集中式团队,支持路径和文件的访问控制。开发人员应该根据具体项目和团队的需求来选择适合的版本控制工具。

二.计算机基础篇

alt

01.计算机组成原理

计算机组成原理是研究计算机硬件组成及其工作原理的学科。它包括计算机的各个硬件部件如CPU、存储器、输入输出设备、总线等的功能、结构、组成、工作原理、互连方式以及它们之间的相互作用等方面的内容。

计算机组成原理主要包括以下内容:

1.计算机系统结构:包括计算机的层次结构、指令系统、总线结构、存储器层次结构等。

2.数据表示与运算:研究计算机中数据的表示方式,包括二进制、十进制、八进制和十六进制等。还研究数据在计算机中的运算方式,如加、减、乘、除等算法和实现方法。

3.计算机硬件系统:包括CPU、存储器、输入输出设备、总线等硬件部件的组成和功能。

4.指令执行过程:研究CPU执行指令的过程,包括指令译码、指令执行、数据传输等环节。

5.存储器管理:研究存储器的组成、分类、层次结构和管理方式。

6.输入输出系统:研究计算机输入输出设备的种类、接口、控制方式和I/O软件系统。

计算机组成原理是计算机科学的基础学科之一,对于了解计算机硬件结构、理解计算机的工作原理和优化计算机程序都有着重要的意义。

02.操作系统

操作系统是计算机系统中最重要的软件之一,它是管理和协调计算机硬件和软件资源的核心程序。操作系统的主要功能包括资源管理、进程管理、文件系统、网络通信等方面。

操作系统的主要功能包括:

1.进程管理:操作系统可以管理计算机上运行的多个进程,分配CPU时间片,控制进程的运行状态、进程间的通信等。

2.内存管理:操作系统可以管理计算机中的内存,包括内存的分配、释放、保护、虚拟内存管理等。

3.文件系统:操作系统可以管理计算机上的文件和目录,包括文件的存储、管理和保护,提供文件访问控制和共享功能等。

4.设备管理:操作系统可以管理计算机上的各种设备,包括输入输出设备、磁盘、网络接口等,提供设备驱动程序和设备控制功能。

5.用户接口:操作系统提供用户与计算机系统进行交互的接口,包括命令行界面、图形界面、网络接口等。

操作系统的发展历程可以分为以下几个阶段:

1.批处理系统阶段:早期的操作系统主要是用于管理大型计算机上的批处理作业。

2.分时系统阶段:随着计算机性能的提高,出现了分时系统,使得多个用户可以同时使用一台计算机。

3.个人计算机时代:随着计算机技术的发展和普及,出现了个人计算机操作系统,如Windows、MacOS、Linux等。

4.移动计算时代:随着移动计算技术的发展,出现了各种移动操作系统,如iOS、Android等。

总之,操作系统是计算机系统中不可或缺的重要组成部分,它通过管理和协调各种硬件和软件资源,使得计算机系统可以高效地运行各种应用程序,为人们的工作和生活提供了便利

03.计算机网络

分层模型

应用层HTTP:HTTP/HTTPs、GET和POST、SSL/TLS、Cookie和Session、DNS、URL、

传输层TCP/UDP:TCP报文段的首部格式、TCP三次握手四次挥手、TCP可靠性、TCP和UDP

网络层IP

其他:TCP与HTTP、攻击

计算机网络是指由互连的计算机和设备组成的物理和逻辑结构,使得它们可以互相通信和共享资源。它是现代计算机科学和信息技术的重要组成部分,可以用于数据传输、信息交换、资源共享、分布式计算等方面。

计算机网络包括许多不同的组成部分,如硬件设备(如计算机、路由器、交换机、网卡等)、软件协议(如TCP/IP、HTTP、FTP等)、传输介质(如光纤、铜线、无线电波等)、网络拓扑结构(如星型、总线型、网状型等)等。

计算机网络可以分为局域网(LAN)、城域网(MAN)、广域网(WAN)等不同的范围和层次。它们可以连接全球各地的计算机和设备,使得人们可以方便地进行远程办公、在线学习、远程医疗、在线娱乐等活动。

在当今信息时代,计算机网络的应用越来越广泛,已经成为现代社会中不可或缺的一部分。

04.数据结构

数组、链表、哈希表、字符串、栈与队列、二叉树、回溯算法、动态规划、单调栈、排序、贪心算法、图论、其他

数据结构是计算机科学中研究数据组织和处理的学科,它是计算机程序设计的基础。数据结构是指在计算机中存储和组织数据的方式,是为了高效地访问和操作数据而设计的一种抽象和实现方法。

常见的数据结构包括数组、链表、栈、队列、树、图等。每种数据结构都有自己的特点和适用场景,可以根据具体应用需求选择合适的数据结构。

数据结构可以用来解决许多计算机科学中的问题,如搜索、排序、遍历等。通过合理选择和使用数据结构,可以提高算法效率和程序性能,减少资源消耗和时间复杂度。

数据结构是计算机科学中的基础概念之一,是理解和掌握计算机程序设计的必备知识。

05.计算机体系结构

计算机体系结构是指计算机硬件和软件之间的结构和交互方式。它包括计算机的各种组件和它们之间的连接方式,以及指令集、内存模型、输入输出模型等方面的设计。

计算机体系结构的核心组成部分是中央处理器(CPU),它包括算术逻辑单元(ALU)、控制单元(CU)、寄存器等。CPU与主存储器(RAM)之间通过总线进行数据传输和指令控制。

另外,计算机体系结构还包括输入输出设备(如键盘、鼠标、显示器、打印机等)、存储设备(如硬盘、固态硬盘、光盘等)以及各种接口和控制器等。这些设备通过I/O总线和计算机互相连接和通信。

计算机体系结构的设计对计算机的性能和功能有重要影响。不同的体系结构可以适用于不同的应用场景和需求,例如高性能计算、嵌入式系统、移动设备等。常见的计算机体系结构有冯诺依曼体系结构、哈佛体系结构等。

了解计算机体系结构是计算机科学中的基础知识,对于理解计算机工作原理、程序设计和性能优化等方面都具有重要意义。

06.数据库

数据库是一种电子化的数据集合,能够进行存储、管理和访问。它是计算机应用中最为重要的应用之一,广泛应用于各种信息管理和数据处理系统中。

数据库的特点包括持久性、共享性、独立性、安全性、完整性等。数据库通常由数据表、索引、视图、存储过程、触发器等组成,其中数据表是最基本的数据组织形式,可以包含多个数据字段和数据记录。

常见的数据库类型包括关系型数据库、非关系型数据库等。关系型数据库使用SQL语言进行数据管理和查询,例如Oracle、MySQL、SQL Server等;非关系型数据库则更加注重分布式和海量数据处理,例如MongoDB、Redis等。

数据库在计算机科学和信息技术中具有广泛的应用,例如企业管理、电子商务、金融服务、医疗保健、社交网络等领域。数据库的设计、优化和管理是数据库管理人员、数据分析师等职业的重要工作内容。

07.编译原理

编译原理是一门研究编程语言编译过程的学科。编译器是一种将高级语言代码转换为计算机可执行机器码的程序,编译原理的主要研究内容就是如何设计和实现这样的编译器。

编译器的工作过程通常包括词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成等多个阶段。词法分析器负责将输入的程序文本分割为一个个单词,语法分析器则将单词组合成语法树,并检查语法是否正确,语义分析器则负责检查语义是否正确。

编译原理的研究不仅关注编译器的实现方法,还包括编程语言的设计、程序语言的语法规范、语义规范等方面。它也为我们理解程序运行机制和程序语言的特点提供了深刻的认识和思考。

编译原理在计算机科学中具有重要意义,它是编程语言、操作系统、数据库等领域的重要基础。通过了解编译原理,我们可以更好地理解程序的运行机制,同时也能够更加高效地编写和优化程序。

三.硬件篇

alt

01.硬件基础

数电模电

数电模电,是指数字电路和模拟电路的简称,是电子工程领域中的两个重要学科。

数字电路,是指由数字逻辑门电路组成的电路系统。数字电路能够进行数字信号的逻辑运算和处理,通常用于计算机、通信系统、控制系统等领域。数字电路可以用布尔代数或状态图等方法进行描述,其设计和分析常常使用数字逻辑和信号处理技术。

模拟电路,是指由电子元器件和电路组成的电路系统,其输入和输出信号都是连续的模拟信号。模拟电路能够进行模拟信号的处理和转换,例如信号的放大、滤波、调制等。模拟电路通常使用电路分析和设计技术进行描述和分析,包括基础电路分析、放大器设计、滤波器设计等。

数电模电是电子工程中的两个重要学科,它们通常是互相补充和协同工作的。在现代电子系统中,数字电路和模拟电路常常会集成在一起,形成数字信号处理系统和混合信号电路系统。这种综合应用需要工程师掌握数字电路和模拟电路的基本理论和技术,能够进行系统级设计和分析,从而实现高性能、低功耗的电子系统。

02.画图

画PCB、结构

03.ARM

体系结构、工作模式和寄存器、指令机器码、异常处理、ARM64

ARM是一家总部位于英国的半导体和软件设计公司,其主要产品是基于ARM架构的处理器芯片。ARM处理器是一种低功耗、高性能的嵌入式处理器,广泛应用于智能手机、平板电脑、智能手表、智能家居、物联网等领域。目前,ARM处理器已经成为移动设备和嵌入式系统中最为流行的处理器架构之一。

ARM公司的处理器架构采用了RISC(精简指令集计算机)设计理念,与传统的CISC(复杂指令集计算机)相比,指令集更加精简,但处理速度更快,功耗更低。ARM处理器的指令集架构采用的是Thumb-2指令集,它同时支持16位和32位指令,既能够兼容较老的16位指令,又能够充分利用32位指令的性能优势。

ARM架构的处理器分为多个系列,包括Cortex-A、Cortex-R和Cortex-M等。其中,Cortex-A系列是针对高性能计算领域设计的处理器,适用于智能手机、平板电脑、笔记本电脑等设备;Cortex-R系列是面向实时性应用领域的处理器,适用于汽车、工业控制、医疗设备等领域;Cortex-M系列则是面向嵌入式系统领域的处理器,适用于物联网、智能家居、传感器等领域。

除了处理器芯片外,ARM公司还提供了广泛的软件支持,包括操作系统、驱动程序、开发工具等,以便客户快速地开发和部署ARM架构的嵌入式系统。同时,ARM公司也与众多的硬件厂商、软件厂商和开发者社区合作,不断拓展其生态系统,推动ARM处理器在各个领域的广泛应用。

04.单片机

单片机基础、RTOS

单片机(Microcontroller)是一种集成了微处理器、内存、输入输出设备和其他外围接口的微型计算机系统。相比于传统的计算机系统,单片机系统的体积更小、功耗更低、成本更低,更适合于嵌入式系统和物联网应用。

单片机的核心是微处理器,其架构和指令集可以与普通计算机相似或不同。通常,单片机的处理器速度相对较慢,内存和存储器容量也相对较小,但是它具有实时响应性能好、可靠性高、功耗低等特点。

单片机常常需要运行实时操作系统(RTOS),以满足系统的实时性要求。RTOS是一种专门设计用于实时嵌入式系统的操作系统,其最主要的特点是具有较高的实时性和可靠性,可以处理来自外部世界的各种事件和数据,并在短时间内作出响应。

RTOS的核心是任务调度器,可以对多个任务进行调度,实现任务之间的优先级调度、时间片轮转等算法,确保系统响应能力和实时性。RTOS还提供了各种服务和接口,包括信号量、消息队列、计时器等,方便开发者设计和实现复杂的实时系统。

常用的单片机芯片厂商有ST、Freescale、Atmel、TI等,它们提供了各种型号和系列的单片机芯片,开发者可以根据具体应用的需求选择合适的芯片。常见的单片机开发工具包括Keil、IAR、CCS等,它们提供了各种开发工具和开发板,可以方便地进行单片机软硬件的开发和调试。

05.FPGA

FPGA(Field Programmable Gate Array,现场可编程门阵列)是一种可编程逻辑器件,也被称为可编程芯片。相比于ASIC(Application-Specific Integrated Circuit,专用集成电路),FPGA不需要专门的硬件设计和制造流程,可以通过编程实现各种不同的电路功能,具有灵活性和可重构性。

FPGA由大量的可编程逻辑单元(CLB,Configurable Logic Block)、输入输出单元(IOB,Input Output Block)、时钟管理单元(Clock Management)等构成。每个CLB包含多个可编程逻辑门、寄存器和存储器单元,可以根据需要组合成各种不同的逻辑电路。IOB提供了与外部世界交互的接口,包括数字输入输出、模拟输入输出、时钟等。时钟管理单元可以提供各种时钟管理功能,包括时钟分频、时钟延迟、时钟锁相等。

FPGA的开发通常使用硬件描述语言(HDL)进行,例如Verilog和VHDL。开发者可以通过HDL编写FPGA逻辑电路的描述,再通过综合工具将HDL代码转换为FPGA的配置文件,最后将配置文件下载到FPGA中实现逻辑电路的功能。FPGA还支持在线配置和动态重编程,可以在不中断系统运行的情况下修改逻辑电路的配置文件。

FPGA的应用范围非常广泛,包括数字信号处理、通信系统、计算机视觉、工业自动化等领域。常见的FPGA芯片厂商有Xilinx、Altera(现在属于英特尔)、Lattice等,它们提供了各种型号和系列的FPGA芯片,以及FPGA开发工具和开发板,方便开发者进行FPGA设计和开发。

06.接口协议

UART、IIC、SPI、CAN、USB、232/485、SDIO、以太网、MIPI、PCI/PCIE

UART:UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种串行通信接口,常用于连接微控制器、传感器、模块等设备。UART支持双向通信,数据传输速度通常较慢,但在短距离通信和实时数据传输方面具有优势。

IIC:IIC(Inter-Integrated Circuit,集成电路互连)是一种串行通信接口,用于连接多个芯片或器件,常用于连接传感器、存储器、显示器等设备。IIC总线包括两条信号线,一条是时钟线SCL,另一条是数据线SDA。IIC总线具有简单、可靠、灵活的特点。

SPI:SPI(Serial Peripheral Interface,串行外围接口)是一种串行通信接口,常用于连接微控制器、存储器、显示器等设备。SPI支持高速数据传输和全双工通信,具有高效性和可靠性。SPI总线包括四条信号线,一条是时钟线SCK,另外三条是数据线MISO、MOSI和SS。

CAN:CAN(Controller Area Network,控制器局域网)是一种广泛应用于汽车、工业自动化等领域的实时通信协议。CAN总线支持多主从通信、错误检测和纠错等功能,具有高可靠性和实时性。CAN总线使用差分信号传输,包括两条信号线CANH和CANL。

USB:USB(Universal Serial Bus,通用串行总线)是一种广泛应用于电脑、手机等设备的外部总线标准。USB总线支持高速数据传输、热插拔、供电等功能,具有灵活性和兼容性。USB总线包括四条信号线,一条是数据线D+,另外三条是数据线D-、VCC和地线。

232/485:232和485是两种串口标准。232标准是一种单工、点对点的串行通信标准,常用于连接计算机和外部设备。485标准是一种半双工、多点的串行通信标准,支持多个设备同时通信,常用于工业自动化等领域。232和485总线使用串口连接,232总线包括三条信号线,分别是TXD、RXD和地线,485总线包括两条信号线A和B,以及一个地线。

SDIO:SDIO(Secure Digital Input/Output,安全数字输入输出)是一种串行总线,用于连接存储卡、无线网卡等设备。SDIO总线包括四条信号线,一条是时钟线CLK,另外三条是数据线CMD、D0和D1~3。SDIO总线支持高速数据传输和DMA传输等功能。

以太网:以太网是一种局域网技术,常用于连接计算机、服务器、路由器等设备。以太网支持高速数据传输和广播通信等功能,具有可靠性和兼容性。以太网使用双绞线连接,包括四对信号线,一对是发送和接收数据的线TX+和TX-,另外三对是数据传输控制线和电源线。

MIPI:MIPI(Mobile Industry Processor Interface,移动行业处理器接口)是一种用于移动设备的串行总线标准,支持多种数据传输协议和接口类型。MIPI总线包括多个子协议,如MIPI D-PHY、MIPI CSI、MIPI DSI等。MIPI总线支持高速数据传输和低功耗等特点,适用于移动设备的多种传输需求。

PCI/PCIE:PCI(Peripheral Component Interconnect,外围设备互连)和PCIE(PCI Express,PCI扩展)是计算机系统中常用的总线标准,用于连接计算机和外部设备。PCI总线包括多个版本,如PCI、PCI-X、PCIe等。PCI/PCIE总线支持高速数据传输、热插拔、多主从通信等功能,适用于计算机内部和外部设备的连接。PCI/PCIE总线包括多条信号线,包括数据线、控制线、时钟线等。

四.嵌入式Linux篇

alt

01.Linux应用编程

Linux操作系统、Linux系统编程、Linux网络编程、QT、特殊硬件接口编程

Linux应用编程指的是在Linux操作系统上开发应用程序的过程。Linux操作系统具有开放的源代码和广泛的软件支持,为应用程序开发提供了丰富的资源和工具。Linux应用编程主要包括以下几个方面:

  1. 编程语言

Linux支持多种编程语言,如C、C++、Python、Java等。其中,C语言是Linux应用编程最常用的语言之一,因为它具有高效、可移植等特点,能够很好地满足嵌入式系统和嵌入式Linux应用程序的需求。

  1. 应用框架

Linux应用编程中常用的应用框架包括GTK+、Qt、FLTK等。这些框架提供了一些基本的GUI控件和API接口,可以方便地创建各种应用程序界面。

  1. 软件工具

Linux应用编程中常用的软件工具包括gcc、make、gdb、valgrind等。其中,gcc是一个广泛使用的编译器,make是一个常用的构建工具,gdb是一个常用的调试器,valgrind是一个常用的内存检测工具。

  1. 库文件

Linux操作系统提供了很多库文件,如libc、libpthread、librt等。这些库文件提供了一些常用的函数和接口,可以方便地完成各种应用程序的开发和调试。

  1. 网络编程

Linux操作系统支持网络编程,可以使用TCP/IP协议栈进行网络通信。Linux网络编程中常用的库文件包括libnet、libpcap、libcurl等。

总之,Linux应用编程是Linux系统开发的重要组成部分,需要掌握相应的编程语言、应用框架、软件工具和库文件,以及网络编程等技术。

02.Linux内核

内核分析、中断机制、并发机制、阻塞非阻塞同步异步、内存资源管控等

Linux内核是一个免费开源的操作系统内核,由芬兰计算机科学家Linus Torvalds于1991年开始开发。它是一个操作系统的核心部分,负责管理计算机硬件资源和提供系统服务。

Linux内核的设计是模块化的,它允许开发者根据需要添加或删除功能模块,从而使它成为一款高度可定制的操作系统内核。它支持多种硬件平台,并且可以在多种计算机系统上运行,包括桌面电脑、服务器、移动设备和嵌入式系统。

Linux内核的开源性质使得全世界的开发者都可以参与到它的开发中来,从而使得它不断得到改进和完善。今天,Linux已经成为一个广泛使用的操作系统内核,许多公司和组织都在使用Linux内核来构建自己的操作系统。

Linux内核由多个部分组成,每个部分负责不同的功能。以下是Linux内核的主要部分:

  1. 进程管理:Linux内核负责管理进程的创建、调度、终止等操作,并提供了进程间通信机制,如信号、管道、共享内存等。
  2. 内存管理:Linux内核负责管理系统的内存资源,包括内存分配、释放、虚拟内存管理等。
  3. 文件系统:Linux内核提供了多种文件系统支持,包括常见的ext4、NTFS、FAT32等,同时也支持网络文件系统和虚拟文件系统。
  4. 网络协议栈:Linux内核包含了完整的网络协议栈,支持多种网络协议和通信方式,如TCP/IP、UDP、ICMP等。
  5. 设备驱动程序:Linux内核提供了大量的设备驱动程序,包括磁盘驱动、网络驱动、输入设备驱动、图形设备驱动等,支持多种硬件设备。
  6. 系统调用:Linux内核提供了一组系统调用接口,用户程序可以通过系统调用接口与内核进行交互,如读写文件、创建进程、网络通信等。
  7. 安全子系统:Linux内核提供了多种安全子系统,如SELinux、AppArmor等,可以保护系统的安全性和完整性。

03.Linux内核驱动

驱动初级:内核模块、字符设备、平台设备、设备树、GPIO子系统、pinctrl子系统、输入子系统、I2C子系统、SPI子系统

驱动高级:网络、摄像头、图像系统、LCD、USB、PCIE等

Linux内核驱动是连接硬件和操作系统的关键组件之一,提供了访问硬件资源的接口。其中,内核模块、字符设备、平台设备、设备树、GPIO子系统、pinctrl子系统、输入子系统、I2C子系统和SPI子系统是常用的一些组件。下面对它们进行简单的介绍:

  1. 内核模块:内核模块是一段可加载的内核代码,可以在运行时动态加载和卸载。它可以扩展内核功能、添加设备驱动程序或实现特定的功能。
  2. 字符设备:字符设备是指每次读写一个字节或一组字节的设备,例如串口、键盘等。Linux内核提供了一套字符设备接口,可以通过这些接口实现对字符设备的访问和管理。
  3. 平台设备:平台设备是指直接连接到主板的设备,例如GPIO、I2C、SPI等。它们在启动时被内核发现,并通过平台设备驱动程序进行管理和访问。
  4. 设备树:设备树是一种硬件描述语言,用于描述系统中的硬件资源,例如CPU、内存、外设等。设备树被用于在启动过程中识别和配置硬件设备,并将其与相应的驱动程序匹配。
  5. GPIO子系统:GPIO(通用输入输出)子系统提供了一个接口,用于控制GPIO引脚。它允许用户在应用程序中控制和监控GPIO引脚,以实现与外设的通信。
  6. pinctrl子系统:pinctrl子系统提供了一个接口,用于配置GPIO引脚的功能和属性。它允许用户为每个GPIO引脚配置不同的功能和属性,并将其与设备树上的相应设备匹配。
  7. 输入子系统:输入子系统提供了一个接口,用于管理输入设备,例如键盘、鼠标、触摸屏等。它允许用户在应用程序中控制和监控输入设备,并将其与相应的驱动程序匹配。
  8. I2C子系统:I2C(Inter-Integrated Circuit)子系统提供了一个接口,用于控制I2C总线。它允许用户在应用程序中控制和监控I2C总线,并将其与相应的驱动程序匹配。
  9. SPI子系统:SPI(Serial Peripheral Interface)子系统提供了一个接口,用于控制SPI总线。它允许用户在应用程序中控制和监控SPI总线,并将其与相应的驱动程序匹配。

除了上述介绍的组件外,Linux内核驱动中还有许多其他的模块和子系统,包括网络、摄像头、图像系统、LCD、USB和PCIE等。下面简要介绍一下这些组件:

  1. 网络:网络子系统是Linux内核的一个重要组成部分,提供了对各种网络协议(如TCP/IP、UDP等)的支持,并管理网络接口、路由表和网络设备等。
  2. 摄像头:摄像头子系统提供了对数字摄像头的支持,允许用户使用应用程序控制和管理摄像头设备,以实现图像和视频捕捉功能。
  3. 图像系统:图像系统提供了对图像和视频的处理和显示支持,包括图像解码、缩放、旋转和显示等功能。它允许用户使用应用程序控制和管理图像和视频设备,并将其与相应的驱动程序匹配。
  4. LCD:LCD子系统提供了对LCD显示屏的支持,允许用户使用应用程序控制和管理LCD设备,以实现图像和视频显示功能。
  5. USB:USB(Universal Serial Bus)子系统提供了对USB设备的支持,包括USB存储设备、USB网络设备、USB音频设备等。它允许用户使用应用程序控制和管理USB设备,并将其与相应的驱动程序匹配。
  6. PCIE:PCI Express(PCIe)子系统提供了对PCIe总线的支持,允许用户使用应用程序控制和管理PCIe设备,包括网卡、显卡、存储控制器等。它将PCIe设备与相应的驱动程序匹配,并为其分配资源。

总之,Linux内核驱动是连接硬件和操作系统的关键组件之一,其中包括许多不同的子系统和模块,每个子系统和模块都提供了对特定硬件设备的支持,使得Linux系统能够与各种硬件设备交互并提供相应的服务。

04.BSP移植

04-1.嵌入式Linux开发环境搭建

虚拟机、Ubuntu配置、必备软件、交叉编译器、SSH、tftp、NFS

嵌入式Linux开发环境搭建通常需要以下步骤:

  1. 选择适合的开发板和工具链:选择一个适合项目需求的开发板,了解其CPU、存储器、外设等硬件特性,然后选择相应的交叉编译工具链。
  2. 下载和编译内核:从开发板厂商或者开源社区下载合适版本的Linux内核源码,然后使用交叉编译工具链进行编译。
  3. 选择和配置文件系统:选择和配置文件系统,可以选择预制的根文件系统,也可以自己构建根文件系统。
  4. 配置和编译应用程序:开发应用程序时,需要根据硬件特性和文件系统的配置进行相关配置,然后进行编译。
  5. 调试和测试:在开发过程中需要进行调试和测试,可以通过串口调试、网络调试、JTAG调试等方式进行调试和测试。
  6. 部署和更新:开发完成后,需要将应用程序和根文件系统部署到目标板上,并根据需求进行更新。

在搭建嵌入式Linux开发环境时,需要掌握以下基础知识:

  1. 嵌入式系统的硬件架构和特性,包括CPU、存储器、外设等方面的知识。
  2. Linux内核的基本结构和运行机制,包括内核启动、驱动程序、中断处理等方面的知识。
  3. 文件系统的基本结构和配置方法,包括文件系统的挂载、文件权限、文件类型等方面的知识。
  4. Linux应用程序的编写和调试方法,包括Makefile文件的编写、交叉编译和调试等方面的知识。
  5. 调试和测试工具的使用方法,包括串口调试、网络调试、JTAG调试等方面的知识。

综上所述,嵌入式Linux开发环境的搭建需要掌握多个领域的知识,包括硬件、软件和调试测试等方面的知识。在实际应用中,还需要考虑项目需求和硬件平台特性等因素,进行相应的优化和定制。

04-2.bootloader

U-boot使用和调试、U-boot源码分析、U-boot驱动开发、U-boot移植

  1. Bootloader

Bootloader是一段运行在开发板上的程序,用于引导系统。一般情况下,开发板上的芯片并没有固化操作系统的启动代码,需要使用Bootloader来加载并启动操作系统。Bootloader在引导操作系统之前,会进行一些硬件初始化、设置操作系统启动参数、读取内核镜像等操作。一般情况下,Bootloader的大小很小,只负责完成系统引导的基本功能。常用的Bootloader有U-Boot、RedBoot、Das U-Boot等。

  1. U-Boot

U-Boot是一种常用的开源Bootloader,具有高度的可定制性和可移植性,支持多种CPU架构和外设接口。U-Boot除了完成系统引导的基本功能,还可以用于更新系统固件、网络下载、调试等多种应用场景。U-Boot的优点是支持广泛,定制化高,易于移植。缺点是功能复杂,开发难度较大。

在实际使用中,需要根据具体应用场景选择合适的Bootloader和配置参数。

U-boot的移植过程主要包括以下几个步骤:

  • 获取目标平台的硬件资料和技术文档,包括处理器型号、内存大小、Flash芯片型号等信息。
  • 选择适当的U-boot版本,根据目标平台的处理器架构和硬件特性进行配置,生成适配目标平台的U-boot源代码。
  • 编译U-boot源代码,生成可执行的二进制文件。
  • 将生成的U-boot二进制文件烧录到目标平台的Flash中。
  • 连接串口终端,启动目标平台,进行U-boot的调试和测试。

04-3 内核移植

内核是操作系统的核心组件,它负责管理系统资源、提供服务接口等。内核移植的过程主要包括以下几个步骤:

  • 获取目标平台的硬件资料和技术文档,包括处理器型号、内存大小、外设配置等信息。
  • 选择适当的内核版本,根据目标平台的处理器架构和硬件特性进行配置,生成适配目标平台的内核源代码。
  • 编译内核源代码,生成可执行的内核映像文件。
  • 将内核映像文件烧录到目标平台的Flash中,或者通过网络或SD卡等方式加载到内存中。
  • 在U-boot中配置内核启动参数,包括内核映像地址、内核命令行参数等。
  • 连接串口终端,启动目标平台,进行内核的调试和测试。

总之,内核移植是嵌入式系统开发中非常重要的环节,需要仔细研究目标平台的硬件特性和技术资料,根据实际情况进行配置和调试,以确保系统能够正常启动和运行。

04-4.文件系统构建

busybox、buildroot、yocto、Linux发行版、虚拟磁盘RAMDISK

Linux文件系统是指用于组织和管理文件和目录的一组数据结构和算法,它们通过内核文件系统接口提供对文件的读写、创建、删除和管理等操作。Linux文件系统是Linux操作系统中的重要组成部分,它将文件和目录组织成一个层次结构,并提供了对文件的访问和管理。

在Linux文件系统中,文件和目录被组织成树形结构,树的根目录是“/”(也称为根目录或根文件系统),它包含了所有其他目录和文件。Linux文件系统的构建主要包括以下几个方面:

  1. 文件系统层次结构:Linux文件系统采用的是一种层次结构,根据不同的用途和功能,将文件和目录分组放置在不同的目录下。例如,系统配置文件位于/etc目录下,用户的主目录位于/home目录下,程序文件位于/usr/bin或/usr/local/bin目录下等。
  2. 文件系统类型:Linux支持多种文件系统类型,包括ext2、ext3、ext4、NTFS、FAT等,每种文件系统类型都有其独特的特点和用途。选择合适的文件系统类型,可以提高系统的性能和可靠性。
  3. 文件系统挂载:Linux文件系统需要被挂载才能访问。挂载是将一个文件系统连接到一个指定的目录上,使得该目录成为该文件系统的根目录。文件系统挂载可以通过手动执行mount命令,也可以在系统启动时自动执行。
  4. 文件和目录管理:Linux文件系统提供了一系列的命令和工具,用于创建、删除、移动、复制、重命名文件和目录等操作。这些命令和工具包括ls、cp、mv、rm、mkdir、rmdir等。

总之,Linux文件系统是Linux操作系统的核心组成部分之一,它提供了对文件和目录的管理和访问功能,为Linux系统的稳定运行和应用开发提供了坚实的基础。

05.项目相关

主要整理一些能写在简历上的项目

嵌入式软件开发是一个广泛的领域,包括了各种嵌入式设备和系统的开发。以下是一些嵌入式软件开发的具体项目示例:

  1. 嵌入式系统开发:包括单片机、嵌入式Linux系统等的开发,例如嵌入式Linux系统移植、驱动程序开发、应用程序开发等。
  2. 嵌入式网络设备开发:包括路由器、交换机、防火墙等网络设备的开发,例如协议栈开发、交换机芯片驱动程序开发、应用程序开发等。
  3. 嵌入式控制器开发:包括各种工业控制器、智能家居控制器等的开发,例如控制算法开发、硬件接口驱动程序开发、应用程序开发等。
  4. 嵌入式嵌入式图像处理设备开发:包括监控摄像头、医疗图像处理设备等的开发,例如视频编解码器开发、图像处理算法开发、应用程序开发等。
  5. 嵌入式嵌入式音频设备开发:包括MP3播放器、语音识别设备等的开发,例如音频编解码器开发、语音处理算法开发、应用程序开发等。

以上仅是嵌入式软件开发的一些项目示例,实际上嵌入式软件开发适用于各种嵌入式设备和系统,涉及到的项目非常丰富和多样化。

C++软件开发也是一个广泛的领域,包括各种类型的应用程序和系统的开发。以下是一些C++软件开发的具体项目示例:

  1. 游戏开发:包括PC游戏、手机游戏、游戏引擎等的开发,例如游戏逻辑开发、图形渲染开发、音频开发、网络通信开发等。
  2. 操作系统开发:包括Windows、Linux、Mac等操作系统的开发,例如系统内核开发、驱动程序开发、系统服务开发、用户界面开发等。
  3. 软件工具开发:包括编译器、解释器、调试器、IDE等的开发,例如编译器前端开发、代码分析工具开发、调试器插件开发等。
  4. 应用程序开发:包括各种类型的桌面应用程序、移动应用程序等的开发,例如文本编辑器、图像处理软件、音视频播放器、社交网络应用等。
  5. 嵌入式系统开发:与前面提到的嵌入式软件开发类似,C++也广泛应用于各种嵌入式系统的开发,例如嵌入式Linux系统开发、工业控制器开发、图像处理设备开发等。

以上仅是C++软件开发的一些项目示例,实际上C++适用于各种类型的应用程序和系统开发,涉及到的项目非常丰富和多样化。

五.其他

alt

01.算法

控制算法、AI算法

控制算法和AI算法都是现代计算机科学领域的重要分支,具有不同的应用和特点。

控制算法是指应用于控制系统的算法,用于控制系统的输入和输出之间的关系,以实现系统的稳定性、精度和响应速度等性能指标。常见的控制算法包括PID控制算法、LQR控制算法、自适应控制算法、模糊控制算法等。这些算法被广泛应用于自动化控制、机器人控制、电力控制等领域。

AI算法则是指人工智能领域的算法,用于模拟人类智能行为,包括机器学习、深度学习、神经网络、决策树等。这些算法被广泛应用于计算机视觉、语音识别、自然语言处理、推荐系统等领域,是人工智能技术的核心部分。

需要注意的是,控制算法和AI算法虽然有所不同,但也有许多相似之处。例如,在自动化控制中,可以使用机器学习算法来优化控制系统的参数,提高控制性能;而在人工智能中,也可以使用控制算法来控制智能体的行为,提高智能体的效率和稳定性。因此,控制算法和AI算法可以相互借鉴、交叉应用,推动科技进步和应用创新。

02.图形学

计算机图形学是计算机科学领域的一个分支,研究如何使用计算机来生成、处理、显示和交互图像和图形。它的应用范围非常广泛,涉及电影、游戏、虚拟现实、计算机辅助设计、工业设计、医学影像处理、地理信息系统等领域。

计算机图形学主要包括以下几个方面:

  1. 几何处理:计算机图形学需要将物体表面的信息转换成计算机可以处理的数字数据,而几何处理就是指如何处理和表示这些物体的形状和位置。常见的几何处理技术包括多边形网格建模、三角剖分、曲线和曲面表示等。
  2. 渲染:渲染是将计算机中的三维场景转化为二维图像的过程,它包括光线追踪、光照模型、阴影计算、纹理映射等技术。
  3. 动画:动画是将一系列静态图像组合在一起形成连续的运动效果。计算机图形学中的动画技术包括关键帧动画、骨骼动画、运动模糊等。
  4. 用户交互:计算机图形学的用户交互包括鼠标、键盘、触摸屏等输入设备和图形界面、虚拟现实等输出设备,涉及到图形界面的设计和实现、虚拟现实的交互技术等。

计算机图形学涉及到多个学科,如计算机科学、数学、物理学等。随着计算机技术和图形学算法的不断发展,计算机图形学的应用范围和领域将继续拓展。

03.虚拟化

虚拟化是一种将物理资源抽象化、分割化、组合化的技术,它可以将一台物理计算机分割成多个虚拟计算机,从而实现多用户、多任务的并发操作。虚拟化技术的发展,为云计算、大数据、人工智能等新兴技术的快速发展提供了基础支撑。

虚拟化主要分为以下几种:

  1. 完全虚拟化:在完全虚拟化中,虚拟机(VM)和主机系统(Host)之间的交互由虚拟机监控程序(VMM)来管理,VMM屏蔽了虚拟机对硬件的直接访问,所有的指令和数据都需要经过VMM的处理,VMM再通过一定的技术手段将指令和数据映射到物理硬件上。常见的完全虚拟化软件包括VMware、KVM等。
  2. 半虚拟化:半虚拟化相对于完全虚拟化来说,虚拟机可以直接访问一部分硬件资源,如存储器和网络接口,而不是完全依赖于VMM,这样可以提高虚拟机的性能。Xen就是一种半虚拟化软件。
  3. 容器化:容器化是一种轻量级的虚拟化技术,它利用操作系统的资源隔离和文件系统隔离等特性来实现虚拟化,不需要像完全虚拟化一样需要虚拟硬件,因此比完全虚拟化更轻量级。常见的容器化软件包括Docker、Kubernetes等。

虚拟化技术可以带来许多好处,如提高资源利用率、降低系统运维成本、提高系统安全性等,因此虚拟化技术在云计算、大数据、人工智能等领域得到了广泛应用。

04.高性能计算HPC

高性能计算(High Performance Computing, HPC)是一种通过利用大规模计算机集群、网络和并行算法等技术,解决高复杂度和高计算量问题的计算机科学和工程学领域。HPC应用于科学研究、工程设计、天气预测、金融模拟、数字娱乐等多个领域。

HPC的主要特点包括:

  1. 高性能:HPC集群通常由成千上万台计算机节点组成,可以提供极高的计算性能和存储容量,用于处理大规模数据和复杂计算。
  2. 并行计算:HPC利用并行计算技术,将计算任务分成若干个子任务,由多个计算节点并行计算,以提高计算速度和效率。
  3. 分布式存储:HPC集群通常采用分布式存储技术,将数据分布存储在多个节点上,以提高存储容量和数据访问速度。
  4. 大规模运维:HPC集群通常包含成千上万个计算节点,需要进行大规模运维和管理,保障系统的稳定性和可靠性。

HPC技术的发展对于许多领域的科学研究和工程设计都具有重要的意义。例如,在天气预测领域,HPC可以通过海量数据的采集、存储和处理,提高天气预测的准确性和时效性;在生物医学领域,HPC可以通过分析基因序列和模拟分子动力学等技术,加速新药研发和疾病治疗的进程;在工程设计领域,HPC可以通过模拟流体力学、结构力学等技术,提高工程设计的精度和效率。

等等

#C++##嵌入式##笔试##校招##24届软开秋招面试经验大赏#
【嵌入式八股】一、语言篇 文章被收录于专栏

查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇【本专栏】 2.计算机基础 3.硬件篇 4.嵌入式Linux (建议PC端查看)

全部评论
大家可以说下意见和建议也点个赞
6
送花
回复
分享
发布于 2023-03-18 22:43 辽宁
真不错,这是我见过的整理最好的资料了
点赞
送花
回复
分享
发布于 2023-03-29 22:12 辽宁
滴滴
校招火热招聘中
官网直投
点赞
送花
回复
分享
发布于 2023-03-31 11:32 辽宁
很好的大纲~🤩
点赞
送花
回复
分享
发布于 2023-04-01 11:14 上海
厉害啊!🥳
点赞
送花
回复
分享
发布于 2023-04-04 20:30 江苏
收藏了
点赞
送花
回复
分享
发布于 2023-04-07 05:18 湖南
mark
点赞
送花
回复
分享
发布于 2023-08-12 08:54 河南
点赞
送花
回复
分享
发布于 2023-09-07 15:28 山东

相关推荐

学习准备:需要C语言基础VMware下的ubuntu14.04(Linux基础篇-网络篇),博主用的是ubuntu18.04华清远见FS4412开发板(ARM篇-Linux驱动篇)- 可在淘宝购买 或者 在华清远见官网进行租赁学习建议:本系列基础篇-网路篇通用,ARM篇-驱动篇可以根据教程方法应用于不同的开发板可以先看关于Linux的教学视频,在来看本系列Linux学习内容很多,其中一个方面都可以作为一辈子的学习,建议学习时,先总体在细分,先运行在原理。二、Linux基础篇  本篇讲解linux系统的常用操作以及使用的命令,通过下面5节内容可以对linux系统有一个初步掌握以及应用。【Linux】基础篇一–linux系统常用命令【Linux】基础篇二–软件包管理及shell命令【Linux】基础篇三–linux shell命令【Linux】基础篇四–shell脚本编程【Linux】基础篇五–linux C语言高级编程【Linux】基础篇六–Makefile学习上面的六篇后,linux的学习算是入门了。三、数据结构与算法基础  在学习linux应用前,需要对数据结构与算法有一个基础掌握,不仅是为了C语言的提高,因为后面的学习也运用了数据结构与算法的相关知识,当然您如果是这方面的高手可以跳过本篇往下学习。【数据结构与算法】程序的内修三、Linux应用篇  本篇讲解Linux上层的知识,学习完本篇可以对Linux上层应用制作有一个初步了解。【Linux】应用篇一–标准IO【Linux】应用篇二–标准IO的字符输入和输出【Linux】应用篇三–流的刷新定位与格式化输入输出【Linux】应用篇四–文件IO【Linux】应用篇五–目录与库【Linux】应用篇六–进程的创建与回收【Linux】应用篇七–exec函数族和守护进程【Linux】应用篇八–线程的创建与回收【Linux】应用篇九–线程的取消与互斥【LInux】应用篇十–条件变量和线程池【Linux】应用篇十一–进程间的通信【Linux】应用篇十二–共享内存【Linux】应用篇十三–信号机制【Linux】应用篇十四–消息队列与信号灯建议学习本篇时,多使用man手册,重点掌握IO、进程、线程的知识。  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
转发
65 344 评论
分享
牛客网
牛客企业服务