嵌入式开发工程师笔试面试指南-Linux系统移植

1 Linux内核启动流程⭐⭐⭐⭐⭐

引导加载阶段

计算机通电后,首先由 BIOS 或 UEFI 进行初始化,完成硬件自检等操作。

找到可启动设备,读取其第一个扇区的 MBR,MBR 中的引导加载程序(如 GRUB)被加载到内存并运行。

内核初始化阶段

引导加载程序将内核映像加载到内存后,内核开始初始化,首先进行体系结构相关的初始化,如设置 CPU 寄存器、内存映射等。

接着进行内核的基本初始化,包括内存管理、进程调度、中断处理等子系统的初始化。

系统服务启动阶段

内核初始化完成后,启动系统的第一个进程 init,init 进程会根据配置文件来启动其它系统服务和进程,如网络服务、文件系统服务等。

系统进入运行状态,等待用户操作。

2 什么是bootloader?在嵌入式系统当中bootloader的作用是什么?⭐⭐⭐⭐

Bootloader 是一段在操作系统内核运行之前执行的小程序。在嵌入式系统中,它具有至关重要的作用:

系统初始化:Bootloader 会对嵌入式系统中的硬件进行初始化,包括 CPU、内存、时钟、串口等设备,为后续内核的运行搭建好基础环境,确保硬件处于合适的工作状态。

加载内核:从存储设备(如 Flash、SD 卡)中读取操作系统内核映像到内存指定位置,并将系统控制权交给内核,使内核能够开始执行,完成系统的启动。

参数传递:在加载内核的过程中,Bootloader 可以向内核传递一些必要的参数,如硬件配置信息、内存布局等,帮助内核更好地适应硬件环境。

系统调试与维护:提供交互界面,允许开发人员通过串口或网络等方式与系统进行交互,实现对系统的调试、更新内核和文件系统等操作。

3 为什么汇编语言对硬件平台有依赖性而C语言却可以不依赖硬件平台?⭐⭐⭐⭐

汇编语言对硬件平台有依赖性而 C 语言相对不依赖硬件平台,主要原因如下:

指令集相关性:汇编语言是直接面向硬件的编程语言,它的每条指令都与特定硬件平台的指令集紧密相关,不同硬件平台的指令集和寄存器结构差异很大,所以汇编语言程序通常只能在特定的硬件平台上运行。而 C 语言是高级编程语言,它通过编译器将代码转换为目标硬件平台的机器码,编译器会根据不同平台的特点进行适配,开发者无需直接针对特定平台的指令集编程。

内存管理差异:汇编语言需要程序员直接操作内存地址和寄存器来进行数据存储和读取,要清楚了解硬件的内存布局等细节。C 语言有相对统一的内存管理机制,通过指针等概念操作内存,编译器会负责将这些操作映射到具体硬件平台的内存管理方式上,降低了对硬件平台内存细节的依赖。

4 什么叫做交叉编译?⭐⭐⭐

交叉编译是指在一个平台上生成能在另一个不同平台上运行的目标代码的编译过程。比如,在 PC 机(x86 架构)上安装交叉编译工具链,然后用它来编译适用于 ARM 架构嵌入式设备的程序。

在嵌入式开发等场景中,交叉编译非常重要。由于目标设备(如嵌入式芯片)的资源有限,往往无法直接在上面进行编译工作,所以需要在性能较强的主机上进行编译。通过交叉编译,开发者可以利用主机的计算资源,针对不同架构和操作系统的目标设备生成可执行代码,方便将软件部署到各种目标平台上,而无需在每个目标设备上都搭建完整的开发环境。

5 Linux平台下的可执行文件是什么格式?⭐⭐⭐

Linux 平台下常见的可执行文件格式主要是 ELF 格式,以下是具体介绍:

ELF(Executable and Linking Format):是 Linux 系统中最常用的可执行文件格式,可用于可执行程序、共享库和目标文件等。它具有良好的可移植性和扩展性,支持多种硬件平台和操作系统。ELF 文件包含了多个段,如代码段、数据段、符号表等,这些段记录了程序的指令、数据以及与链接和运行相关的信息,系统的加载器能够根据 ELF 文件的结构和信息,将程序正确地加载到内存中并运行。

此外,在 Linux 早期还存在 a.out 格式,但因其局限性已逐渐被 ELF 格式取代。

6 什么叫做反汇编?⭐⭐⭐⭐

反汇编是将机器语言程序转换为汇编语言程序的过程,与汇编过程相反。具体来说,就是把计算机可执行的二进制机器码,按照一定的规则和算法,转换为人类可读的汇编语言指令形式。

在软件逆向工程、程序调试、漏洞分析等场景中,反汇编技术应用广泛。通过反汇编,分析人员可以查看程序的汇编代码,了解程序的执行逻辑、算法实现,检查是否存在安全漏洞或恶意代码等。例如,在调试程序时,反汇编可以帮助开发人员查看机器码对应的汇编指令,更深入地理解程序的运行情况,找出程序出现问题的原因。

7 简述nfs服务的概念与作用?⭐⭐⭐

NFS(Network File System)即网络文件系统,是一种基于网络的文件共享服务,允许网络中的计算机之间通过网络协议共享和访问彼此的文件系统资源。

NFS 的作用主要体现在以下几个方面:

资源共享:可使多台计算机共享同一组文件和数据,不同主机上的用户能像访问本地文件一样访问远程 NFS 服务器上的文件,提高了数据的共享性和利用率。

便于管理:系统管理员能在 NFS 服务器上集中管理和维护共享文件,如进行文件的更新、备份等操作,而无需在每台客户端机器上分别进行,降低了管理成本和复杂度。

增强灵活性:客户端可根据自身需求随时挂载或卸载 NFS 共享目录,方便灵活地使用服务器端的文件资源,有利于构建灵活的分布式计算环境。

8 简述一个装有linux内核的开发板的启动过程?⭐⭐⭐⭐⭐

装有 Linux 内核的开发板的启动过程一般可分为以下几个阶段:

上电复位阶

开发板上电后,硬件电路会产生复位信号,使 CPU 进入复位状态,从预设的地址开始执行代码,通常这个地址对应的是启动 ROM 中的代码。

Bootloader 阶段

启动 ROM 中的代码会首先加载 Bootloader 到内存中。Bootloader 是在操作系统内核运行之前运行的一段小程序,它的主要作用是初始化硬件设备、建立内存空间映射图,为加载内核做好准备。

完成自身

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式/C++面试八股文 文章被收录于专栏

该专栏面向嵌入式开发工程师、C++开发工程师,包括C语言、C++,操作系统,ARM架构、RTOS、Linux基础、Linux驱动、Linux系统移植、计算机网络、数据结构与算法、数电基础、模电基础、5篇面试题目、HR面试常见问题汇总和嵌入式面试简历模板等文章。超全的嵌入式软件工程师面试题目和高频知识点总结! 另外,专栏分为两个部分,大家可以各取所好,为了有更好的阅读体验,后面会持续更新!!!

全部评论
如果大家觉得可以帮助到自己,麻烦点赞、评论和订阅哦😀
1 回复 分享
发布于 03-10 21:54 安徽
点赞 回复 分享
发布于 03-12 10:29 江苏

相关推荐

评论
5
25
分享

创作者周榜

更多
牛客网
牛客企业服务