Linux 内核如何根据设备树文件来匹配内核

一.  简介

上一篇文章学习了 Linux内核如何确定是否支持此设备,如果支持,设备就会启动 Linux 内核。

文章地址如下:

设备树根节点下的compatile属性的作用-CSDN博客

本文继上面文章的学习。这里简单看一下, Linux 内核是如何根据设备树根节点的 compatible 属性来匹配出对 应的 machine_desc。

二.    Linux 内核如何根据设备树根节点的 compatible 属性来匹配machine_desc

Linux 内核调用 start_kernel 函数来启动内核, start_kernel 函数会调用 setup_arch 函数来匹配 machine_desc setup_arch 函数定义在文件 arch/arm/kernel/setup.c 中,函 数内容如下 ( 有缩减 )
void __init setup_arch(char **cmdline_p)
{const struct machine_desc *mdesc;setup_processor();mdesc = setup_machine_fdt(__atags_pointer);if (!mdesc)mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);machine_desc = mdesc;machine_name = mdesc->name;
...............
}
6 行,调用 setup_machine_fdt() 函数来获取匹配的 machine_desc ,参数就是 atags 的首 地址,也就是 uboot 传递给 Linux 内核的 . dtb 设备树 文件的首地址, setup_machine_fdt() 函数的返回值就是 找到的最匹配的 machine_desc

函数 setup_machine_fdt 定义在文件 arch/arm/kernel/devtree.c 中,内容如下(有缩减)

const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
{const struct machine_desc *mdesc, *mdesc_best = NULL;
......if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys)))return NULL;mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);
......__machine_arch_type = mdesc->nr;return mdesc;
}

8 行,调用函数 of_flat_dt_match_machine()函数 来获取匹配的 machine_desc ,参数 mdesc_best 是 默 认 的 machine_desc
参数 arch_get_next_mach 是 个 函 数 , 此 函 数 定 义 在 定 义 在 arch/arm/kernel/devtree.c 文件中。
找到匹配的 machine_desc 的过程,就是用设备树根节点的 compatible 属性值和 Linux 内核中 machine_desc .dt_compat 的值比较,看看那个相等,如果相 等,就表示找到匹配的 machine_desc arch_get_next_mach 函数的工作就是获取 Linux 内核中 下一个 machine_desc 结构体。

最后再来看一下 of_flat_dt_match_machine 函数,此函数定义在文件 drivers/of/fdt.c 中,内容如下(有缩减)

const void * __init of_flat_dt_match_machine(const void *default_match,const void * (*get_next_compat)(const char * const**))
{const void *data = NULL;const void *best_data = default_match;const char *const *compat;unsigned long dt_root;unsigned int best_score = ~1, score = 0;dt_root = of_get_flat_dt_root();while ((data = get_next_compat(&compat))) {score = of_flat_dt_match(dt_root, compat);if (score > 0 && score < best_score) {best_data = data;best_score = score;}}
........................pr_info("Machine model: %s\n", of_flat_dt_get_machine_name());return best_data;
}

第 10 行,通过 of_get_flat_dt_root() 函数获取设备树根节点。
11~16 行,此循环就是查找匹配的 machine_desc 过程。
12 行的 of_flat_dt_match 数,会将根节点 compatible 属性的值和每个 machine_desc 结构体中 . dt_compat 的值进行比较,直 至找到匹配的那个 machine_desc

三.  总结

总结一下, Linux 内核通过根节点 compatible 属性找到对应的设备的函数调用过程。过程 如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware虚拟机内存异常占用问题一例

关键词 vmware esxi、hypervisor虚拟化平台内存模式 Guest virtual memory 一、问题现象 业务一台vmware虚拟机出现内存使用率告警&#xff0c;运维人员登录系统检查内存确实高水位状态 检查各进程使用内存不高&#xff0c;合计内存总数与使用率占用情况明显不匹配&#xf…

大漠插件7.2353

工具名称:大漠插件7.2353 更新时间2023-12-29更新内容/v7.23531. FindPicSim优化,防止有些时候会找不到图2. 增加接口TerminateProcessTree3. 解决AsmCall 模式6在部分WIN11下无法正常生效的BUG/ 工具简介:大漠 综合 插件 (dm.dll)采用vc6.0编写&#xff0c;识别速度超级快&…

某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)

文章目录 1. 写在前面2. 请求分析3. 断点分析4. 扣加密JS5. Python爬虫代码实现 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff…

TypeScript进阶(一)深入理解类和接口

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

Cypress.io:快速简单可靠的浏览器测试工具 | 开源日报 No.142

cypress-io/cypress Stars: 45.5k License: MIT Cypress.io 是一个快速、简单和可靠的浏览器测试工具&#xff0c;可以用于任何在浏览器中运行的内容。它支持 Mac、Linux 和 Windows 系统&#xff0c;并提供了安装指南。 hrvach/deskhop Stars: 4.1k License: GPL-3.0 DeskH…

Slam激光雷达

概念 SLAM,全称为Simultaneous Localization and Mapping(同时定位与地图构建),是一种技术,它允许机器人或自动驾驶系统在未知环境中进行自我定位并构建环境地图。在SLAM技术中,激光雷达是一个关键的传感器。 激光雷达通过发射激光束并测量反射回来的时间来获取周围环境…

机器视觉在OCR字符检测的应用

在产品质量 检测过程中&#xff0c;对于字符、条码等标识信息的识别、读取、检测是非常重要的一部分&#xff0c;比如在食品饮料包装检测中&#xff0c;生产日期 、保质期 、生产批号 、条码等字符信息是产品管理和追溯必不可缺的&#xff0c;因此利用机器视觉技术进行OCR字符采…

VSCode C/C++(gdb)调试指南

1、安装插件 2、F5开启调试 左侧侧边栏->确保打开回调栈 右键函数栈->查看反汇编 3、打印寄存器、函数反汇编等 命令&#xff1a; 查看main反汇编 -exec disassemble /m main 查看寄存器 -exec info r 打印某个变量 -exec print s 或者 --s 打印寄存器&#xff0c;如p…

基于STM32F407的OV7670数字摄像头视频采集系统设计

基于STM32F407的OV7670数字摄像头视频采集系统是一个常见的嵌入式系统设计项目。在本文中&#xff0c;我们将介绍如何利用STM32F407微控制器和OV7670摄像头实现视频采集系统&#xff0c;并提供相应的代码示例。 1. 系统概述 OV7670是一款低成本的数字摄像头模块&#xff0c;具…

阴盘奇门八字排盘马星位置计算方法php代码

如下位置&#xff0c;马星的四个位置。 计算方法&#xff1a; 1。先根据出生年月日&#xff0c;计算得八字四柱。比如 2024年01月09日&#xff0c;四柱为 其中时柱地支为“申” 2。然后根据以下对应的数组&#xff0c;来找到id号&#xff0c;即马星位置。 根据下表来找到&am…

数据结构入门到入土——链表(完)LinkedList

目录 一&#xff0c;双向链表 1.单向链表的缺点 2.什么是双向链表&#xff1f; 3.自主实现双向链表 接口实现&#xff1a; 二&#xff0c;LinkedList 1.LinkedList的使用 1.1 什么是LinkedList&#xff1f; 1.2 LinkedList的使用 1.LinkedList的构造 2.LinkedList的…

仿stackoverflow名片与b站名片实现(HTML、CSS)

目录 前言一、仿stackoverflow名片HTMLCSS 二、仿b站名片HTMLCSS 素材 前言 学习自ACwing - Web应用课 一、仿stackoverflow名片 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport&…