嵌入式常见面试题总结(7)_展讯通信嵌入式面试题

其总线对应的类型即使,struct bus_type.
总线实现好了匹配规则,内核对于往platform总线上注册的设备
及驱动对应的类型做了抽象。

参考:https://blog.csdn.net/u011164819/article/details/49966493

57**,kmalloc和vmalloc的区别?**

答:kmalloc()用于申请较小的、连续的物理内存.

  1. 以字节为单位进行分配,在<linux/slab.h>中
  2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自然连续
  3. gfp_mask标志:什么时候使用哪种标志?如下:
    ———————————————————————————————-
    情形        相应标志
    ———————————————————————————————-
    进程上下文,可以睡眠 GFP_KERNEL
    进程上下文,不可以睡眠 GFP_ATOMIC
    中断处理程序 GFP_ATOMIC
    软中断 GFP_ATOMIC
    Tasklet GFP_ATOMIC
    用于DMA的内存,可以睡眠 GFP_DMA | GFP_KERNEL
    用于DMA的内存,不可以睡眠 GFP_DMA | GFP_ATOMIC
    ———————————————————————————————-
  4. void kfree(const void *ptr)
    释放由kmalloc()分配出来的内存块
    vmalloc()
    用于申请较大的内存空间,虚拟内存是连续的
  5. 以字节为单位进行分配,在<linux/vmalloc.h>中
  6. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续
  7. 一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用vmalloc(),例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配 的内存上。
    4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。
    malloc(), vmalloc()和kmalloc()区别
    [*]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
    [*]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)
    [*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
    [*]内存只有在要被DMA访问的时候才需要物理上连续
    [*]vmalloc比kmalloc要慢
    58**、module_init的级别?**

答:(网上很少有这个的讲解)几乎每个linux驱动都有个module_init(与module_exit的定义在Init.h (/include/linux) 中)。没错,驱动的加载就靠它。为什么需要这样一个宏?原因是按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用。

内核的加载的时候,会搜索".initcall"中的所有条目,并按优先级加载它们,普通驱动程序的优先级是6。其它模块优先级列出如下:值越小,越先加载。

参考:https://www.cnblogs.com/x_wukong/p/5923876.html

59**、添加驱动?**

**答:**静态加载和动态加载:
静态加载是系统启动的时候由内核自动加载的,这个要事先将驱动编译进内核才行;
动态加载,也就是模块加载方式,这种方式下驱动以模块的形式存放在文件系统中,需要时动态载入内核,这种主要用在调试的时候,比较方便灵活。insmod module.ko。

60、IIC原理?

物理结构上,IIC系统由一条串行数据线SDA和一条串行时钟线SCL组成。主机按一定的通信协议向从机寻址和进行信息 传输。在数据传输时,由主机初始化一次数据传输,主机使数据在SDA线上传输的同时还通过SCL线传输时钟。信息传输的对象和方向以及信息传输的开始和终 止均由主机决定。
每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。

参考:http://blog.sina.com.cn/s/blog_71c0df0d0101qci6.html

61**,kernel panic?**

答:Linux kernel panic是很难定位和排查的重大故障,一旦系统发生了kernel panic,相关的日志信息非常少,而一种常见的排查方法—重现法–又很难实现,因此遇到kernel panic的问题,一般比较头疼。
没有一个万能和完美的方法来解决所有的kernel panic问题,这篇文章仅仅只是给出一些思路,一来如何解决kernel panic的问题,二来可以尽可能减少发生kernel panic的机会。

就像名字所暗示的那样,它表示Linux kernel走到了一个不知道该怎么走下一步的状况,一旦到这个情况,kernel就尽可能把它此时能获取的全部信息都打印出来,至于能打印出多少信息,那就看是那种情况导致它panic了。

有两种主要类型kernel panic:

  1. hard panic(也就是Aieee信息输出)

soft panic (也就是Oops信息输出)

内核错误(Kernel panic)是指操作系统在监测到内部的致命错误,并无法安全处理此错误时采取的动作。这个概念主要被限定在Unix以及类Unix系统中;对于MicrosoftWindows系统,等同的概念通常被称为蓝屏死机。

操作系统试图读写无效或不允许的内存地址是导致内核错误的一个常见原因。内核错误也有可能在遇到硬件错误或操作系统BUG时发生。在许多情况中,操作系统可以在内存访问违例发生时继续运行。然而,系统处于不稳定状态时,操作系统通常会停止工作以避免造成破坏安全和数据损坏的风险,并提供错误的诊断信息。

Linux中由硬盘硬件错误导致的内核错误内核错误在早期的Unix系统中被引入,显示了在Unix与其前序的Multics在设计哲学上的主要差异之一。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

戳我获取!!**](https://bbs.csdn.net/topics/618654289)

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值