DragonOS icon indicating copy to clipboard operation
DragonOS copied to clipboard

feat(misc/reboot): 进一步完善reboot系统调用

Open 1037827920 opened this issue 7 months ago • 0 comments

Pr修改内容

restart模式 - kernel_restart()

重启前的准备1 - kernel_restart_prepare():

  1. 调用reboot_notifier_list通知链执行回调函数,但是并没有相应的回调函数注册到这个通知链,目前是仅提供了接口调用注册

  2. 执行设备的shutdown方法 - device_shutdown(),原本对有class的设备,有bus的设备,以及有Driver的设备执行shutdown,但是我们有class的设备目前并不需要shutdown,然后我们的Driver trait也没有shutdown方法,所以就只实现了有Bus设备的shutdown,主要是如下Bus设备:

    • PlatformBus:主要是实现了PlatformBus的shutdown(),以及实现PlatformDriver trait的设备的shutdown(),有I8042Driver、CmosPlatformDriver(这两个是因为没有初始化并使用对应的资源,所以shutdown直接返回ok)、Serial8250ISADriver(这个驱动的shutdown本来就是do nothing)
    • SerioBus:主要是实现了SerioBus的shutdown(),以及实现SerioDriver trait的设备的cleanup(),有Ps2MouseDriver(没有初始化并使用对应的资源,所以do nothing)
    • PciBus:主要是实现了PciBus的shutdown(),以及实现PciDriver trait的设备的shutdown(),有TestDriver(依旧是do nothing)
    • VirtIOBus:VirtIOBus的shutdown()就是do nothing的
    • EventSourceBus:EventSourceBus的shutdown()就是do nothing的

    除此之外,此pr还对设备这块有较多修改,后面单独说明

执行核心重启操作 - machine_restart():

  • 执行系统关闭操作 - machine_shutdown()
    1. 禁用io apic
    2. 禁用本地中断
    3. 禁用local apic
    4. 禁用hpet
  • 执行紧急重启操作 - emergency_restart()
    • acpi重启方式 - acpi_reboot()
    • kdb重启方式
    • cf9重启方式
    • triple重启方式

halt模式 - kernel_halt()

停止前的准备 - kernel_shutdown_prepare():

  • 调用reboot_notifier_list通知链执行回调函数
  • 修改系统状态
  • 执行设备的shutdown方法 - device_shutdown()

执行系统停止操作 - machine_halt():

  • 执行系统关闭操作 - machine_shutdown()
  • 停止当前CPU的运行,系统进入最终的停机状态 - stop_this_cpu()

drver模块

概述: 主要是修改了两点,一个是add_kobj(),另一个是引入了CommonKobj结构体

add_kobj()

修改前的逻辑: 通过手动指定kset,然后通过join()将kobject加入到kset中,而join()会在执行核心逻辑前进行assert,只有kobj.kset()为空再执行核心逻辑。

修改前存在的问题: 这样做的话,那你在使用join()前,就不能调用set_kset()去设置一个kobj的kset。否则就不能成功设置kset,而且还要在join的时候还要去手动传kset,有点麻烦。

修改后的逻辑: 参考linux的做法,通过kob.kset(),即自身的kset,将自身加入到自身的kset中。所以在join()前都有一个set_kset()的操作

修改的主要内容: 修改了add_kobj()join()的逻辑,以及在每个设备初始化的时候都进行了kset的设置(如果有的话),而不是通过传参给add_kobj()设置

CommonKobj结构体

目的: 把一些在linux本来是kobject,但是在Dragon却是Kset的换成kobject。使用KSet.resgister()注册一个kset的时候,后面可能会引入uevent,但是作为一个普通的kobj可能是没有这个的东西的,类似于Kset和Kobject的区别可能还有很多,所以我觉得还是把他们区分出来比较好

下面说明一下我将一些sysfs节点类型从kset改成kobj的部分,并给出了对应的参考地址:

fireware: [firmware.c - drivers/base/firmware.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/base/firmware.c#L17)

ToDo

restart模式

  • 重启前的准备1 - kernel_restart_prepare()

    • [ ] 主要是禁用ebpf的helper函数
  • [ ] 将当前进程迁移到所需的cpu上 - migrate_to_reboot_cpu()

  • [ ] 执行系统关闭的钩子函数 - syscore_shutdown(),这个syscore机制主要涉及到系统核心阶段的一些钩子函数的执行,通过syscore_ops结构体可以知道有系统挂起、系统恢复和系统关闭的钩子函数

  • 执行核心重启操作 - machine_restart()

    • 执行系统关闭操作 - mahine_shutdown()

      • [ ] 主要是停止所有非当前CPU的执行,这样可以确保所有CPU在关机过程中不再执行任何任务
      • [ ] iommu的关闭(这个我不太清楚,我好像没看到DragonOS相关的代码)
    • 执行紧急重启操作 - emergency_restart()

      • [ ] 如果发生了紧急重启,禁用所有vmx操作
      • [ ] 使用tboot关闭机器并重启
      • [ ] efi方式重启:由于x86架构并没有进行efi_init()的操作,没有初始化efi的runtime服务,所以没法使用efi重启
      • [ ] bios方式重启:由于x86架构并没有实现实模式跳板(即短暂将CPU模式切换回实模式)这个功能,故无法实现bios重启

halt模式

  • 停止前的准备 - kernel_shutdown_prepare()

    • [ ] 主要是禁用ebpf的helper函数
  • [ ] 将当前进程迁移到所需的cpu上 - migrate_to_reboot_cpu()

  • [ ] 执行系统关闭的钩子函数 - syscore_shutdown()

  • 执行系统停止操作 - machine_halt()

    • [ ] 使用tboot关闭机器并重启

CAD模式

  • [ ] ctrl_alt_del()

power_off模式

  • [ ] 执行通知链power_off_prep_handler_list回调函数 - do_kernel_power_off_prepare()
  • [ ] 将当前进程迁移到所需的cpu上 - migrate_to_reboot_cpu()
  • [ ] 执行系统关闭的钩子函数 - syscore_shutdown()
  • [ ] 执行核心的power_off函数 - native_machine_power_off()

software_suspend模式

todo

kexec模式

todo

1037827920 avatar May 09 '25 15:05 1037827920