linux启动流程
- KASLR kernel address space layout randomization 内核地址空间布局随机化
本质是将链接的地址做了随机偏移,这样System.map中的地址也不一样了,需要用 cat /proc/kallsyms才能查看到实际的地址。主要还是为了安全,这样地址布局随机化,来增加安全,被攻击的难度会增加。
- 防止利用内核漏洞。由于struct等数据结构会产生内核漏洞,通过随机化的方式将这些地址随机,这样攻击者就难以定位。
- 提高安全性。每次引导得到的内核和内存地址都不用,即使得到上一次的内存布局,下一次就不再有效。
- 减少信息泄露的影响
通过 CONFIG_RANDOMIZE_BASE
开启
启动流程
设备树加载与解析
设备树最开始在Image末尾,由uboot加载到.init.data中,存在的地址相当于物理地址。
unflatten_dt_nodes
从根节点开始:
- fdt_next_node 找下一个节点
- populate_node 为当前节点申请空间,并对node进行初始化,并且根据内容进行填充
- 会对深度进行设置从而得到父子关系
各个子系统初始化
子系统初始化和设备的初始化,都在最后一步rest_init中的do_initcalls中
顺便说一下,kernel_init中,会执行1号进程,首先判断是不是ramdisk(/init),其次会检查传入的命令中指定的1号进程,最后会依次判断 "/sbin/init" "/etc/init" "/bin/init" "/bin/sh"
do_initcalls中会从level0依次执行各种初始化函数。
其中 宏定义__define_initcall(fn, id)
会将函数指针fn放在section段 .initcall##id.init,通过段名设置优先级(各个段依次执行)。
这样就可以回答下面几个问题
- 设备什么时候开始注册
注册函数of_platform_default_populate_init
被放到了 .init.text中,被定义到 .initcall3s中(arch_initcall_sync(of_platform_default_populate_init)
)
所以在执行 do_initcalls
就会执行到of_platform_default_populate_init进行设备的注册
-
各个子系统的注册
会通过__define_initcall(fn,id)
注册到段中,依次注册 -
Bus的初始化流程
同样注册也是在 rest_init
中执行
device和driver匹配流程
总的来说,总线将设备树中的设备描述(device)与驱动文件(driver)统一管理,并且总线提供了match函数,用来将device与driver匹配上,然后调用driver的probe进行初始化
- 设备和驱动在注册到bus管理的链表中的时候都会去遍历匹配对应的驱动或者设备。
- 几种匹配
- pdev中dirver_override和drv的name匹配
- of_driver_match_device(设备树匹配)
- acpi_driver_match_device(acpi匹配)
- id_table匹配
- pdev和drv中name匹配
文件系统挂载
__EOF__

本文作者:alan
本文链接:https://www.cnblogs.com/alanli07/p/18399618.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/alanli07/p/18399618.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程