常见Linux嵌入式面试题--Linux操作系统概念

1.Linux内核的组成部分

Linux内核由以下几个主要组成部分构成:

进程管理:负责创建、调度和终止进程,以及处理进程间通信和同步。

内存管理:管理系统的物理内存和虚拟内存,包括分配、回收和页面调度等操作。

文件系统:提供对文件和目录的管理和访问,包括文件的创建、读写、删除等操作。

设备驱动程序:管理和控制硬件设备,通过与硬件交互来实现输入/输出功能。

网络协议栈:支持各种网络协议,如TCP/IP协议栈,用于实现网络通信功能。

系统调用接口:提供给用户空间的接口,允许用户程序请求内核执行特权操作。

2.用户空间与内核通信方式有哪些?

系统调用:用户通过调用特定的系统调用函数向内核发送请求,并将参数传递给内核。内核在执行完相应操作后返回结果给用户。

中断:硬件或软件中断可以触发内核的处理程序,从而与用户空间进行通信。

文件操作:用户可以通过读写特殊文件(如设备文件)与内核进行通信,通过读写这些文件完成特定的操作。

进程间通信(IPC)机制:例如管道、消息队列、共享内存等,允许进程在用户空间之间交换数据,进而实现与内核的通信。

3.系统调用read()/write(),内核具体做了哪些事情

系统调用read()和write()涉及以下主要操作:

用户空间程序调用read()/write()函数并传递相应参数。

内核接收到系统调用请求后,从用户提供的缓冲区中读取或写入数据。

内核对数据进行处理,包括检查权限、验证数据合法性等。如果需要,内核会将数据从内核空间复制到用户空间(read()),或者从用户空间复制到内核空间(write())。

内核返回操作结果给用户空间程序。

4.系统调用与普通函数调用的区别

系统调用与普通函数调用的区别在于执行的上下文和特权级别。系统调用是用户程序向内核请求执行特权操作的一种机制,因此会触发从用户态切换到内核态的过程,并且需要进行权限检查。普通函数调用则在同一个特权级别下执行,不涉及特权操作和切换。

5.内核态,用户态的区别

内核态:

内核态是操作系统内核运行的特权级别。在内核态下,程序可以访问和执行所有的系统资源和指令。内核态具有更高的权限和更大的访问权,可以直接操作硬件设备、修改系统状态和管理系统资源。

在内核态下运行的代码通常是操作系统内核或驱动程序,它们负责处理与系统底层硬件和资源相关的任务,如进程调度、设备驱动、内存管理等。

用户态:

用户态是一般应用程序运行的特权级别。在用户态下,程序只能访问受限的资源,并且受到操作系统的保护,无法直接访问底层硬件或执行特权指令。

在用户态下运行的代码通常是用户应用程序,如文本编辑器、浏览器、游戏等。这些应用程序通常通过操作系统提供的应用程序接口(API)来请求操作系统的服务和资源。

区别:

特权级别:内核态具有更高的特权级别,可以直接访问系统所有资源和指令。用户态下的程序受到操作系统的保护,无法直接访问底层硬件或执行特权指令。

资源访问:内核态下的程序可以直接操作系统资源和硬件设备。用户态下的程序只能通过系统调用等受限的方式来访问系统资源。

安全性:由于用户态受到操作系统的保护,内核态下运行的代码需要经过严格的验证和控制,以防止恶意或错误的操作对系统造成损害。

在正常情况下,大部分应用程序都在用户态下运行,而内核态主要由操作系统内核和驱动程序来执行。操作系统会管理和切换用户态和内核态之间的转换,以确保系统的稳定性、安全性和资源的合理利用。

6. Bootloader、内核和根文件系统之间的关系如下:

- Bootloader(引导加载程序)是位于计算机硬件和操作系统之间的软件,用于初始化硬件设备、加载内核和根文件系统,并将控制权转交给内核启动。Bootloader通常存储在启动设备的引导扇区或其他特定位置。

- 内核(Kernel)是操作系统的核心部分,负责管理和控制计算机的硬件资源,提供各种系统服务和功能。内核是操作系统的基本组成部分,由开发者编写,以可执行文件的形式存在。

