linux 内核空间和用户空间的通讯方式
系统调用、ioctl、netlink、mmap 共享内存、管道 / 命名管道、消息队列、信号、socket。
为什么中断不能睡眠
中断上下文无进程结构体(task_struct),无法被调度唤醒,睡眠会导致系统卡死;且中断需快速执行,睡眠会占用中断资源。
内核的内存分配方式(伙伴系统、slab 等等)
kmalloc 最小内存分配,预期分配 128 字节实际多少?
按内核内存块对齐规则,实际分配 128 字节(部分架构因最小块限制,可能为 256 字节内对齐的 128 字节,无冗余)。
define 和 const 区别,分别什么时候生效?
了解大小端吗,大小端的区别?
cache 一致性?
多核 / CPU 中,保证同一物理地址的 Cache 数据副本一致;靠 MESI/MOESI 硬件协议自动维护,或 dmb/dsb 软件指令辅助同步。
cache 的三级缓存知道吗?
知道:
L1(核心独占,最快最小,分 I/D Cache);
L2(核心独占 / 共享,中速中容);
L3(多核心共享,最慢最大);
逐级缓存数据,降低 CPU 访存延迟。
堆栈区别?
介绍一下 DMA?具体原理是什么?
DMA(直接内存访问):外设无需 CPU 参与,直接与内存传输数据;
原理:CPU 配置 DMA 控制器(地址 / 长度 / 方向),DMA 自主传输,完成后通过中断通知 CPU。
虚拟地址到物理地址的转换?
MMU 的具体工作流程?页表大小?
工作流程:接收虚拟地址→查 TLB(未命中查内存页表)→地址转换 + 权限校验→输出物理地址;
页表大小:32 位系统(4KB 页)二级页表总 2KB,64 位系统按部分页(无固定值)。
进程的上下文包括什么?
进程运行环境,包括用户上下文(寄存器、PC、栈指针、内存映射)和内核上下文(task_struct、内核栈、页表、文件描述符、信号掩码)。
char const p 有什么特点?地址变吗?*
特点:指向的字符串内容不可修改;p 本身地址(指向的目标地址)可修改(如 p++、指向其他字符串)。
Static、volatile 的作用?
结构体和联合体的区别?C 语言位段了解吗?
Define 和 typedef 的区别?
C 语言函数里面如何定义多个名字相同的变量?变量作用域?比如 for 里面进行定义变量?
作用域嵌套(函数内定义变量,if/for 内部再定义同名变量,块内覆盖外部);函数内变量为局部作用域,for 内变量仅在循环内有效,外部变量被块内变量隐藏。
c 的函数的入参是存放在哪里?所有入参都是栈吗?
默认存栈;ARMv8/x86-64 架构前几个参数存寄存器,多余参数存栈,并非所有入参都在栈。
进程是虚拟地址空间的?
进程虚拟地址空间的用户栈 / 内核栈区域,进程创建时由操作系统分配,栈指针管理栈向下生长。
c 语言位段了解吗?
了解;结构体中通过冒号指定成员二进制位数,节省内存,适用于寄存器配置 / 数据压缩,需注意跨字节对齐问题。
define 宏为什么要加括号?
避免宏替换时运算符优先级导致逻辑错误(如#define M(a+b) a + b,加括号(a+b)可规避计算偏差)。
锁的类型有哪些?
自旋锁(中断上下文 / 短持有)、互斥锁(进程上下文 / 长持有)、读写锁(区分读写并发)、条件变量(配合互斥锁)、信号量(多资源同步)。
系统调用用户态到内核态会发生什么?
触发软中断→保存用户态上下文→切换内核栈与页表→执行系统调用服务函数→恢复用户态上下文并返回。
linux 进程通讯方式?
无名管道(父子进程)、命名管道(无亲缘)、信号、消息队列、共享内存、信号量、socket(跨网络 / 本机)。
linux 内核如何获取用户态 pid?
current->pid(当前进程 pid)、current->tgid(用户态线程组 pid);遍历进程链表可获取其他进程 pid。
linux 内核调度机制?
普通进程用 CFS 完全公平调度器(按虚拟运行时间公平调度);实时进程用 SCHED_FIFO/SCHED_RR 调度器(优先级抢占);高优先级进程优先执行。
linux 驱动第一个被执行的函数如何实现?为什么有了 init 和 exit 就会去执行对应的函数?
module_init()/module_exit()函数,为实现这个执行,rmmod 时执行 exit。
32 位的 linux 的虚拟内存空间的分布情况?高端内存映射区是什么?他的地址是什么?
分布:0x00000000~0xBFFFFFFF(3GB 用户空间)、0xC0000000~0xFFFFFFFF(1GB 内核空间);
高端内存映射区:内核空间 0xF8000000~0xFFFFFFFF,映射超过 896MB 的物理内存,解决内核直接寻址不足。
用户态堆栈在系统调用时会发生什么变化吗?
用户态堆栈本身不变,CPU 会将用户态栈指针、PC 等寄存器保存到内核栈,系统调用返回后恢复用户态栈指针。
Arm v8 有多少个寄存器?有几种模式?异常等级有几种?工作模式有哪些?arm 上电复位后进入哪种模式?
31 个通用 64 位寄存器 + PC+PSTATE;
模式:EL1h/t、EL2h/t、EL3h/t(h = 句柄态,t = 线程态);
异常等级:4 种(EL0~EL3);
工作模式:安全 / 非安全模式;
复位进入 EL3(安全监控模式)。
知道哪些调试方法?gdb 调试怎么调用函数?怎么设置打印 16 位的变量?怎么跟踪变量,变量值改变时自动提示?如何设置断点?死机后怎么办?
调试方法:gdb、kdb、printk、kmemleak、ftrace、crash、串口打印;
call 函数名 (参数);p/x (uint16_t)变量;watch 变量(写)/rwatch(读);b 行号/函数名;知道 ftrace 吗,知道怎么用吗?
知道(函数跟踪);挂载跟踪器(echo function > current_tracer)→开启跟踪(echo 1 > tracing_on)→执行操作→停止跟踪→cat trace查看结果。
Linux 操作系统的三大块了解吗?
了解;内核(进程 / 内存 / IO 管理)、根文件系统(用户程序 / 配置 / 库)、引导加载程序(U-Boot/GRUB,加载内核驱动)。
现在让你开展一个项目,主要负责生物语音识别,你该怎么开展,需要考虑哪些因素?
开展步骤:需求分析→技术选型(模型 / 框架 / 平台)→数据采集预处理→模型训练优化→部署测试→迭代;
考虑因素:识别精度、实时性、硬件资源、功耗、数据隐私、兼容性、稳定性。
什么时候毕业?
I will graduate in June 202X.
毕业了什么时候能到岗?
I can join the company immediately after graduation, or as early as mid-June 202X if required.
有那么多候选人,给我几个理由让我把 offer 给你?
First, I have solid professional knowledge (Linux kernel, embedded development) and rich project experience to quickly adapt to the job. Second, I have strong problem-solving ability in technical issues like driver stability. Third, I am eager to learn and can bring long-term value to the team.
-End- 读到这里说明你喜欢本公众号的文章,欢迎 置顶(标星)本公众号 Linux技术迷,这样就可以第一时间获取推送了~ 在本公众号 Linux技术迷,后台回复:Linux,领取2T学习资料 ! 推荐阅读 1. Linux 中 find 命令的 35 个实际例子 2. 重温计算机简史:从石头计数到计算机 3. Linux 学习指南 (收藏篇) 4. 2万字系统总结,带你实现Linux命令自由