一口Linux

文章数:1382 被阅读:1966155

datasheet推荐 换一换
随便看看
账号入驻

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

最新更新时间:2024-05-27
    阅读数:


出了几道题,考了一下做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


关注,回复【 1024 】海量Linux资料赠送


精彩文章合集

文章推荐

【专辑】 ARM
【专辑】 粉丝问答
【专辑】 所有原创
专辑 linux 入门
专辑 计算机网络
专辑 Linux驱动


 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved