说明:
- 面试群,群号: 228447240
- 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
- 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
- 博主与大家一起学习,一起刷题,共同进步;
- 写文不易,麻烦给个三连!!!
1.用户空间与内核通信方式有哪些?
答案:
(1)
系统调用。用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据;
(2)驱动程序。用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,以和运行在内核空间的 驱动程序通信;
(3)共享内存
mmap
。在代码中调用接口,实现内核空间与用户空间的地址映射,在实时性要求很高的项目中为首选,省去拷贝数据的时间等资源,但缺点是不好控制;
(4)copy_to_user()
、
copy_from_user()
,是在驱动程序中调用接口,实现用户空间与内核空间的数据拷贝操作,应用于实时性要求不高的项目中。
以及:
procfs(/proc)
sysctl (/proc/sys)
sysfs(/sys)
netlink 套接口
2.系统调用与普通函数调用的区别
答案:
系统调用:
1.
使用
INT
和
IRET
指令,内核和应用程序使用的是不同的堆栈,因此存在堆栈的切换,从用户态切换到内核态,从而可以使用特权指令操控设备
2.
依赖于内核,不保证移植性
3.
在用户空间和内核上下文环境间切换,开销较大
4.
是操作系统的一个入口点
普通函数调用:
1.
使用
CALL
和
RET
指令,调用时没有堆栈切换
2.
平台移植性好
3.
属于过程调用,调用开销较小
4.
一个普通功能函数的调用
3.内核态,用户态的区别
答案:
内核态,操作系统在内核态运行
——
运行操作系统程序
用户态,应用程序只能在用户态运行
——
运行用户程序
当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为
3
级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3
状态不能访问
Ring0
的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0
级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
4.bootloader、内核 、根文件的关系
答案:
启动顺序:bootloader->linux kernel->rootfile->app
Bootloader
全名为启动引导程序,是第一段代码,它主要用来初始化处理器及外设,然后调用
Linux
内核。Linux
内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(
RootFilesystem
),然后加载必要的内核模块,启动应用程序。(一个嵌入式Linux
系统从软件角度看可以分为四个部分:引导加载程序(Bootloader
),
Linux
内核,文件系统,应用程序。)
5.Bootloader启动的两个阶段
答案:
Stage1:汇编语言
(1
)基本的硬件初始化(关闭看门狗和中断,
MMU
(带操作系统),
CACHE
。配置系统工作时钟)
(2
)为加载
stage2
准备
RAM
空间
(3
)拷贝内核映像和文件系统映像到
RAM
中
(4
)设置堆栈指针
sp
(5
)跳到
stage2
的入口点
Stage2:c语言
(1
)初始化本阶段要使用到的硬件设备(
led uart
等)
(2
)检测系统的内存映射
(3
)加载内核映像和文件系统映像
(4
)设置内核的启动参数
嵌入式系统中广泛采用的非易失性存储器通常是
Flash
,而
Bootloader
就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader
。
6.中断怎么发生,中断处理流程
答案:
请求中断
→
响应中断
→
关闭中断
→
保留断点
→
中断源识别
→
保护现场
→
中断服务子程序
→
恢复现场
→
中断返回。
7.Linux 操作系统挂起、休眠、关机相关命令
答案:
关机命令有
halt
,
init 0
,
poweroff
,
shutdown -h
时间,其中
shutdown
是最安全的。
重启命令有
reboot
,
init 6,
,
shutdow -r
时间。
在
linux
命令中
reboot
是重新启动,
shutdown -r now
是立即停止然后重新启动。
8.硬实时系统和软实时系统
答案:
软实时系统:
Windows
、
Linux
系统通常为软实时,当然有补丁可以将内核做成硬实时的系统,不过商用没有这么做的。
硬实时系统:
对时间要求很高,限定时间内不管做没做完必须返回。
VxWorks
,
uCOS
,
FreeRTOS
,
WinCE
,
RT-thread
等实时系统;
9.你了解MMU吗
答案:
现代操作系统普遍采用虚拟内存管理(
Virtual Memory Management
) 机制,这需要
MMU
(
Memory Management Unit
,内存管理单元) 的支持。有些嵌入式处理器没有
MMU
,则不能运行依赖于虚拟内存管理的操作系统。
也就是说:操作系统可以分成两类,用
MMU
的、不用
MMU
的。
用
MMU
的是:
Windows
、
MacOS
、
Linux
、
Android
;不用
MMU
的是:
FreeRTOS
、
VxWorks
、
UCOS……
与此相对应的:
CPU
也可以分成两类,带
MMU
的、不带
MMU
的。
带
MMU
的是:
Cortex-A
系列、
ARM9
、
ARM11
系列;
不带
MMU
的是:
Cortex-M
系列
……
(
STM32
是
M
系列,没有
MMU
,不能运行
Linux
,只能运行一些 UCOS、
FreeRTOS
等等)。
MMU
就是负责虚拟地址(
virtual address
)转化成物理地址(
physical address
),转换过程比较复杂,可以自行百度。
10.程序从堆中动态分配内存时,虚拟内存上怎么操作的
答案:
页表:是一个存放在物理内存中的数据结构,它记录了虚拟页与物理页的映射关系。
在进行动态内存分配时,例如
malloc()
函数或者其他高级语言中的
new
关键字,操作系统会在硬盘中创建或申请一段虚拟内存空间,并更新到页表(分配一个页表条目(PTE
),使该
PTE
指向硬盘上这个新创建的虚拟页),通过PTE
建立虚拟页和物理页的映射关系。
11.常见的几种磁盘调度算法
答案:
读写一个磁盘块的时间的影响因素有:
- 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
- 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
- 实际的数据传输时间
其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。
算法主要有:
1.
先来先服务
电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。
4.请问单核机器上写多线程程序,是否需要考虑加锁,为什么?
答案:
在单核机器上写多线程程序,仍然需要线程锁。因为线程锁通常用来实现线程的同步和通信.在单核机器上的多线程程序,仍然存在线程同步的问题。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。
?