当前位置: 首页 > news >正文

《拉依达的嵌入式\驱动面试宝典》—前言目录篇

《拉依达的嵌入式\驱动面试宝典》—前言&目录篇

在这里插入图片描述

你好,我是拉依达。
感谢所有阅读关注我的同学支持,目前博客累计阅读 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 智能指针

    1. shared_ptr
    1. unique_ptr
    1. 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查看磁盘的大小?

http://www.mrgr.cn/news/80185.html

相关文章:

  • 【Golang】Go语言编程思想(六):Channel,第四节,Select
  • react 计算属性
  • 打造高效的HIS与DAT文件解析工具
  • 【Python网络爬虫笔记】11- Xpath精准定位元素
  • 21天掌握JavaWeb-》第16天 - 后端开发与API设计
  • Docker 中使用 PHP 通过 Canal 同步 Mysql 数据到 ElasticSearch
  • 操作系统内存管理
  • c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
  • Leetcode二叉树部分笔记
  • 单片机最小系统
  • Vue 组件化开发:构建高质量应用的核心
  • CA证书的核心解读:它是什么,以及如何发挥作用
  • Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪
  • Python粉色圣诞树
  • 网格算法(Grid Algorithm)及其Python实现
  • 公钥基础设施(PKI)全面解析
  • 【WRF安装】WRF编译错误总结1:HDF5库包安装
  • 学习笔记070——Java中【泛型】和【枚举】
  • C++4--类
  • 前缀和的两种构造方法
  • 【Qt】QWidget中的常见属性及其功能(一)
  • ALOHA 协议详解
  • JAVA学习(三)
  • CTFshow-文件包含(Web78-88,Web116,117)
  • 1.5 多媒体系统简介
  • Flink CDC实时同步mysql数据