嵌入式高频八股:操作系统篇

启动流程

为什么两次初始化DDR

  1. 第一次是BOOTLOADER初始化DDR,使其从不可用到可用,保证可以正常的引导和加载操作系统,会将UBOOT的BL1从FLASH中拷贝到DDR中执行。
  2. 第二次是LINUX启动过程中对DDR进行更加细致的初始化,并且将DDR的内存配置与内核的内存管理需求匹配。

UBOOT启动流程

【ARM-LINUX开发】U-BOOT启动过程--详细版的完全分析 - ZHANGPYI - 博客园 (CNBLOGS.COM)

中断

中断类型

  • 中断
    • 可屏蔽
    • 不可屏蔽
  • 异常
    • 陷阱(TRAP) 系统调用、信号
    • 故障(FAULT) 缺页异常
    • 错误

GIC中三种中断

  • SPI 共享外设中断
  • PPI 私有外设中断
  • SGI 软件生成中断

SGI通过软件向GIC的SGIR寄存器写值来产生中断,GIC根据内容分发给特定核心

ISR中断服务函数

ISR(INTERRUPT SERVICE ROUTINE),即中断服务程序,是处理器在响应硬件中断时执行的特殊函数。它用于处理硬件事件,并在完成后返回正常的程序执行流。ISR是嵌入式系统和实时操作系统中的关键组件。

  • 快速执行
  • 不使用阻塞操作
  • 避免使用全局变量
  • 嵌套中断

软中断

LINUX中断(INTERRUPT)子系统之五:软中断(SOFTIRQ)-阿里云开发者社区 (ALIYUN.COM)

软中断与软件中断

软中断 软件中断
用途 LINUX内核提供的延时处理机制
分离较为复杂的工作推迟处理
系统调用、异常处理、虚拟化环境通信
触发方式 硬中断或者其他部分触发 特定指令触发
执行环境 特定调度时机 中断上下文

硬件怎么告诉驱动信息来了

中断。继续回答中断的流程。一般是通过一个硬件引脚,发送给GIC控制器,然后捕获这个中断信号,GIC管理优先级排序和消息分发给对应的CPU,然后CPU会进入中断处理函数处理,这个函数一般是驱动注册的回调函数去区里,然后清除掉中断,CPU恢复继续去执行

中断初始化时需要设备树信息,是不是需要去解析它

是的。 在嵌入式系统中,设备树通常用于描述硬件配置,如中断控制器、GPIO、中断号等。当一个设备驱动初始化时,它会从设备树中提取相关的硬件信息,这包括中断相关的属性。具体步骤大致如下:

  1. 设备树节点描述:设备树中每个设备节点都可能包含中断信息,通常使用属性如 INTERRUPTSINTERRUPT-PARENT。中断控制器也通过设备树节点描述其类型和配置。
  2. 解析设备树:内核启动时,内核设备树解析器会根据设备树的内容建立硬件信息,特别是中断控制器的信息。然后设备驱动可以通过特定的 API 来读取和解析设备树中的中断号和触发类型。
  3. 调用 DT 解析 API:LINUX 内核提供了相关 API,比如 OF_IRQ_GET()IRQ_OF_PARSE_AND_MAP() 等,这些函数帮助驱动从设备树中提取和映射中断号。驱动程序会调用这些 API 获取设备树中的中断信息。
  4. 中断注册:在解析出设备树中的中断信息后,驱动程序会使用 REQUEST_IRQ() 等 API 注册中断处理函数。

中断中为什么不可以睡眠?

面试官:为什么在中断里不能 SLEEP | LINUX 内核 - 知乎 (ZHIHU.COM)

  1. 中断是在中断上下文中,与任何的进程上下文无关
  2. 内核代码里有大量的 CRITICAL SECTION (临界区),如果想要支持 CALL SCHEDULER 的话,那么所有的 CRITICAL SECTION 都必须得禁用中断,否则硬件中断一旦来临系统就会出现 RACE CONDITION,接下来大概率是死锁。但是这样的中断响应延迟就很大。

内存管理

内存碎片的类型

  • 外部碎片:内存有足够的内存,但是由于空闲空间被分成多个不连续小块,无法满足分配大的内存空间
  • 内部碎片:分配的内存块比实际需求大的多,多出来的部分无法使用

内存碎片产生的原因、有哪些场景产生、怎么解决

