《拉依达的嵌入式\驱动面试宝典》—前言目录篇
《拉依达的嵌入式\驱动面试宝典》—前言&目录篇
你好,我是拉依达。
感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动
相关内容搜索的推荐首位,感谢大家支持。
《拉依达的嵌入式\驱动面试宝典》 最开始我个人的面试学习笔记,里面整合了所有我认为可能遇到的技术面试问题。随着我个人的学习以及参与面试,对内容不断完善。现在我已经步入工作阶段,空闲时间将之前的学习内容进行重新编排整理,并且加入了工作后更新系统的理解。是所有博客中投入最大的一个系列。包含我个人学习中所有的精华内容,希望可以最大限度的帮助到你。
所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到独一无二。
其中包含嵌入式软件开发、嵌入式驱动开发、linux驱动开发等职位遇到的所有技术方向问题。**尤其是对驱动等底层问题的解析,适合准备相关工作或者学习提升的同学 **
目前已经整理问题及其回答436个,后续遇到新问题也会不断追加更新。
《拉依达的嵌入式\驱动面试宝典》目录
第1章 C/CPP基础
1.1 编译
- 头文件的两种包含方式的区别
- 动态库(.so/.dll)与静态库(.a/.lib)的区别
- 简述gcc编译过程
- 静态链接和动态链接
- 动态库内的内存分配
- C提高编程技巧
- C模块划分
- 统计数值中1的个数
- 对某一位置1或置0
- 对指定地址存储数据
- c语言运算符优先级
- C语言面向对象实现多态
- C++代码优化?
1.2 内存
- 堆和栈的区别?
- 哈希冲突?
1.3 基础
- main函数的返回值
- main函数执行前后
- “\n” 和 endl 的区别
- 命名空间std
- 初始化和赋值
- 局部变量和全局变量
- 操作系统和编译器是怎么知道变量是全局还是局部?
- 变量的静态存储和动态存储
- 函数返回引用
- this指针
- 为什么静态成员函数不用this指针?
1.4 关键字
- 指针和引用
- 定义变量
- 野指针和悬空指针
- void* 类型指针
- 指针和数组名的区别
- 数组指针和指针数组
- 函数指针和指针函数
- 函数名和数组名
- 指针的自加
- 前缀++和后缀++的效率
- sizeof计算变量大小
- sizeof 计算空类的大小
- sizeof 与 strlen 区别
- strcpy 与 memcpy 区别
- strcat、strncat、strcmp、strcpy哪些函数会导致内存溢出?如何改进?
- new/delete 与 malloc/free 关系
- new失败会出现什么情况?
- malloc、calloc、realloc的区别
- extern
- extern “C”
- define 和 typedef 的区别
- define 和 inline 的区别
- C++中inline编译限制
- 内存对齐原因
- 结构体内存对齐
- 结构体对齐举例
- 联合体内存对齐
- 位域
- C结构体、C++结构体、C++类的区别
- 结构体和联合体区别
- volatile
- 一个参数可以既是 const 又是 volatile 吗
- C++的mutable和volatile
- explicit
- static
- 静态数据成员与全局变量相比的优势
- 简述static对于工程模块化的作用。
- const作用
- const在函数名中的修饰
- const和指针(指针常量、常量指针)
- 顶层const和底层const
- const形参和实参
- const和constexpr
- constexpr的好处:
- const 与 #define
- const和static
- using声明,改变派生类继承成员的访问级别
- 运算符重载
- lambda 表达式
- CPP三大 lambda表达式的捕获方式?
1.5 特征
- CPP访问权限
- CPP 封装
- 空类的大小
- CPP中对象优化
- CPP 继承
- 继承后成员的内存分布
- 继承的隐式转换
- 虚继承和多继承
- 多重继承与虚继承以及消除二义性方法
- 多继承中构造函数的调用顺序
- CPP 多态
- 重载与重写
- 构造函数和析构函数
- 构造函数不能被继承
- 构造函数不能声明为const
- =default 和 =delete
- 什么时候调用拷贝构造函数
- 浅拷贝和深拷贝
- 拷贝构造函数与赋值函数的区别
- 初始化类的成员方式
- 初始化列表和拷贝构造函数内赋值区别
- 必须使用初始化列表情况
- 初始化顺序
- 友元
1.6 虚函数
- 虚函数
- override
- final
- 回避虚函数
- 虚函数实现多态
- 静态联编和动态联编
- 构造函数不能是虚函数
- 析构函数可以是虚函数
- 虚析构函数防止内存泄漏
- 在构造函数和析构函数内调用虚函数
- 纯虚函数
- CPP接口
- inline, static 函数都不能带有virtual关键字
1.7 智能指针
-
- shared_ptr
-
- unique_ptr
-
- weak_ptr
- 智能指针循环引用造成内存泄漏
1.8 CPP强制类型转换(显示转换)
1.9 STL
- C++的 STL分类
- STL六大组件
- STL容器分类
- STL优点
- vector的clear()函数?
- vector的resize和reserve的区别?
- vector三个迭代器
- vector 扩容
- vector动态扩容用的是深拷贝还是浅拷贝?
- vector中push_back和emplace_back的区别?
- vector释放空间
- vector 与 list 区别
- vector 与 deque区别
- stack栈 和 queue队列
- priority_queue:
- map与unordered_map
- 为何map和set的插入删除效率比其它序列容器高,而且每次insert之后,以前保存的iterator不会失效?
- 红黑树
- unordered_map底层为什么用红黑树而不是平衡二叉树(AVL)
1.10 C++11
- auto、decltype和decltype(auto)的用法
- nullptr
- 智能指针
- lambda表达式(匿名函数)
- 基于范围的for循环
- 右值引用
1.11 C/CPP获取文件大小的函数
第2章 计算机硬件
2.1 计算机结构
- 冯诺依曼结构中,计算机硬件由什么组成?
- 什么是哈佛结构和冯诺依曼结构?
- 计算机中,32bit与64bit有什么区别
- DMA作用
- RISC和CISC的区别
- 为什么要区分指令cache和数据cache
- iCache和dCache一致性
- 多个 CPU 核心各自 Cache 的一致性
- Cache 的 MESI 协议
- 有cache的CPU上使用DMA如何保证数据的一致性(缓存一致问题)
- RAM是什么?
- ROM是什么?
- 什么是大端和小端?
- 大小端各自的优点是什么?
- 判断大端小端?
- 如何对绝对地址0x100000赋值?
- 判断机器是32位还是64位的方法
- 缓冲技术的作用是?
- 芯片选型考虑哪些因素?
2.2 ARM硬件
- 什么是ARM流水线技术?
- ARM有几种工作模式?
- ARM指令集分为几类?
- Arm处理器有几种工作状态?
- STM32 中断是怎么进入到中断服务程序的
- FLASH存储
2.3 通信协议
- IO口工作方式
- 同步通信和异步通信的区别
- UART串口协议
- 编写一个通用型串口接收程序,如何实现判断未知设备的端口号和波特率?
- 串口如何发送浮点型数据?
- UART和TTL、RS-232、RS-485的关系?
- 什么是MSB,什么是LSB?
- uart如何保证数据传输的正确性?
- 为什么UART串口通信要16倍过采样数据?
- 请列举常用的串行通信方式(两种以上),并简述串行通信和并行通信不同之处、优缺点。
- RS232和RS485通讯接口有什么区别?
- SPI是什么?有几条线?几种模式?
- SPI四种模式,简述其中一种模式,画出时序图
- SPI优缺点
- 请说明总线接口USRT、I2C、USB的异同点
- I2C协议
- IIC协议时序图
- IIC总线在传送数据过程中共有三种类型信号:
- I2C工作流程
第3章 操作系统
3.1 进程线程管理
- 操作系统定义?
- 操作系统组成?
- 内核组成?
- 进程的生命流程
- 进程描述符 task_struct
- 进程家族树
- 进程的退出
- 什么的进程?什么是线程?
- 进程的组成
- 进程和线程的区别?
- 什么时候用多进程?什么时候用多线程?
- 多进程、多线程同步(通讯)的方法
- 线程可以独立运行吗?一个线程崩溃会导致整个进程崩溃吗?
- 不同线程之间不共享的内容?
- Linux进程状态
- select、poll 和epoll的区别
- join和detach的区别?
- fork()和vfork()的作用以及区别
- 子进程从父进程继承的资源有哪些?
- cpu处理器的三种活动情况
- 什么是进程上下文、中断上下文?
- 进程上下文切换的时机
- 什么是僵尸进程,孤儿进程,守护进程?
- 如何清理僵尸进程?
- 如何防止僵尸进程过多导致系统空间爆满?
- 如何防止同时产生大量的线程?
- 内核线程
- 内核线程和进程的区别
- 内核线程多线程模型
- 什么是线程和用户态线程(协程)?
- 线程和用户线程的区别?
- 为什么要用红黑树来组织调度实体?
- m个资源,每个进程x个资源,最多几个进程参与不会死锁?
3.2 内存管理
- Linux 进程间内存
- Linux 进程用户空间内存管理
- 分段和分页?
- Linux的页表有几级?
- 为什么堆的空间是不连续的?
- 什么是用户栈和内核栈?
- 内存管理MMU的作用?
- 虚拟内存?
- 块与页有什么关系?
- 64位的计算机有哪些优点?
- 什么情况下会栈溢出?如何避免?
- 硬链接与软链接(符号链接)的区别?
- 什么是深拷贝?什么是浅拷贝?
- 说说对MMU及TLB的理解
- 简述处理器在读内存过程中,CPU、MMU、cache、内存如何协同工作?
- 在有数据cache情况下,DMA数据链路为:
- 虚拟地址怎么转换到物理地址
- 什么是内核空间,用户空间?
- 什么是内核态和用户态?
- 两个进程的内核空间是共享的吗?
- 逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别?
- 内存分段和分页的优缺点
- 内存零头、外零头、内零头?
- 什么是内存系统中的伙伴?
- 伙伴系统如何分配内存?
- Linux 下怎样分配物理内存页面?
- 伙伴系统的缺点:
- slab层
- slab 能解决什么问题?
- 什么是slab对象 ?
- SLAB 分配对象的过程
- VMA虚拟内存区域
- 函数mmap的实现原理?
- malloc和calloc的区别
- 内核程序中申请内存 kmalloc() vmalloc() ?
- 内核程序中申请内存和应用程序时申请内存有什么区别?
- malloc()函数的实现原理
- malloc频繁调用产生的内存碎片怎么解决?
- 操作系统中的缺页中断是什么?
- 缺页中断和一般中断的区别?
- 页面置换算法?
- OS缺页置换算法如何实现的?(缓存回收)
- 进程写硬盘时,内存和硬盘缓存策略
- 在1G内存的计算机中能否malloc(1.2G)?为什么?
3.3 死锁
- 什么是死锁?死锁的原因
- 死锁产生的必要条件?
- 预防死锁方法
3.4 RTOS
- 什么是优先级反转?
- 如何解决优先级翻转?
- 在FreeRTOS中,二值信号量和互斥量的区别?
- 在FreeRTOS中,任务通知的运行机制是怎么样的?
- 简述实时操作系统和非实时操作系统的区别?
- 硬实时系统和软实时系统
3.5 中断
- 中断
- 中断处理函数
- 中断分为哪两种?中断和异常的区别?
- 中断函数的注册
- 硬中断(上半部) / 软中断(下半部)是什么?
- 硬中断 / 软中断区别什么?
- 中断向量是什么,中断向量表又是什么?
- 简述处理器中断处理的过程。
- 中断服务程序能不能有参数和返回值?
- 在中断服务程序里面的互斥是使用自旋锁还是信号量?
- 请你讲一讲Linux中断的原理和开发方法?
- 软中断的执行
- 工作队列执行
- 中断与DMA有何区别?
- 写一个中断服务程序需要注意哪些地方?
- 中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?
- 中断能不能睡眠,为什么?
- linux中时间管理
- 时钟中断
- 高节拍率的优劣势
- linux定时器
- 内核延迟执行
- 下面中断服务函数(ISR)的问题
3.6 文件系统
- 什么是虚拟文件系统vfs?
- vfs的工作流程
- VFS 的数据结构:
- vfs和sysfs 的关系和区别
3.7 进程调度
- 进程调度算法?
- IO消耗模型和处理器消耗模型
- linux进程优先级
- linux进程调度
- CFS完全公平调度算法
3.8 内核同步
- Linux内核有哪些同步方式?
- 同步IO和异步IO
- 进程间通信方式
- 线程间同步方式有哪些?
- 线程间同步方式有哪些?
- 自旋锁和信号量在互斥使用时需要注意什么?
- linux的锁机制?
- 请问单核机器上写多线程程序,是否需要考虑加锁,为什么?
- 互斥锁与信号量的区别?
- 乐观锁和悲观锁?
第4章 计算机网络
4.1 网络结构
- 网络为什么要分层呢?
- 计算机网络模型
- TCP/IP 网络模型封装格式
4.2 Linux网络结构
- Linux网络协议栈
- Linux发送网络包流程
- Linux接收网络包流程
- 输入网址到网页显示发生了什么?(HTTP请求过程)
4.3 DNS
- DNS
- DNS工作原理
- DNS两种查询方式:递归查询和迭代查询
- 为什么DNS域名解析用UDP协议?
4.4 TCP/UDP
- TCP可靠性保证
- TCP建立连接过程(三次握手)
- 为什么需要三次握手
- TCP取消连接的过程(四次挥手)
- 挥手为什么需要四次
- 为什么区域传送用TCP协议?
- 什么是TCP粘包/拆包?发生的原因?
- TCP,UDP的区别是什么?
- TCP,UDP的优缺点是什么?
- TCP UDP适用场景
4.5 HTTP
- HTTP长连接和短连接的区别
第5章 Linux基础操作
- 介绍下常用的gdb命令
- vi编辑器常用命令
- linux下检查内存状态的命令
- Linux 操作系统挂起、休眠、关机相关命令
- 说一个linux下编译优化选项:
第6章 Linux 应用编程
- Linux系统的组成部分?
- Linux内核的组成部分?
- Linux系统的挂起、待机、休眠?
第7章 uboot
- uboot启动流程
- uboot和内核如何完成参数传递?
- uboot为什么要给内核传递参数呢?
- uboot 为什么要设置成svc模式?
- uboot 如何设置SVC模式
- uboot为什么关闭中断?
- uboot如何关闭中断?
- uboot 为什么关闭MMU?
- uboot为什么启动ICACHE(指令),关闭DCACHE(数据)
- uboot 为什么清理.BBS段?
- 为什么要进行uboot重定位?
- Bootloader和BIOS、uboot和grub和bootmgr的区别?
第8章 Linux 驱动编程
- 驱动设计思想
- Linux驱动程序的功能是什么?
- Linux驱动程序的分类有哪些?
- Linux中引入模块机制有什么好处?
- Linux 驱动有两种运行方式
- Linux内核驱动模块
- 模块操作命令
- linux内核中EXPORT_SYMBOL宏和EXPORT_SYMBOL_GPL宏的作用
- 用户空间与内核通信方式有哪些?
- 系统调用的作用?
- 系统调用与普通函数调用的区别
- 在Linux中,应用程序使用系统调用的流程:
- 设备模型
- sysfs文件系统
- sysfs作用
- 内核IO模型
- 提高I/O性能的方法
- 阻塞IO
- 非阻塞IO
- 异步IO
- 信号驱动IO
- 异步IO和信号驱动IO的不同
- IO多路复用
- 上层应用如何调用设备驱动
- Linux下应用程序和驱动程序的关系
- Linux下应用程序调用驱动程序流程
- 字符驱动模型
- 字符驱动初始化步骤
- pinctrl子系统作用
- GPIO子系统
- Platform设备驱动框架
- Platform总线设备驱动模型的匹配过程
- INPUT子系统
- 输入子系统的优点
- UART驱动
- I2C驱动组成
- I2C子系统的初始化流程
- I2C驱动实现的两种思路
- 块设备驱动
- 如果两个进程,都要去调用一个设备驱动,设备驱动里面定义的变量是在内核态吗?如果进程A访问并改变了这个变量,那么进程B再访问,是不是读到改变之后的值?
- 驱动程序里面,如果有一个buffer,在不同场景下需要定义不同大小,怎么办?
- 简单描述linux设备驱动中的总线,设备和驱动的关系。
- 交叉编译器的作用
- 为什么使用交叉编译器
- 主设备号与次设备号的作用
- /etc/inittab,/etc/fstab,/etc/init.d/rcS 的作用
- 驱动卸载异常可能是由什么原因引起的?
- 用户空间与内核空间有哪些通信方式?
- 可执行映像文件通常由几部分构成,它们有什么特点?
- 内核镜像格式有几种?分别有什么区别?
- Linux驱动开发中,常用的调试方法有哪些?
- linux代码可移植性好
- 内核调试方法
第9章 根文件系统
- 什么是根文件系统?
- 根文件系统为什么这么重要?
第10章 基础算法题
- 快速排序(前序遍历)
- 归并排序(后序遍历)——O(nlogn)
- 反转链表
- strcpy()
- strlen()
- strcat()
- strcmp()
第11章 Linux命令
- 查看端口号
- 查看栈空间的大小
- 动态库和静态库的制作
- 查看一个文件中次数出现最多的IP
- 强制刷盘
- GBD命令
- 程序崩了是什么情况?怎么处理?
- 解压和压缩
- 创建文件
- 排查死锁?
- 从一台Linux拷贝文件到另外一台主机?
- Linux查看一个文件大小的方式?
- Linux查看一个进程打开的文件?
- Linux文件权限?
- Linux查看进程的系统调用?
- Linux后台进程?
- Top命令的参数分别是什么意思?
- Linux查看磁盘的大小?