feat(misc/reboot): 进一步完善reboot系统调用
Pr修改内容
restart模式 - kernel_restart()
重启前的准备1 - kernel_restart_prepare():
-
调用reboot_notifier_list通知链执行回调函数,但是并没有相应的回调函数注册到这个通知链,目前是仅提供了接口调用注册
-
执行设备的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()
- 禁用io apic
- 禁用本地中断
- 禁用local apic
- 禁用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)
-
acpi:
AcpiManager.init(),[bus.c - drivers/acpi/bus.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/acpi/bus.c#L1398)- hotplug:
AcpiManager.acpi_sysfs_init(),[sysfs.c - drivers/acpi/sysfs.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/acpi/sysfs.c#L1034) - tables/data/dynamic:
AcpiManager.acpi_tables_sysfs_init(),[sysfs.c - drivers/acpi/sysfs.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/acpi/sysfs.c#L514)
- hotplug:
-
virtual:
devices_init(),[core.c - drivers/base/core.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/base/core.c#L3120) -
dev:
devices_init(),[core.c - drivers/base/core.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/base/core.c#L4077)- block: [core.c - drivers/base/core.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/base/core.c#L4080)
- char: [core.c - drivers/base/core.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/drivers/base/core.c#L4083)
-
kernel:
ksysfs_init(),[ksysfs.c - kernel/ksysfs.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/kernel/ksysfs.c#L289)- irq:
irq_sysfs_init(),[irqdesc.c - kernel/irq/irqdesc.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/kernel/irq/irqdesc.c#L353) - debug:
debugfs_init(),[dir.c - fs/sysfs/dir.c - Linux source code v6.6 - Bootlin Elixir Cross Referencer](https://elixir.bootlin.com/linux/v6.6/source/fs/sysfs/dir.c#L134)
- irq:
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