产生原因:

  • 外部碎片:内存有足够的内存,但是由于空闲空间被分成多个不连续小块,无法满足分配大的内存空间
  • 内部碎片:分配的内存块比实际需求大的多,多出来的部分无法使用

场景:

  • 频繁的动态分配和释放内存
  • 操作系统分配内存可能产生碎片
  • 虚拟内存系统将物理内存映射到虚拟地址空间时

解决方式:

  • 优化算法
    • 首次适配(FIRST FIT):找到第一个能满足要求的空闲块进行分配。
    • 最佳适配(BEST FIT):找到最接近所需大小的空闲块进行分配,减少外部碎片。
    • 最坏适配(WORST FIT):找到最大的空闲块进行分配,尝试保留大块空间以减少未来的外部碎片。
  • 伙伴算法
  • SLAB算法
  • 垃圾回收
  • 内存压缩:适当的时候进行整理
  • 内存池

伙伴算法的优缺点

优点

  • 分配速度快,分割和合并效率简单高效
  • 减少外部碎片
  • 内存对齐 缺点
  • 依旧存在内部碎片
  • 内存利用率不高(内部碎片的问题)
  • 复杂性

环形缓冲区怎么判断空、满

环形缓冲区有BEGIN END两个指针,当

  • 空 BEGIN=END
  • 满 BEGIN->NEXT=END

内存泄漏

总的来说一句话,分配了内存没有释放。

  • NEW 没有FREE
  • 循环引用,计数器无法归零
  • 丢失指针

解决办法:

  • 分配后释放
  • 智能指针
  • 避免循环引用

工具:

  • ADDRESSSANITIZER
  • VALGRIND

内核空间与用户空间之间的内存拷贝

通过COPY_TO_USER()COPY_FROM_USER,在拷贝的时候会进行地址的检测,是否指向有效的用户空间内存区域,以及确保访问不会越界。然后操作系统内核会使用 CPU 的特权模式来访问用户空间的内存地址。因为进入内核的时候页表不会改变,依旧用的是用户进程的页表(所有进程的内核空间映射是同一个位置,用户态进入内核态不需要切换页表)。这些地址通过 MMU 进行转换,映射到物理内存,然后内核通过物理内存地址进行读写操作。由于用户空间的内存地址可能是虚拟地址,内核需要通过页表进行转换,找到对应的物理地址。这个过程是由硬件 MMU 和操作系统联合完成的。

总结:通过特定函数,内核以特权模式直接向用户空间虚拟地址指向的物理地址进行拷贝。

应用层随便写个地址,内核是怎么检测出异常的

进程在创建的时候会先将分配好自己所需要的虚拟地址空间,但是此时并没有对实际的物理地址分配映射,后续需要的时候才会分配,所以可以区分下面两种来对检测异常做解释:

  • 缺页异常:发现需要访问的地址在已经分配的虚拟地址空间内,但是没有映射到物理地址,就会触发缺页异常,然后分配物理地址做出映射,放到页表中方便后续使用。
  • 段错误:发现需要访问的地址超出了虚拟地址的空间,或者超过了堆栈的范围,或者是访问的页面权限不符,就会认为是一个错误地址。

IOMMU的作用与意义

作用:

  1. 地址转换:
    • IOMMU 为 I/O 设备提供虚拟地址空间支持,类似于 CPU 使用 MMU 来管理进程的虚拟地址空间。IOMMU 将设备发出的虚拟地址转换为物理地址,使设备可以访问系统内存,而不需要知道物理内存的实际布局。
    • 这种地址转换还允许设备在被重新配置时,不需要修改其所使用的内存地址,只需修改 IOMMU 的映射即可。
  2. 内存保护:
    • IOMMU 提供了一个安全层,通过限制设备可以访问的内存区域,防止设备意外或恶意地访问其他进程或内核空间的内存。
    • 这种保护对防止 DMA(DIRECT MEMORY ACCESS,直接内存访问)攻击特别重要,因为攻击者可能试图利用 DMA 设备直接访问内存,从而绕过操作系统的安全机制。
  3. 设备隔离:
    • 在虚拟化环境中,IOMMU 可以帮助实现虚拟机对物理设备的隔离。它允许虚拟机使用物理设备的虚拟化版本,同时确保这些设备只能访问分配给它们的内存区域。
    • 这种隔离对于确保虚拟机之间的安全性至关重要,因为它防止了一个虚拟机能够通过设备访问其他虚拟机的内存。
  4. 提高系统性能:
    • 在多核和多设备的复杂系统中,IOMMU 可以优化内存访问路径,使得 I/O 操作更高效,减少 CPU 处理内存访问的负担。
    • 通过 IOMMU,设备可以直接访问系统内存,而无需通过中介或额外的内存拷贝,这种直接访问(DMA)可以显著提高数据传输速率。

