Linux BSP实战课(设备树篇):设备树的解析

发布时间 - 2025-07-21 00:00:00    点击率:

让我们来看看内核如何将设备树解析成所需的device_node结构。linux内核的底层初始化部分在head.s中,这是汇编代码,暂且不作过多讨论。在head.s完成部分初始化后,就开始调用c语言函数,第一个被调用的c语言函数是start_kernel:

asmlinkage __visible void __init start_kernel(void){
    //...
    setup_arch(&command_line);
    //...
}

设备树的处理主要在setup_arch()函数中进行。

void __init __no_sanitize_address setup_arch(char **cmdline_p){
  setup_machine_fdt(__fdt_pointer);
  ......  
  unflatten_device_tree();
}

这两个被调用的函数是主要的设备树处理函数:

setup_machine_fdt:根据传入的设备树dtb的根节点完成一些初始化操作。 unflatten_device_tree:对设备树进行具体解析,将设备树各节点转换成相应的struct device_node结构体。

我们通过代码跟踪仔细分析setup_machine_fdt:

static void __init setup_machine_fdt(phys_addr_t dt_phys){
  void *dt_virt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
  ......  
  early_init_dt_scan(dt_virt)
  ......  
  name = of_flat_dt_get_machine_name();
  ......  
}

上面的函数作用大致如下:

首先通过fixmap_remap_fdt获取dts的头部地址,然后通过early_init_dt_scan进行下一步的扫描:

bool __init early_init_dt_scan(void *params){
 bool status;
 status = early_init_dt_verify(params);
 if (!status)
  return false;
  //进行早期扫描
 early_init_dt_scan_nodes();
 return true;
}
void __init early_init_dt_scan_nodes(void){
  ......  
  //读取"#address-cells","#size-cells"属性
  early_init_dt_scan_root();
  ......  
  //查找chosen节点
  early_init_dt_scan_chosen(boot_command_line);
  ......  
  //查找memory节点
  early_init_dt_scan_memory();
  ......  
}

其主要包括:

获取root节点的size-cells和address-cells值 解析chosen节点中的initrd和bootargs属性,其中initrd包含其地址和size信息 遍历memory节点的内存region,并将合法的region加入memblock中 这里用一张图简单的总结下是如何获取内核前期初始化所需的bootargs,cmd_line等系统引导参数。


# linux  # c语言  # 结构体  # Struct  # 所需  # 这是  # 第一个  # 让我们  # 遍历  # 这两个  # 并将  # 来看看  # 不作  # 转换成 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 七夕网站制作视频,七夕大促活动怎么报名?  如何在阿里云购买域名并搭建网站?  jQuery中的100个技巧汇总  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何处理表单验证?(Requests代码示例)  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  非常酷的网站设计制作软件,酷培ai教育官方网站?  PythonWeb开发入门教程_Flask快速构建Web应用  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Linux系统运维自动化项目教程_Ansible批量管理实战  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何确保西部建站助手FTP传输的安全性?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何用免费手机建站系统零基础打造专业网站?  如何快速建站并高效导出源代码?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在万网ECS上快速搭建专属网站?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  浅谈redis在项目中的应用  微信小程序 闭包写法详细介绍  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何使用Eloquent进行子查询  网站建设整体流程解析,建站其实很容易!  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何快速查询域名建站关键信息?  JavaScript如何实现倒计时_时间函数如何精确控制  网站制作软件免费下载安装,有哪些免费下载的软件网站?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel storage目录权限问题_Laravel文件写入权限设置  长沙企业网站制作哪家好,长沙水业集团官方网站?  微信小程序 require机制详解及实例代码  linux写shell需要注意的问题(必看)  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程