当我用几道题考了一遍做Linux驱动的同事......

简介: 当我用几道题考了一遍做Linux驱动的同事......

出了几道题,考了一下做Linux驱动的同事!

说下新增驱动的一些基本操作

同事:先在设备树里新建一个节点,填写compatible和reg属性,然后在驱动里映射寄存器基址,后续就可以操作寄存器。

:寄存器基址怎么映射?

同事:先用platform_get_resource获取IORESOURCE_MEM资源,然后用devm_ioremap_resource将基址映射为虚拟地址。

:probe里还有哪些常规操作?

同事:通常一个驱动都会有时钟,所以probe里映射完基址后,通常要进行时钟和复位的操作。调用devm_clk_get获取时钟源,然后调用devm_clk_prepare_enbale使能时钟,复位的话先调用devm_reset_control_get获取复位源,然后用reset_control_reset复位。

:驱动中通常会定义一个私有结构体,里面包含一些内核结构体,但注册的时候只注册了某个成员,怎么找到这个私有结构体。

同事:可以通过container_of宏找到这个私有结构体的指针。

你会怎么给应用层提供接口

同事:驱动给应用层提供接口,一般都是通过ioctl接口,应用层传入一个结构体,驱动解析

:用户想在shell下调用驱动怎么办?

同事:可以提供procfs、sysfs或者debugfs这三个虚拟文件系统接口,根据具体用途提供

:这几个有什么区别?

同事:procfs接口一般是系统性的信息,主要是用来查看的,例如内存信息。sysfs接口更多用于与驱动交互,可以传参给驱动,修改驱动中一些变量。debugfs一般是用来调试用的,需要挂载debugfs。

内核启动时卡住或者崩了,怎么办

同事:卡住或者崩了,需要分析卡在哪里,从而找到原因。

:怎么知道卡在哪里?

同事:在内核的initcall初始化函数中加打印,把initcall的level和函数指针打印出来,看内核跑到了哪个等级的初始化。

:level等级是知道了,但这个等级执行的函数太多,而且打印出来的是地址,怎么知道具体跑到哪个函数?

同事:把内核编译出来的vmlinux文件反汇编,反汇编文件包含函数名和对应地址,根据地址查找。

说一下你知道的内核调试方法

同事:printk、BUG_ON、devmem、dump_statck......

:printk怎么用?

同事:printk有打印等级,用法和printf一样,可以用pr_info、pr_err这些不同等级的函数加打印。在shell中可以通过echo的方式控制printk等级

:为什么把printk等级调到最高,还是不能直接看到打印,而要通过dmesg?

同事:因为printk输出等级是针对串口控制台,要用串口连接才行,你可能使用ssh远程登录的。

:devmem怎么用?

同事:devmem是一个命令,它可以在shell下直接读写寄存器

:为什么devmem可以直接读写寄存器,而不需要映射?

同事:并非不需要映射,devmem应用程序会打开/dev/mem节点,这个设备实现了mmap接口,devmem应用程序打开/dev/mem后,会调用mmap函数将寄存器物理地址映射到用户空间,所以可以直接读写寄存器

:dump_stack有什么用?

同事:dump_stack函数可以打印函数调用栈,可以分析函数调用关系

:dump_stack出来的结果只有地址,没有函数名,怎么办?

同事:可以用工具链的add2line,查找地址对应的符号,就能看到函数名

:能让dump_stack显示出函数名吗?

同事:可以,只有地址的原因是因为内核配置没有打开CONFIG_KALLSYMS,这个配置是编入符号表,选上后,dump_stack就可以清楚看到调用关系和符合偏移。

简述MMU的工作原理

同事:以三级页表为例,MMU通过访问页表基址寄存器,得到一级页表PGD的基地址,再结合虚拟地址中的PGD index找到了下一级页表PTE的基地址;得到了PTE的基址,再结合虚拟地址中的PTE index找到PFN,然后再和VA相加得到物理地址。

:页表基址寄存器有什么用?

同事:存储第一级页表的基地址

:页表是谁创建的?MMU吗?

同事:页表是软件创建的,并非MMU硬件创建。MMU只是通过页表,将虚拟地址转换为了物理地址。

:页表在哪里?

同事:页表在物理内存中。

:CPU访问内存的过程是怎样的?

同事:CPU先访问TLB,如果TLB中存在这个地址,则直接从TLB中取地址。如果没有,再访问内存,读取页表,将虚拟地址转为物理地址,从而访问到内存。

:TLB又在哪里?TLB的本质是什么?

同事:TLB在MMU中,本质是一块cache。


总结,同事还是很强的!

end

猜你喜欢

入职Linux驱动工程师后,我才知道的真相......

一个Linux驱动工程师必知的内核模块知识

Linux内核中常用的数据结构和算法

Linux内核中常用的C语言技巧

Linux内核基础篇——常用调试技巧汇总

Linux内核基础篇——动态输出调试

Linux内核基础篇——printk调试

Linux内核基础篇——initcall

相关文章
|
5天前
|
Linux API 调度
Linux系统驱动跟裸机驱动的区别
Linux系统驱动跟裸机驱动的区别
36 0
|
5天前
|
存储 缓存 Linux
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
45 0
|
5天前
|
Linux 芯片 Ubuntu
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
|
5天前
|
Ubuntu Linux
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
|
5天前
|
Linux 芯片
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
|
5天前
|
Linux C语言 Ubuntu
Linux驱动入门——编写第一个驱动
Linux驱动入门——编写第一个驱动
Linux驱动入门——编写第一个驱动
|
5天前
|
Linux
linux驱动层输出dev_dbg打印信息
linux驱动层输出dev_dbg打印信息
28 0
|
5天前
|
存储 监控 Linux
【专栏】在 Linux 中,了解已安装驱动器是系统管理的关键
【4月更文挑战第28天】在 Linux 中,了解已安装驱动器是系统管理的关键。本文介绍了三种方法:1) 使用 `lsblk` 命令显示设备名、大小和类型;2) `fdisk -l` 命令提供详细分区信息;3) `gnome-disks` 等系统管理工具展示驱动器信息。此外,还讨论了驱动器类型识别、挂载点概念及其应用。通过这些方法,用户能有效地监控和管理 Linux 系统中的驱动器。
|
5天前
|
Linux Go
Linux命令Top 100驱动人生! 面试必备
探索Linux命令不再迷茫!本文分10部分详解20个基础命令,带你由浅入深掌握文件、目录管理和文本处理。 [1]: <https://cloud.tencent.com/developer/article/2396114> [2]: <https://pan.quark.cn/s/865a0bbd5720> [3]: <https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH>
79 0
|
5天前
|
Linux
Linux驱动运行灯 Heartbeat
Linux驱动运行灯 Heartbeat
25 0

热门文章

最新文章