意义:

  1. 安全性增强:
    • IOMMU 是现代计算机系统安全架构中的关键组成部分。它通过防止设备对不安全内存区域的访问,大大提高了系统的安全性。尤其是在

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

1. 自我介绍:高通、Oppo(sp)、vivo(sp)、小米(ssp)、荣耀(26k*12+80k)、华子(报批中)、美团、韶音、经纬恒润、乐鑫、中兴、TP 2. 内容: 1.嵌入式学习的资料和路径 2.所有面试的题目和解答(持续更新)、对评论的快速解答 3.各种碎碎念 3.整理不易,buy me coffee☕️,为了回馈牛客和各个粉丝,文章都会先试读几天,热度过了再收录~

全部评论

相关推荐

06-21 10:17
门头沟学院 Java
-- 小计 今年3月底,硕士毕业了。经历了秋招、春招的磨练,面试次数差不多有60多次,最终有幸进了某教育厂,拿了大厂的白菜价。就今年的行情,对于我一个双非硕士,已经是很不错的of了。回顾读研的过程,一路走来,真的不算容易!我是一个在家长眼里的懂事的孩子,在老师眼中的好学生,这便是我的人设,我至今还没跳出这个圈。话说回来,研一对读研生涯充满了期待,我自认为自己肯吃苦、肯努力、有拼劲,我渴望在读研期间长见识、长本领、认识一群优秀的人,我这么想只能说太天真。没错,我总是那么天真、甚至有些傻哈哈。研一刚开始跟着老师做项目,为一个国企开发一套OA管理平台,本以为很吊,心想肯定不少学东西,实际上不仅技术栈与求职技术脱节,而且团队很不规范,学校和国企、老师和企业员工,大家相互扯皮。而我,自认为是个责任心比较重的人,有些可干可不干的事,我却还真干,给一点点酬劳,使劲压榨学生,和老师抱怨也是自讨没趣。读研的经历只能说谁读谁知道。学校项目一直干到研二上学期末,研二上学期是最忙的,我们团队的女同学甚至熬了个通宵,我也出了不少力,还给团队搭了一个gitlab,配置了自动化部署。不能说没收获,代码能力也得到了提高,前后端也都会了,主要是扯皮太多,破事太多,太搞心态。之后研二下学期,从24年3月份开始,我和我的好伙伴三个人天天抱团去图书馆,改简历、背八股、做项目、刷算法、投实习。到了4月底陆陆续续都找到了实习,我是4月25号先去了某军工企业实习,实习的氛围很好,早9晚6,早中午管饭,待了两个多月,团建了3次,还打了人生第一次真人CS,真的体验不错,唯一不足就是成长不大,做的都是crud,也没什么中间件。后来,我一边干着一边找,跳槽到了一个大模型社交公司,这公司确实是互联网的风格,节奏快,我第一次知道还有code review,待了2个月,实习工资给的也不少,还有房补,唯一难熬的是当时第一份实习是在海淀区四季青附近租房,第二份实习地点是在望京,每天通勤将近4个小时,先骑单车到地铁站,之后坐地铁到公司附近地铁口,再转公交10分到公司,就这样我熬了一个月。期间房子还有蟑螂,女租户毛病还贼吉儿多,歪日。那一阵,每天坐地铁看谁都是煞笔,身上充满了戾气。不过,在这个公司确实有收获,各方面也正规了,接触到了一些主流的工具,强度也确实不小,开始到点就走,后来最晚10点下班。之后实习了一个月发了工资,我打算换地方住,实在熬不住了,去了草某地找了个城中村,离公司骑车10分钟,当时又觉得挺美,挺知足。直到9月初,我辞职备战秋招,开始先投一部分不太中意的厂,后来啥都投,9月确实不少有名的厂给了面试机会,但都没到终面。之后房租到期,回去找小伙伴一起准备秋招,每天投、每天一起准备,真的很煎熬,10月一个月没啥面试,到了10月底陆陆续续来了一些,回学校后,基本面一个过一个,但没太好的,最终选择去了某游戏乐园,他要求实习转正,我就去了。刚开始,感觉氛围很不错,带我的哥很和善,技术栈我也很喜欢,有高并发、微服务还是toc的,还特别正规,有单测有review,问了周围的人,说好好干好手里的活基本都能转正,我心想挺好,就是中午只能休息一个小时有点短,不过晚上七点准时下班可以有自己的夜生活。说实话当时挺知足的了,hr说转正之后给的也不算少,就感觉自己又行了,哈哈。元旦还约了在北京实习的同学搓了一顿,盼望着我两都能转正成功,他也去了某中厂实习。结果事与愿违,元旦节后公司政策调整,大裁员,实习转正的都寄寄,有个实习了六个月的产品也被裁了,我只知道互联网不稳定,没成想折磨不稳定,那种无力感,唉,我这辈子不想再有。就这样房租的押金也不要了,早早滚回去过年,过年玩的也不痛快,工作没定始终是个心事,我便发帖子在某客骂公司,唉,只图找点心理安慰罢了。过年期间,家里也是一大堆事,年龄大了好多事我都要帮忙,做饭、走亲戚、朋友聚餐等等。不过,家人对我的鼓励是最大的,感谢我的母亲,越发的感觉她的不容易,亲戚的关心总感觉那么的不真,不过也正常,换位思考一下,我对我的亲戚也没有那么真。真正关心你的不过父母而已。过完元宵,我开始准备面试的东西,陆陆续续开始投某直聘,也确实有面,但是不太对口,之后我决定回学校,学校学习环境好些,便开始了春招之路,3月初开始,几乎每天都有面,但是都不是太满意的公司,基本上又是面一个过一个,煎熬到月底,拿的出手的就是一个研究所of,爱奇艺泡池子,某教育厂of。毕业最后一天签了某教育厂的三方,清明后入职。至今,已经待了两个多月了,感觉团队氛围不错,薪资不低,技术栈也可以,就是流程没那么规范,自己凭习惯写单测,不会太细致地review,节奏贼快,几乎每天都有上线,一天差不多12个点(算上午休和晚饭时间)。总的来说,还是不错的,我身边的同事也很不错,很实在。插一嘴,实习期间,也遇到过好心人。我第一份实习的时候,团建过程中,我想着回去笔试,结果发现时间来不及了,我就找了个网吧,结果定位到的网吧地址早就不干了,我一看时间真的来不及了,滴滴司机帮我随便问了一个路人,哪里能用电脑笔试啥的。结果那个路人直接把我带到他的公司,用他的笔记本做了一个小时的笔试,本来人家都要回家的,结果陪了我一个小时,真是遇到好人了。还有一次,我第三次实习的时候,也是去的一个城中村租房,我大包小包拿了一堆,下了地铁就自己一点一点拖着进了村,有个大哥骑着摩托,看我这么多行李,直接说“放我车上,我给你拉过去”,开始我还有戒备心里,我就追着他跑,没想到他直接给我带过去了,放下行李二话没说就走了,我只能一个劲儿说谢谢。一路走来,真的算的上坎坷,天津北京来回跑了不下30次,还有租房,那种每次面试前的煎熬(尤其是对于一些还算中意的公司,面试前真的是有些说不出的煎熬)。感觉真的就是 运气 > 学历 > 实力,没有实力不行,没学历现在也几乎不行,有学历没太有实力应该可行,很有实力学历差点应该也可行,另外92和重本还是很顶用的,简历筛基本稳过,但对于双非来说,在实力的基础上,只有不断地撞、不断地碰、不断地坚持,兴许才会有好的运气!兴许!但即便是那一点点的可能也是可能!愿每一个拼搏的年轻人都能找到自己满意的工作,即使当前不如意,将来也能如愿!(补充一点:信息差也是很重要的,有一些了解春秋招的师兄师姐很管用,好多优质的资料、星球啥的能提高很大的效率,感觉纯靠B站免费的视频可能不太够,就比如别人都加了什么星球,你还只看B站,就有点吃亏。)
点赞 评论 收藏
分享
评论
10
90
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务