linux启动流程

news/2024/11/15 9:42:43/文章来源:https://www.cnblogs.com/alanli07/p/18399618
  1. KASLR kernel address space layout randomization 内核地址空间布局随机化
    本质是将链接的地址做了随机偏移,这样System.map中的地址也不一样了,需要用 cat /proc/kallsyms才能查看到实际的地址。主要还是为了安全,这样地址布局随机化,来增加安全,被攻击的难度会增加。
  • 防止利用内核漏洞。由于struct等数据结构会产生内核漏洞,通过随机化的方式将这些地址随机,这样攻击者就难以定位。
  • 提高安全性。每次引导得到的内核和内存地址都不用,即使得到上一次的内存布局,下一次就不再有效。
  • 减少信息泄露的影响

通过 CONFIG_RANDOMIZE_BASE 开启

启动流程

设备树加载与解析

设备树最开始在Image末尾,由uboot加载到.init.data中,存在的地址相当于物理地址。

start_kernel-> setup_arch-> (对架构进行解析、包括设备树)setup_machine_fdt (本函数得到在.init.data中地址(物理地址)转换后的虚拟地址)unflatten_device_tree->__unflatten_device_tree->unflatten_gt_nodes(执行两次,第一次得到转换成struct device_node所需要的空间后,分配内存。第二次真正开始解析设备树节点。)

unflatten_dt_nodes
从根节点开始:

  1. fdt_next_node 找下一个节点
  2. populate_node 为当前节点申请空间,并对node进行初始化,并且根据内容进行填充
  3. 会对深度进行设置从而得到父子关系

各个子系统初始化

子系统初始化和设备的初始化,都在最后一步rest_init中的do_initcalls中

rest_init->user_mode_thread(kernel_init, NULL, CLONE_FS)-> (开启0号进程)kernel_init->kernel_init_freeable->do_basic_setup->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,通过段名设置优先级(各个段依次执行)。

这样就可以回答下面几个问题

  1. 设备什么时候开始注册
    注册函数 of_platform_default_populate_init被放到了 .init.text中,被定义到 .initcall3s中(arch_initcall_sync(of_platform_default_populate_init))

所以在执行 do_initcalls 就会执行到of_platform_default_populate_init进行设备的注册

of_platform_default_populate_init->of_platform_default_populate->of_platform_populate->(从根节点开始遍历所有节点)of_platform_bus_create->of_device_allocdev->dev.bus = &platform_bus_typeof_device_add->device_add
  1. 各个子系统的注册
    会通过 __define_initcall(fn,id) 注册到段中,依次注册

  2. Bus的初始化流程

同样注册也是在 rest_init中执行

rest_init->kernel_init->kernel_init_freeable->do_basic_setup->driver_init->devices_init->devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);(在/sys/下创建device)dev_kobj = kobject_create_and_add("dev", NULL)(在sys/下创建dev)buses_init->bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL)(在sys/下创建bus kset)classes_init->class_kset = kset_create_and_add("class", NULL, NULL);(在sys/下创建class kset)platform_bus_init->device_registerbus_register (注册总线)do_initcalls

device和driver匹配流程


总的来说,总线将设备树中的设备描述(device)与驱动文件(driver)统一管理,并且总线提供了match函数,用来将device与driver匹配上,然后调用driver的probe进行初始化

  1. 设备和驱动在注册到bus管理的链表中的时候都会去遍历匹配对应的驱动或者设备。
  2. 几种匹配
    1. pdev中dirver_override和drv的name匹配
    2. of_driver_match_device(设备树匹配)
    3. acpi_driver_match_device(acpi匹配)
    4. id_table匹配
    5. pdev和drv中name匹配

文件系统挂载

start_kernel>vfs_caches_init(fs/dcache.c)初始化根目录/>mnt_init((fs/namespace.c))>sysfs_init(fs/sysfs/mount.c)注册sysfs文件系统(创建根目录,注册到全局链表file_system中)>fs_kobj = kobject_create_and_add("fs", NULL);在sys/下创建fs kobject>shmem_init(mm/shmem.c)注册tmpfs文件系统>init_rootfs(init/do_mounts.c)>init_mount_tree(fs/namespace.c)>proc_root_init(fs/proc/root.c)注册proc文件系统>rest_init>kernel_init>kernel_init_freeable(init/main.c)>do_basic_setup>do_initcalls>core_initcall(debugfs_init)注册debugfs文件系统解压根文件系统>rootfs_initcall(populate_rootfs)(init/initramfs.c)>populate_rootfs(init/initramfs.c)>do_populate_rootfs(init/initramfs.c)解压cpio包>prepare_namespace(/init不存在等情况,initramfs不涉及)>run_init_process(ramdisk_execute_command)执行ramdisk_execute_command指定参数,即init=的值,默认为/init。调用进程会替换当前进程,执行成功不再返回

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

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

