23. 驱动开发与操作系统(52道)***2***
2.操作系统(39道)
高响应比优先。
2.6 I/O子系统层次结构
从上到下依次是用户层I/O软件,设备独立性软件,设备驱动程序,中断处理程序。
2.7逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别?
(1)逻辑地址:与内存段相关的偏移地址部分。例如,在C语言获取指针变量的值,就是逻辑地址,不和绝对的物理地址相关。
(2)线性地址:线性地址 = 逻辑地址 + 基地址。
(3)物理地址:如果启用了分页机制,那么线性地址使用页表项变换后就是物理地址。如果没有启用分页机制,那么线性地址就是物理地址。
(4)总线地址:x86下的I/O地址,ARM下的物理地址。(在x86下,外设的I/O地址是独立的,即有专门的指令访问外设I/O,I/O地址就是“总线地址”,而RAM地址就是“物理地址”。在ARM下,I/O和RAM统一编址,但linux为了统一各个平台,仍然保留这个概念,总线地址其实就是物理地址。)
(5)虚拟地址:MMU虚拟出来的地址。
2.8操作系统的内存分配一般有哪几种方式,各有什么优缺点?
(1)分页存储管理:优点是不需要连续的内存空间,且内存利用率高(只有很小的页内碎片);缺点是不易于实现内存共享与保护。
(2)分段存储管理:优点是易于实现段内存共享和保护;缺点是每段都需要连续的内存空间,且内存利用率较低(会产生外部碎片)。
2.9用户空间与内核空间有哪些通信方式?
系统调用接口SCI(API) |
用户空间进程通过系统调用接口访问指定的内核空间数据。 |
信号 |
内核空间出现一些异常时会发送信号给用户空间进程。 |
proc文件系统 |
是一种特殊的伪文件系统,是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到这个目录树中,用户可通过echo或cat这样的命令对系统信息进行修改和查询。 |
共享内存mmap |
将内核空间的地址映射到用户空间。 |
netlink |
类似socket的通信方式,可以读写大量数据。 |
2.10用户进程调用 read()/write() API时,内核做了哪些事情?
用户进程调用read()/write()后进入内核空间 -> 调用内核的sys_read()/sys_write()函数 -> 内核函数进一步调用fop.read()/fop.write()指向的函数,也就是驱动程序里具体的读写函数。
2.11系统调用的作用?
(1)为应用程序提供访问硬件资源的统一接口,以至于应用程序不必关心具体的硬件操作细节。
(2)对系统内核进行保护,保证系统的稳定和安全,因为系统调用规定了用户进程进入内核的具体方式以及所能访问的数据范围。
2.12 BootLoader、Linux内核、根文件系统的关系?
(1)系统一上电,就执行BootLoader来初始化处理器及外设,将系统的软硬件环境带到一个合适的状态。
(2)然后将Linux内核、根文件系统从非易失性存储器读取到内存中并执行Linux内核。
(3)Linux内核完成初始化之后就挂载某个文件系统作为根文件系统。
2.13 BootL
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
包含241道笔试面试真题详解,还有岗位及校招介绍,简历制作、笔试准备、面试准备的经验分享,以及嵌入式软件工程师技能树解读。你想知道的所有关于嵌入式求职的问题,几乎都可以在这里找到答案。 订阅即赠送学习笔记、简历模板、面试提纲模板、内推机会,需要的同学点击我头像私信即可!