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_f
dt(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多数据库连接配置与切换教程


dt(dt_phys, &size, PAGE_KERNEL);
......
early_init_dt_scan(dt_virt)
......
name = of_flat_dt_get_machine_name();
......
}