- 根文件系统(Root File System)是操作系统中的初始文件系统,包含操作系统所需的基本文件和目录结构。它提供了文件存储、目录管理等功能,是操作系统运行时的基础。根文件系统通常包含/bin、/sbin、/etc、/lib等目录。

在启动过程中,Bootloader的主要任务是将控制权从固件(如BIOS或UEFI)转交给操作系统。具体的Bootloader启动过程如下:

7. Bootloader启动过程:

1. 计算机上电或重启后,固件(BIOS或UEFI)会进行自检和初始化,并加载Bootloader到内存中的指定位置。

2. Bootloader被执行,它首先进行硬件初始化,例如设置内存、存储等设备参数,并加载操作系统内核和根文件系统到内存中的指定位置。

3. 一旦内核和根文件系统加载完毕,Bootloader会设置内核的启动参数(如命令行参数)并跳转到内核的入口点。

4. 控制权转交给内核后,内核开始执行,在初始化阶段完成各种系统配置和资源管理。

5. 内核会挂载根文件系统为系统的根目录,并根据配置加载其他必要的模块和驱动程序。

6. 最后,内核启动第一个用户空间进程(通常是init进程),它负责系统初始化、服务启动和用户程序管理。

整个过程中,Bootloader起到了连接硬件和操作系统的桥梁作用,将控制权从固件传递给内核,并提供必要的参数和加载操作系统所需的文件。

8.大小端

大小端的区别以及各自的优点,哪种时候用。(判断大小端的三种方式)

1. 大小端(Endianness)是指在多字节数据类型存储时,字节序(即字节的排列顺序)的不同方式。主要有两种形式:

- 大端字节序(Big Endian):将高位字节存储在低地址,低位字节存储在高地址。

- 小端字节序(Little Endian):将低位字节存储在低地址,高位字节存储在高地址。

选择使用哪种字节序取决于硬件架构和通信协议的要求。各种字节序各有优点:

- 大端序:易于阅读和理解,对网络通信的兼容性较好。

- 小端序:处理器直接访问最低有效字节,具有更高的效率,适用于大部分现代处理器架构。

判断大小端的三种方式:

- 内存中地址的比较:通过创建一个包含多字节数据的指针,并根据指针所指向的内存地址来判断字节序。

- 联合体(Union):创建一个联合体类型,其中包括一个多字节数据类型和对应的字节型数组。访问并比较字节数组的第一个元素即可判断字节序。

- 位操作:通过将数据类型强制转换为字节类型,然后检查字节的顺序来判断字节序。

9.一个程序从开始运行到结束的完整过程(四个过程)

- 编译(Compilation):将源代码文件转换为可执行的目标代码,通常通过编译器完成。

- 链接(Linking):将目标代码与所需的库函数进行链接,生成最终的可执行文件。链接器将各个模块之间的引用和符号解析为可执行代码。

- 加载(Loading):将可执行文件从存储介质加载到内存中,并为其分配必要的资源。加载器负责解析可执行文件的结构,创建进程并将代码和数据加载到适当的内存位置。

- 执行(Execution):处理器按照指令在内存中的顺序执行程序,执行各个操作,包括数据操作、控制流程和与外部环境的交互。

10.什么是堆,栈,内存泄漏和内存溢出?

堆(Heap)是用于动态分配内存的区域,用于存储程序运行时创建的对象和数据。堆的大小通常由操作系统管理,并通过特定的分配和释放方法(如malloc和free)来进行内存的分配和释放。

栈(Stack)是一种线程专用的内存区域,用于存储局部变量、函数调用、参数和返回地址等临时数据。栈的大小通常较小且有限,由编译器和运行时环境进行管理,自动分配和释放。

内存泄漏(Memory Leak)指的是程序在分配内存后未释放该内存,导致系统中出现无法访问或回收的内存块。内存泄漏会导致内存资源的浪费,并可能导致系统性能下降或崩溃。

内存溢出(Memory Overflow)是指程序尝试使用超过已分配内存空间的部分,可能导致数据覆盖、崩溃或安全漏洞。当程序向栈或堆写入超过其边界的数据时,就可能发生内存溢出。溢出可能导致程序不可预期的行为和安全隐患。

11.堆和栈的区别

堆(Heap)是动态分配内存的区域,用于存储程序运行时创建的对象和数据。堆的大小通常由操作系统管理,并通过特定的分配和释放方法(如malloc和free)来进行内存的分配和释放。堆上的内存分配是手动控制的,没有固定的分配顺序。