相关文章

推荐一款流量录制回放工具:jvm-sandbox-repeater

在软件开发和测试过程中,我们经常会遇到需要对网络请求进行录制和回放的需求,以便进行调试、测试和分析。为了模拟真实的用户请求,我们通常会使用各种流量录制回放工具来记录并重放网络请求。 其中,jvm-sandbox-repeater 是一款功能强大的流量录制回放工具,可以帮助我们轻…

第三章 路由系统

3.路由系统 本质上:URL和函数的对应关系。 3.1 传统的路由 from django.contrib import admin from django.urls import path from apps.web import viewsurlpatterns = [path(home/, views.home),path(news/<int:nid>/edit/, views.news),path(article/, views.article…

Java工程师多年之后看指针

指针是基本数据类型,占用4个字节。Int 类型的 数据 计算机处理语言中是处 中间层。使用图形化方式可以这样更形象直观。计算机对二进制处理数据的方式比较敏感。现 人们的大脑计数方式是通过十进制的方式计算日常和工作中需要的业务。操作符的限制,才增加了十六进制机制。数字…

记录 VMware Workstation 官方下载方式

VMware Workstation 对个人使用已免费,但想找到官方下载地址很困难,在此记录一下 下载地址:https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware+Workstation+Pro 有账号的话直接登录,没有的话右上角注册即可(注册后需要主动登录) 经过不太友好的…

工业制造企业如何与供应商间 进行高效安全的企业间文件传输?

工业制造企业的供应商数量通常较多,这主要是由于工业制造行业的复杂性和多元化特点所决定的。工业制造企业的产品结构往往较为复杂,涉及到多种原材料、零部件和设备。这些物资的需求不仅数量大,而且种类繁多,因此需要与多个供应商建立合作关系,以满足不同产品的生产需求。…

IC设计企业进行云租户数据传输最大的问题是什么?如何解决?

越来越多的IC设计企业基于云租户进行芯片的设计、仿真及验证流程,其原因在于: 降低成本:由于资源共享,租户无需单独购买、部署和维护昂贵的硬件设备,只需按需付费,大大降低了初期投资和运营成本。 弹性扩展:云租户可以根据业务需求快速、灵活地调整计算和存储资源,无需…

【精选】文件摆渡系统:跨网文件传输的安全与效率之选

文件摆渡系统可以解决哪些问题? 文件摆渡系统(File Shuttle System)主要是应用于不同网络、网段、区域之间的文件数据传输流转场景, 用于解决以下几类问题: 文件传输问题: 大文件传输:系统可以处理大文件的上传和下载,减少文件传输中的中断和错误。 异地传输:支持不同…

51nod 2180 争渡

争渡 常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。 ——李清照《如梦令常记溪亭日暮》 给出线段上界和下界,要在严格递增地在区间内选数,问到最后一条线段的方案数。见上图,第 i 条线段 j 点的方案数为 i-1 条线段的 j-1 到 l[i] 的方…

【SQL Server】将EXEC的变量结果赋值输出

动态传入表名和表的某些属性,然后将标的属性赋值到参数中,以便后续使用。 首先一张表(表和字段设计略),使用动态的语句如下:1 DECLARE @tablename VARCHAR(255) = BomNo 2 ,@id INT = 1 3 ,@sql NVARCHAR(MAX) ; 4 SET @sql =SELECT fnumber,sonFnumber FROM Bom…

首发 最新AWVS/Acunetix Premium V24.8高级版漏洞扫描器(最新版)Windows/Linux下载

前言 Acunetix Premium 是一种 Web 应用程序安全解决方案,用于管理多个网站、Web 应用程序和 API 的安全。集成功能允许您自动化 DevOps 和问题管理基础架构。 Acunetix Premium:全面的 Web 应用程序安全解决方案 Web 应用程序对于企业和组织与客户、合作伙伴和员工的联系至关…

南沙信C++陈老师解一本通题: 2031:【例4.17】四位完全平方数

​题目描述】输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。【输入】无【输出】由小到大输出,每个数占一行。【输入样例】 无 【输出样例】 无#include <bits/stdc++.h> using namespace std; bool isSquare(int n) {int tmp=(int)sqrt(n);…

VMware Workstation 17.6 Pro macOS Unlocker OEM BIOS 2.7 for Windows

VMware Workstation 17.6 Pro macOS Unlocker & OEM BIOS 2.7 for WindowsVMware Workstation 17.6 Pro macOS Unlocker & OEM BIOS 2.7 for Windows 在 Windows 上运行 macOS Sequoia 请访问原文链接:https://sysin.cn/blog/vmware-workstation-17-unlocker-windows/…