From b8ed38251dc255b0c525801b5dbf37d3b0d0d61e Mon Sep 17 00:00:00 2001 From: Donkey Kane <109840258+xiaolin2004@users.noreply.github.com> Date: Fri, 5 Apr 2024 00:06:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Djiffy=E6=97=B6=E9=92=9F?= =?UTF-8?q?=E8=BF=87=E5=BF=AB=E9=97=AE=E9=A2=98=EF=BC=8C=E5=90=AF=E7=94=A8?= =?UTF-8?q?gettimeofday=E6=B5=8B=E8=AF=95=EF=BC=8C=E4=BF=AE=E6=94=B9mount?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=20(#680)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 把clock tick rate与hpet频率关联起来 2. 修复墙上时间同步错误的问题 3. 启用时间watch dog. 4. 修复时间流逝速度异常 --------- Co-authored-by: longjin --- kernel/src/Makefile | 2 +- kernel/src/arch/riscv64/time.rs | 10 +- kernel/src/arch/x86_64/driver/hpet.rs | 12 +- kernel/src/arch/x86_64/time.rs | 12 +- kernel/src/common/glib.h | 2 +- kernel/src/debug/klog/mm.rs | 10 +- kernel/src/driver/hid/hidparse.c | 2 +- kernel/src/include/bindings/wrapper.h | 1 - kernel/src/libs/glib.c | 2 +- kernel/src/process/kthread.rs | 4 +- kernel/src/sched/completion.rs | 2 +- kernel/src/time/Makefile | 8 -- kernel/src/time/clocksource.c | 10 -- kernel/src/time/clocksource.h | 7 -- kernel/src/time/clocksource.rs | 145 ++++++++++++++++++------- kernel/src/time/jiffies.rs | 24 ++-- kernel/src/time/mod.rs | 3 + kernel/src/time/timekeeping.rs | 107 +++++++++++------- kernel/src/time/timer.rs | 57 ++++------ user/apps/test-mount/src/main.rs | 15 ++- user/apps/test_gettimeofday/main.c | 20 ++-- user/dadk/config/test_mount_1_0_0.dadk | 2 +- 22 files changed, 281 insertions(+), 176 deletions(-) delete mode 100644 kernel/src/time/Makefile delete mode 100644 kernel/src/time/clocksource.c delete mode 100644 kernel/src/time/clocksource.h diff --git a/kernel/src/Makefile b/kernel/src/Makefile index 4b28062c..1cbb40bd 100644 --- a/kernel/src/Makefile +++ b/kernel/src/Makefile @@ -36,7 +36,7 @@ export ASFLAGS := --64 LD_LIST := "" -kernel_subdirs := common driver debug syscall libs time +kernel_subdirs := common driver debug syscall libs kernel_rust: diff --git a/kernel/src/arch/riscv64/time.rs b/kernel/src/arch/riscv64/time.rs index 5e876498..6defdfce 100644 --- a/kernel/src/arch/riscv64/time.rs +++ b/kernel/src/arch/riscv64/time.rs @@ -1,6 +1,9 @@ -use crate::time::TimeArch; +use crate::time::{clocksource::HZ, TimeArch}; pub struct RiscV64TimeArch; +/// 这个是系统jiffies时钟源的固有频率(不是调频之后的) +pub const CLOCK_TICK_RATE: u32 = HZ as u32 * 1000000; + impl TimeArch for RiscV64TimeArch { fn get_cycles() -> usize { riscv::register::cycle::read() @@ -9,4 +12,9 @@ impl TimeArch for RiscV64TimeArch { fn cal_expire_cycles(ns: usize) -> usize { todo!() } + /// 将CPU的时钟周期数转换为纳秒 + #[inline(always)] + fn cycles2ns(cycles: usize) -> usize { + todo!() + } } diff --git a/kernel/src/arch/x86_64/driver/hpet.rs b/kernel/src/arch/x86_64/driver/hpet.rs index c724ed21..a4e2d120 100644 --- a/kernel/src/arch/x86_64/driver/hpet.rs +++ b/kernel/src/arch/x86_64/driver/hpet.rs @@ -31,7 +31,10 @@ use crate::{ mmio_buddy::{mmio_pool, MMIOSpaceGuard}, PhysAddr, }, - time::timer::{clock, timer_get_first_expire, update_timer_jiffies}, + time::{ + jiffies::NSEC_PER_JIFFY, + timer::{clock, timer_get_first_expire, update_timer_jiffies}, + }, }; static mut HPET_INSTANCE: Option = None; @@ -54,8 +57,8 @@ struct InnerHpet { } impl Hpet { - /// HPET0 中断间隔为 10ms - pub const HPET0_INTERVAL_USEC: u64 = 10000; + /// HPET0 中断间隔 + pub const HPET0_INTERVAL_USEC: u64 = NSEC_PER_JIFFY as u64 / 1000; const HPET0_IRQ: IrqNumber = IrqNumber::new(34); @@ -70,6 +73,7 @@ impl Hpet { .unwrap() }; let tm_num = hpet.timers_num(); + kdebug!("HPET0_INTERVAL_USEC: {}", Self::HPET0_INTERVAL_USEC); kinfo!("HPET has {} timers", tm_num); hpet_info.hpet_number = tm_num as u8; @@ -238,7 +242,7 @@ impl Hpet { pub(super) fn handle_irq(&self, timer_num: u32) { if timer_num == 0 { assert!(!CurrentIrqArch::is_irq_enabled()); - update_timer_jiffies(Self::HPET0_INTERVAL_USEC, Self::HPET0_INTERVAL_USEC as i64); + update_timer_jiffies(1, Self::HPET0_INTERVAL_USEC as i64); if let Ok(first_expire) = timer_get_first_expire() { if first_expire <= clock() { diff --git a/kernel/src/arch/x86_64/time.rs b/kernel/src/arch/x86_64/time.rs index 4edd6483..3879f7c4 100644 --- a/kernel/src/arch/x86_64/time.rs +++ b/kernel/src/arch/x86_64/time.rs @@ -1,10 +1,14 @@ -use crate::time::TimeArch; +use crate::time::{clocksource::HZ, TimeArch}; use super::driver::tsc::TSCManager; +/// 这个是系统jiffies时钟源的固有频率(不是调频之后的) +pub const CLOCK_TICK_RATE: u32 = HZ as u32 * 1000000; + pub struct X86_64TimeArch; impl TimeArch for X86_64TimeArch { + #[inline(always)] fn get_cycles() -> usize { unsafe { x86::time::rdtsc() as usize } } @@ -12,4 +16,10 @@ impl TimeArch for X86_64TimeArch { fn cal_expire_cycles(ns: usize) -> usize { Self::get_cycles() + ns * TSCManager::cpu_khz() as usize / 1000000 } + + /// 将CPU的时钟周期数转换为纳秒 + #[inline(always)] + fn cycles2ns(cycles: usize) -> usize { + cycles * 1000000 / TSCManager::cpu_khz() as usize + } } diff --git a/kernel/src/common/glib.h b/kernel/src/common/glib.h index e05f0c3c..411413e3 100644 --- a/kernel/src/common/glib.h +++ b/kernel/src/common/glib.h @@ -65,4 +65,4 @@ static __always_inline ul ALIGN(const ul addr, const ul _align) * @param size 大小 * @return void* 指向目标地址的指针 */ -void *memmove(void *dst, const void *src, uint64_t size); \ No newline at end of file +void *c_memmove(void *dst, const void *src, uint64_t size); \ No newline at end of file diff --git a/kernel/src/debug/klog/mm.rs b/kernel/src/debug/klog/mm.rs index 3a89fdcb..619c5fa8 100644 --- a/kernel/src/debug/klog/mm.rs +++ b/kernel/src/debug/klog/mm.rs @@ -1,6 +1,9 @@ extern crate klog_types; -use core::intrinsics::unlikely; +use core::{ + intrinsics::unlikely, + sync::atomic::{compiler_fence, Ordering}, +}; use klog_types::{AllocatorLog, AllocatorLogType, LogSource, MMLogChannel}; @@ -63,13 +66,18 @@ impl MMDebugLogManager { let mut log = log; loop { + compiler_fence(Ordering::SeqCst); let r = __MM_ALLOCATOR_LOG_CHANNEL.buf.push(log); + compiler_fence(Ordering::SeqCst); if let Err(r) = r { // 如果日志通道满了,就把最早的日志丢弃 if __MM_ALLOCATOR_LOG_CHANNEL.buf.remaining() == 0 { + compiler_fence(Ordering::SeqCst); __MM_ALLOCATOR_LOG_CHANNEL.buf.pop(); + compiler_fence(Ordering::SeqCst); } log = r.into_inner(); + compiler_fence(Ordering::SeqCst); } else { break; } diff --git a/kernel/src/driver/hid/hidparse.c b/kernel/src/driver/hid/hidparse.c index bb49d269..21609481 100644 --- a/kernel/src/driver/hid/hidparse.c +++ b/kernel/src/driver/hid/hidparse.c @@ -95,7 +95,7 @@ static __always_inline void __pop_usage_stack(struct hid_parser *parser) if (parser->usage_size > 0) { for (int js = 0; js < parser->usage_size - 1; ++js) - memmove(&parser->usage_table[js], &parser->usage_table[js + 1], sizeof(struct hid_node_t)); + c_memmove(&parser->usage_table[js], &parser->usage_table[js + 1], sizeof(struct hid_node_t)); --parser->usage_size; } diff --git a/kernel/src/include/bindings/wrapper.h b/kernel/src/include/bindings/wrapper.h index cff40a6b..ddc5c501 100644 --- a/kernel/src/include/bindings/wrapper.h +++ b/kernel/src/include/bindings/wrapper.h @@ -25,6 +25,5 @@ #include #include #include -#include