栈(Stack)是一种线程专用的内存区域,用于存储局部变量、函数调用、参数和返回地址等临时数据。栈的大小通常较小且有限,由编译器和运行时环境进行管理,自动分配和释放。栈上的内存分配是自动控制的,遵循后进先出(LIFO)原则

主要区别:

分配方式:堆上的内存分配是手动控制的,需要显式地申请和释放内存。栈上的内存分配是自动控制的,由编译器和运行时环境自动处理。

管理机制:堆的内存管理通常由操作系统负责,通过动态内存分配算法来管理堆上的内存。栈的内存管理由编译器和运行时环境负责,通过栈指针控制栈上的内存使用。

大小与生命周期:堆的大小通常较大且灵活,存储动态分配的对象和数据。栈的大小通常较小且有限,存储局部变量和临时数据。堆上的内存可以在程序运行期间一直存在,直到显式释放。栈上的内存随着函数的调用和返回而自动分配和释放。

12.硬链接与软链接的区别;

硬链接是指多个文件名指向同一个索引节点(Inode),它们共享相同的文件内容和属性。删除其中一个硬链接不会影响其他链接,只有当所有链接都被删除时,才会释放磁盘空间。硬链接不支持跨文件系统创建。

软链接是一个特殊的文件,它包含了指向另一个文件的路径。软链接类似于Windows系统中的快捷方式。软链接有自己的索引节点,删除原始文件或软链接都会导致文件不可访问。软链接可以跨越文件系统,并且可以链接目录。

13.虚拟内存,虚拟地址与物理地址的转换

虚拟内存(Virtual Memory)是计算机系统中的一种技术,将物理内存和磁盘之间的交换空间作为逻辑地址空间的延伸。虚拟内存允许程序使用连续的逻辑地址空间,而不需要连续的物理内存空间。虚拟地址是程序中使用的逻辑地址,而物理地址是实际对应于主存中的地址。

虚拟地址与物理地址的转换是通过操作系统的内存管理单元(Memory Management Unit,MMU)实现的。MMU使用页表或段表等数据结构来映射虚拟地址到物理地址。当程序访问虚拟地址时,MMU根据页表或段表的映射关系进行地址转换,将虚拟地址转换为对应的物理地址

14.中断和异常的区别

中断是由外部事件触发的信号,用于中断当前正在执行的程序流程,以处理紧急或优先级较高的任务。中断可以来自硬件设备(如键盘、鼠标、定时器)或其他外部源。中断通常会打断当前正在执行的程序,转而执行中断处理程序,然后返回到被中断的程序继续执行。

异常是指在程序执行过程中遇到的错误或异常情况,例如除零错误、内存访问错误等。异常通常由处理器检测到,并触发相应的异常处理机制。异常可以导致程序的终止或转到异常处理程序进行处理,具体处理方式取决于操作系统或编程语言的实现。

15.中断怎么发生,中断处理流程

发生:中断通常由硬件设备或其他外部源发出一个中断请求信号(IRQ),将控制权转移到中断向量表中对应的中断服务程序。

响应:处理器接收到中断请求信号后,暂停当前执行的指令,保存相关上下文信息(如寄存器状态),并跳转到中断向量表中对应的中断服务程序。

处理:中断服务程序执行与中断相关的处理逻辑,可能包括读取设备状态、处理数据、更新数据结构等。

恢复:中断服务程序执行完毕后,恢复之前保存的上下文信息,将控制权返回到被中断的程序继续执行。

16.Linux 操作系统挂起、休眠、关机相关命令

挂起(Suspend):用于将系统进入低功耗状态,暂停所有活动并保留当前状态。在绝大多数Linux发行版中,使用systemctl suspend或pm-suspend命令来挂起系统。

休眠(Hibernate):将系统当前的状态保存到硬盘,并关闭电源以实现完全的断电。休眠后系统可以恢复到之前的状态。在大多数Linux发行版中,使用systemctl hibernate或pm-hibernate命令来进行休眠操作。

关机(Shutdown):用于安全地关闭操作系统并关闭计算机。在绝大多数Linux发行版中,使用shutdown、poweroff或halt命令来进行关机操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值