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

高通实习面经

技术题

  1. linux 内核空间和用户空间的通讯方式

    系统调用、ioctl、netlink、mmap 共享内存、管道 / 命名管道、消息队列、信号、socket。

  2. 为什么中断不能睡眠

    中断上下文无进程结构体(task_struct),无法被调度唤醒,睡眠会导致系统卡死;且中断需快速执行,睡眠会占用中断资源。

  3. 内核的内存分配方式(伙伴系统、slab 等等)

    • 伙伴系统:管理物理页框,分配大内存,解决碎片;
    • slab/slub/slob:基于伙伴系统,分配小内存,缓存常用对象;
    • vmalloc:分配虚拟连续、物理不连续内存;
    • kmem_cache:slab 的专用对象缓存池。
  4. kmalloc 最小内存分配,预期分配 128 字节实际多少?

    按内核内存块对齐规则,实际分配 128 字节(部分架构因最小块限制,可能为 256 字节内对齐的 128 字节,无冗余)。

  5. define 和 const 区别,分别什么时候生效?

    • define:预处理阶段(编译前)替换,无类型检查,占代码段;
    • const:编译阶段生效,有类型检查,占数据段,不可直接修改。
  6. 了解大小端吗,大小端的区别?

    • 小端:低字节存低地址(ARM/x86 默认);
    • 大端:低字节存高地址(网络协议 / 部分外设)。
  7. cache 一致性?

    多核 / CPU 中,保证同一物理地址的 Cache 数据副本一致;靠 MESI/MOESI 硬件协议自动维护,或 dmb/dsb 软件指令辅助同步。

  8. cache 的三级缓存知道吗?

    知道:

    • L1(核心独占,最快最小,分 I/D Cache);

    • L2(核心独占 / 共享,中速中容);

    • L3(多核心共享,最慢最大);

      逐级缓存数据,降低 CPU 访存延迟。

  9. 堆栈区别?

    • 栈:系统自动分配释放,先进后出,存局部变量 / 参数,空间小且连续;
    • 堆:手动分配释放,无序,存动态数据,空间大且非连续,易产生碎片。
  10. 介绍一下 DMA?具体原理是什么?

    DMA(直接内存访问):外设无需 CPU 参与,直接与内存传输数据;

    原理:CPU 配置 DMA 控制器(地址 / 长度 / 方向),DMA 自主传输,完成后通过中断通知 CPU。

  11. 虚拟地址到物理地址的转换?

    1. 拆分虚拟地址为页目录号、页表号、页内偏移;
    2. 多级页表查找物理页框号;
    3. 页框号 + 偏移组成物理地址;
    4. 转换失败触发缺页异常。
  12. MMU 的具体工作流程?页表大小?

    工作流程:接收虚拟地址→查 TLB(未命中查内存页表)→地址转换 + 权限校验→输出物理地址;

    页表大小:32 位系统(4KB 页)二级页表总 2KB,64 位系统按部分页(无固定值)。

  13. 进程的上下文包括什么?

    进程运行环境,包括用户上下文(寄存器、PC、栈指针、内存映射)和内核上下文(task_struct、内核栈、页表、文件描述符、信号掩码)。

  14. char constp 有什么特点?地址变吗?*

    特点:指向的字符串内容不可修改;p 本身地址(指向的目标地址)可修改(如 p++、指向其他字符串)。

  15. Static、volatile 的作用?

    • static:局部变量延长生命周期,全局 / 函数限制文件内作用域;
    • volatile:告知编译器变量异步修改,禁止优化,直接读取内存。
  16. 结构体和联合体的区别?C 语言位段了解吗?

    • 区别:结构体成员独立占内存(总大小 = 成员 + 对齐);联合体成员共享内存(总大小 = 最大成员);
    • 位段:了解,结构体中用冒号指定成员二进制位数,节省内存(如 uint8_t a:4)。
  17. Define 和 typedef 的区别?

    • define:预处理替换,无类型检查,可定义常量 / 宏函数;
    • typedef:编译阶段,定义类型别名,有类型检查,仅作用于类型。
  18. C 语言函数里面如何定义多个名字相同的变量?变量作用域?比如 for 里面进行定义变量?

    作用域嵌套(函数内定义变量,if/for 内部再定义同名变量,块内覆盖外部);函数内变量为局部作用域,for 内变量仅在循环内有效,外部变量被块内变量隐藏。

  19. c 的函数的入参是存放在哪里?所有入参都是栈吗?

    默认存栈;ARMv8/x86-64 架构前几个参数存寄存器,多余参数存栈,并非所有入参都在栈。

  20. 进程是虚拟地址空间的?

    进程虚拟地址空间的用户栈 / 内核栈区域,进程创建时由操作系统分配,栈指针管理栈向下生长。

  21. c 语言位段了解吗?

    了解;结构体中通过冒号指定成员二进制位数,节省内存,适用于寄存器配置 / 数据压缩,需注意跨字节对齐问题。

  22. define 宏为什么要加括号?

    避免宏替换时运算符优先级导致逻辑错误(如#define M(a+b) a + b,加括号(a+b)可规避计算偏差)。

  23. 锁的类型有哪些?

    自旋锁(中断上下文 / 短持有)、互斥锁(进程上下文 / 长持有)、读写锁(区分读写并发)、条件变量(配合互斥锁)、信号量(多资源同步)。

  24. 系统调用用户态到内核态会发生什么?

    触发软中断→保存用户态上下文→切换内核栈与页表→执行系统调用服务函数→恢复用户态上下文并返回。

  25. linux 进程通讯方式?

    无名管道(父子进程)、命名管道(无亲缘)、信号、消息队列、共享内存、信号量、socket(跨网络 / 本机)。

  26. linux 内核如何获取用户态 pid?

    current->pid(当前进程 pid)、current->tgid(用户态线程组 pid);遍历进程链表可获取其他进程 pid。

  27. linux 内核调度机制?

    普通进程用 CFS 完全公平调度器(按虚拟运行时间公平调度);实时进程用 SCHED_FIFO/SCHED_RR 调度器(优先级抢占);高优先级进程优先执行。

  28. linux 驱动第一个被执行的函数如何实现?为什么有了 init 和 exit 就会去执行对应的函数?

    module_init()/module_exit()函数,为实现这个执行,rmmod 时执行 exit。

  29. 32 位的 linux 的虚拟内存空间的分布情况?高端内存映射区是什么?他的地址是什么?

    分布:0x00000000~0xBFFFFFFF(3GB 用户空间)、0xC0000000~0xFFFFFFFF(1GB 内核空间);

    高端内存映射区:内核空间 0xF8000000~0xFFFFFFFF,映射超过 896MB 的物理内存,解决内核直接寻址不足。

  30. 用户态堆栈在系统调用时会发生什么变化吗?

    用户态堆栈本身不变,CPU 会将用户态栈指针、PC 等寄存器保存到内核栈,系统调用返回后恢复用户态栈指针。

  31. Arm v8 有多少个寄存器?有几种模式?异常等级有几种?工作模式有哪些?arm 上电复位后进入哪种模式?

    31 个通用 64 位寄存器 + PC+PSTATE;

    模式:EL1h/t、EL2h/t、EL3h/t(h = 句柄态,t = 线程态);

    异常等级:4 种(EL0~EL3);

    工作模式:安全 / 非安全模式;

    复位进入 EL3(安全监控模式)。

  32. 知道哪些调试方法?gdb 调试怎么调用函数?怎么设置打印 16 位的变量?怎么跟踪变量,变量值改变时自动提示?如何设置断点?死机后怎么办?

    调试方法:gdb、kdb、printk、kmemleak、ftrace、crash、串口打印;

    • gdb:call函数名 (参数);
    • 打印 16 位变量:p/x (uint16_t)变量
    • 跟踪变量:watch 变量(写)/rwatch(读);
    • 断点:b 行号/函数名
    • 死机后:分析 core dump、dmesg 日志、crash 工具查内存镜像。
  33. 知道 ftrace 吗,知道怎么用吗?

    知道(函数跟踪);挂载跟踪器(echo function > current_tracer)→开启跟踪(echo 1 > tracing_on)→执行操作→停止跟踪→cat trace查看结果。

  34. Linux 操作系统的三大块了解吗?

    了解;内核(进程 / 内存 / IO 管理)、根文件系统(用户程序 / 配置 / 库)、引导加载程序(U-Boot/GRUB,加载内核驱动)。

  35. 现在让你开展一个项目,主要负责生物语音识别,你该怎么开展,需要考虑哪些因素?

    开展步骤:需求分析→技术选型(模型 / 框架 / 平台)→数据采集预处理→模型训练优化→部署测试→迭代;

    考虑因素:识别精度、实时性、硬件资源、功耗、数据隐私、兼容性、稳定性。

英文问题

  1. 什么时候毕业?

    I will graduate in June 202X.

  2. 毕业了什么时候能到岗?

I can join the company immediately after graduation, or as early as mid-June 202X if required.

  1. 有那么多候选人,给我几个理由让我把 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.

总结题

  1. 技术题核心聚焦 Linux 内核、C 语言基础、硬件架构、调试方法,回答需直击原理,兼顾实操场景;
  2. 英文问题简洁真诚,突出自身专业能力、问题解决能力和学习潜力;
  3. 整体回答符合高通面试的技术深度要求,兼顾简洁性和准确性。
http://www.jsqmd.com/news/499631/

相关文章:

  • AI职业末日图爆火,6000万白领岗危了
  • 深入 Java 垃圾回收调优:从底层原理到落地实战,攻克性能瓶颈
  • 软件综合项目-mqtt
  • ChatGPT和Gemini怎么导出成长图
  • 速看!!安全员ABC证靠谱的查询方式有哪几种?分别是怎么查询呢?
  • 关于密码破解的方式
  • Qt导航栏组件A05:多文档编辑器的「打开文件列表」侧栏
  • 计算机毕设 java 门诊管理系统 Java+SpringBoot 门诊医疗管理平台 Web 版医院门诊诊疗管理系统
  • 基于能量分配的光伏混合储能系统仿真模型 ①光伏:采用mppt控制实现最大功率跟踪 ②蓄电池与超...
  • Vue3 按钮切换示例(启动 / 关闭互斥显示)
  • 动态规划_最长递增子序列_C++
  • 计算机毕设 java 课程教学平台设计与实现 Java+SpringBoot 课程教学管理平台 Web 版在线课程学习管理系统
  • STL:string
  • AI智能水库图像识别数据集 水面漂浮物识别 水面分割识别 河道护栏分割数据集 YOLO格式数据集第10573期
  • 泰思特电子分享_EMC测试电流探头选型差异性及影响因素探讨
  • SPI子系统源码剖析--(2)Spi_Master驱动框架
  • TSMC 28nm工艺库,可仿真-文档齐全
  • Android Studio 安装教程(Windows 超详细图文版)
  • 洛谷:P5744 【深基7.习9】培训
  • 计算机毕设 java 口腔牙科诊所管理系统 Java+SpringBoot 口腔牙科诊疗管理平台 Web 版牙科门诊就医管理系统
  • 16、【Agent】【OpenCode】源码构建(Bun介绍)
  • python-web自动化-selenium(1)
  • OpenClaw常见4大赋能工作场景
  • Python asyncio 调度模型的可视化分析
  • 2026-03-17 每日作战任务:RAG 语料高效切分(Text Chunking)与处理
  • JAVA数据结构 DAY8-堆
  • 大模型的那点事儿
  • 华为OD机试真题精讲:数据单元的变化替换(Python/Java/C++多语言实现)
  • APF 仿真(有源电力滤波器)研究,双PI控制 电压外环 电流内环,SVPWM ip-iq 电...
  • BUUCTF——[GXYCTF2019]禁止套娃解题记录