From 9068b7e051a67cbf53d6f48d25570a26943a7c88 Mon Sep 17 00:00:00 2001
From: T202419359994371 <t202419359994371@eduxiji.net>
Date: Tue, 24 Dec 2024 15:19:42 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=B3=BB=E7=BB=9F=E8=B0=83?=
 =?UTF-8?q?=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...00\345\217\221\350\256\241\345\210\222.md" |   4 +-
 ...73\347\273\237\350\260\203\347\224\250.md" |  82 +++++++++++++++++-
 kernel/include/sysnum.h                       |   2 +
 kernel/include/timer.h                        |   5 ++
 kernel/syscall.c                              |   6 ++
 kernel/sysproc.c                              |  31 +++++++
 xv6-user/_sleep                               | Bin 24216 -> 24336 bytes
 xv6-user/user.h                               |   2 +
 xv6-user/usys.pl                              |   4 +-
 9 files changed, 132 insertions(+), 4 deletions(-)

diff --git "a/doc/2024_\345\274\200\345\217\221\350\256\241\345\210\222.md" "b/doc/2024_\345\274\200\345\217\221\350\256\241\345\210\222.md"
index 8b68b20..edea1d6 100644
--- "a/doc/2024_\345\274\200\345\217\221\350\256\241\345\210\222.md"
+++ "b/doc/2024_\345\274\200\345\217\221\350\256\241\345\210\222.md"
@@ -29,6 +29,6 @@
 
 ##### å…¶ä»–
 
-- [ ] #define SYS_gettimeofday 
-- [ ] #define SYS_settimeofday 
+- [x] #define SYS_gettimeofday 
+- [x] #define SYS_settimeofday 
 - [ ] #define SYS_sched_yield
\ No newline at end of file
diff --git "a/doc/2024_\347\263\273\347\273\237\350\260\203\347\224\250.md" "b/doc/2024_\347\263\273\347\273\237\350\260\203\347\224\250.md"
index 26ea06d..1ac6ae5 100644
--- "a/doc/2024_\347\263\273\347\273\237\350\260\203\347\224\250.md"
+++ "b/doc/2024_\347\263\273\347\273\237\350\260\203\347\224\250.md"
@@ -245,4 +245,84 @@
 
 ### 内存管理相关
 
-### å…¶ä»–
\ No newline at end of file
+### å…¶ä»–
+
+#### define SYS_gettimeofday 31
+
+- 实现要求
+
+  - 功能:获取当前系统时间(秒和微秒);
+  - 输入:系统调用ID,传入一个 timespec 结构体指针;
+  - 返回值:成功返回0,失败返回-1;
+
+- 实现思路
+
+  系统通过获取当前时钟值,并假设时钟频率为 32768 次每秒来计算时间(秒和微秒)。调用 r_time() 获取当前时钟周期值,转换为秒和微秒,并填充到 timespec 结构体中。
+
+- 实现描述
+
+    - 使用 argaddr 获取用户空间传入的 timespec 结构体指针
+    - 调用 r_time() 获取当前时钟周期数
+    - 将时钟周期数转换为秒和微秒,并填充到 timespec 结构体中。
+
+- 实现代码
+
+  ```C
+    uint64
+    sys_gettimeofday(void)
+    {
+      timespec* ptr;
+      if(argaddr(0, (uint64*)&ptr) < 0){
+	      return -1;
+      }
+  
+      // 假设时钟频率 32768
+      uint64 x = r_time();
+      ptr->sec = x / 32768;
+      ptr->usec = (x % 32768) * 1000000 / 32768;
+  
+      return 0;
+    }
+  ```
+
+  #### define SYS_settimeofday 32
+
+- 实现要求
+
+  - 功能:允许用户设置当前系统时间(秒和微秒);
+  - 输入:系统调用ID,传入一个 timespec 结构体指针;
+  - 返回值:成功返回0,失败返回-1;
+
+- 实现思路
+
+  通过将传入的秒和微秒值转换为时钟周期数,并更新系统的时钟计数。使用 tickslock 来保护共享的时钟变量 ticks,防止竞争条件。
+
+- 实现描述
+
+    - 使用 argaddr 获取用户空间传入的 timespec 结构体指针
+    - 将传入的秒和微秒转换为时钟周期数
+    - 使用 acquire(&tickslock) 锁定时钟,更新 ticks 变量
+
+- 实现代码
+
+  ```C
+    uint64
+    sys_settimeofday(void)
+    {
+      timespec* ptr;
+      if(argaddr(0, (uint64*)&ptr) < 0){
+	      return -1;
+      }
+      uint xticks;
+      xticks = ptr->sec * 32768 + (ptr->usec * 32768)/1000000;
+      acquire(&tickslock);
+      ticks = xticks;
+      release(&tickslock);
+      return 0;
+    }
+  ```
+
+  ###  参考资料
+
+- [1] [syscalls(2) — Linux manual page](https://man7.org/linux/man-pages/man2/syscalls.2.html)
+- [2] [系统调用的说明以及调用方式](https://github.com/oscomp/testsuits-for-oskernel/blob/main/oscomp_syscalls.md#define-sys_getcwd-17)
diff --git a/kernel/include/sysnum.h b/kernel/include/sysnum.h
index 56c2932..d252d43 100644
--- a/kernel/include/sysnum.h
+++ b/kernel/include/sysnum.h
@@ -32,5 +32,7 @@
 #define SYS_clone       28
 #define SYS_linkat      29
 #define SYS_unlinkat    30
+#define SYS_gettimeofday 31
+#define SYS_settimeofday 32
 
 #endif
\ No newline at end of file
diff --git a/kernel/include/timer.h b/kernel/include/timer.h
index ba313f2..96825cb 100644
--- a/kernel/include/timer.h
+++ b/kernel/include/timer.h
@@ -11,4 +11,9 @@ void timerinit();
 void set_next_timeout();
 void timer_tick();
 
+typedef struct {
+	uint64 sec;		// 自系统启动起的秒数
+	uint64 usec; // 微秒数
+} timespec;
+
 #endif
diff --git a/kernel/syscall.c b/kernel/syscall.c
index 45a312f..46f4f4d 100644
--- a/kernel/syscall.c
+++ b/kernel/syscall.c
@@ -120,6 +120,8 @@ extern uint64 sys_getppid(void);
 extern uint64 sys_clone(void);
 extern uint64 sys_linkat(void);
 extern uint64 sys_unlinkat(void);
+extern uint64 sys_gettimeofday(void);
+extern uint64 sys_settimeofday(void);
 
 static uint64 (*syscalls[])(void) = {
   [SYS_fork]        sys_fork,
@@ -152,6 +154,8 @@ static uint64 (*syscalls[])(void) = {
   [SYS_clone]       sys_clone,
   [SYS_linkat]      sys_linkat,
   [SYS_unlinkat]    sys_unlinkat,
+  [SYS_gettimeofday] sys_gettimeofday,
+  [SYS_settimeofday] sys_settimeofday,
 };
 
 static char *sysnames[] = {
@@ -185,6 +189,8 @@ static char *sysnames[] = {
   [SYS_clone]       "clone",
   [SYS_linkat]      "linkat",
   [SYS_unlinkat]    "unlinkat",
+  [SYS_gettimeofday] "gettimeofday",
+  [SYS_settimeofday] "settimeofday",
 };
 
 void
diff --git a/kernel/sysproc.c b/kernel/sysproc.c
index 1e7b4d5..8290acf 100644
--- a/kernel/sysproc.c
+++ b/kernel/sysproc.c
@@ -185,4 +185,35 @@ sys_clone(void)
 	else {
 		return fork();
 	}
+}
+
+uint64
+sys_gettimeofday(void)
+{
+  timespec* ptr;
+  if(argaddr(0, (uint64*)&ptr) < 0){
+	  return -1;
+  }
+  
+  // 假设时钟频率 32768
+  uint64 x = r_time();
+  ptr->sec = x / 32768;
+  ptr->usec = (x % 32768) * 1000000 / 32768;
+  
+  return 0;
+}
+
+uint64
+sys_settimeofday(void)
+{
+  timespec* ptr;
+  if(argaddr(0, (uint64*)&ptr) < 0){
+	  return -1;
+  }
+  uint xticks;
+  xticks = ptr->sec * 32768 + (ptr->usec * 32768)/1000000;
+  acquire(&tickslock);
+  ticks = xticks;
+  release(&tickslock);
+  return 0;
 }
\ No newline at end of file
diff --git a/xv6-user/_sleep b/xv6-user/_sleep
index 7ceadbe0d16fc7d4405001a6a84aed657f7daad5..139fcdbd063231892190e77eb82bb81dbd61ba15 100755
GIT binary patch
delta 1809
zcmZ`)eN0<b6u;-SrLU#i`u%uY7?edQh_q#+RpweWV*>L7p+G|cL1hbB%s{4t86!9e
zN=&4lM5fWC#%xaG7NBZ|Q9ewJBpSz}MuHlHn&2N(!7RaPws~IPt-~(fr1#wO`~A+j
zC+FV#dg3D(orY02jK&HB2DgDFM@6j5TQFj%93yXKp#6}Juj1Y@2V*#NayZ4syC!BA
zHN{t|dP(~90E$ddS76DwnD+}azoCEks%{_ZE?rfVRjlEpwgjqhS$iJ#Cnj{e0krsQ
z#;2gi_w?Nmz<kjU!`Lbo+J81b867%3rl&23-!w~PckIDe#G9ZTXT=(0eEg@aomZf;
zVJ6`;)PW!X`t~|;z-We2j2S%;#5v<S%;QvMIgI0_%*IW(>P$K+RQU<MM3d=z9ZAcq
zCDu|cK{QMn)#e%TG3)bIkvGJcK`<NwQI9rT8Thf<b_*=wQCp?J^f+yE2~3B}wn5m7
z57~Eu8^`R~IlGh~8Ye0Du)x?BXcmTOjtV1;ZLYyD?K_|u*X`MR-c}0Y%9Z~ppJ7aT
ze*>$d`mX2cCw2kvcevmp_BvdGn1L@ja^*)iY<&FR04BxpyhDOXTycaUjJG>qps>%K
zH&YA#bnb+^u~-UPg4AVYbc1T&!Y8CD$;<nYd4{S3rx}PfXxz9zOQ!yIW<|h>(^;O)
z&x&f)W#S#D@b9c92qx;~<D2w-6sTeO_<K%v;;;M?0lfv==-_h;e}K}-qU}1;<#=Ax
zBxXw&1m*b3JXGRbSx9ND;BTX5clbR5_5VeGkPh~O-vjdr2+TOai*xskB<HP(1NT}5
zd7KxamZHuY+T4w?T8V_QT1R5KwjAWtq33bscCrEk7Dh{*B!~tqsw<IGZz7d6NFrcb
z=Ea`60@t_XS;-f9+x$FL4Ouf=yXMBJx}$U-eD!xxqx$O~u(<h6<3jcUUZ|H0A1C#|
zs?ZgdPz;;pFE|q6H!`LF3VmToULsf7cZnZ$38#O=4q{h0JHXKt`y0lHUFU4_8PIx(
zAN4hy3rp2H^30UEJ8fSh$1BqCEgY{+!|mv5kgB(F)|<xWCUGsR;1`P*%8I%Ebei6W
zgAG#0ZqA-dWAEg6Zdz~eOX76$X}d%TSGs2+tBicrum^FuL6TR=Q#xQy%XSbgjgowr
z$DZXeySRNE?`V{sI+olK*kW3RgGpStp^~pDTB&4#SF(?18~q>sSQ5XnZ?7hCz;7BY
z^6Ru#ayseBDWg3(Gj<B0Ns`Z~O4gTF;UxNqJ;!59$tt5rHEaeunk3gJJhnY8_A?$8
z#Fv{sH1&2KInwn==ivhncl2X8@|@}51|acW<QQP2ITy}if3wGsdaQ1oXukdj6vs94
zQeT}o`l2C-V-L;qI1#0ff)W3S24NL_Eg^UZds;$<iX64nahz%i5VJ;1ANpED^q0~@
h^D0iXh78@cs_Fz@ZVed3i0UoiZEXQq#GbZ-e*jo;LfrrW

delta 1750
zcmZ`)T}&KR6uxJ6m)(Ia-5+*mhJ^B0!L7IpwCo~P78<EdV-10YEwDw1F@^R)8e_E&
zO+iGo5?yi{;XxZ3#g_P!kWo^NwopyL2N9bXn?|Dz4;5nwR72@Qsb^;H+B%Il*?aCe
z=R4<o_uPADlNVt0D@Z;F@^By`$|BQ8>2P;x@#|vU2x-@QYYy4?YOHj`#~2Qbznb#(
zc1=!Sv1Efg?azYWnd?3KryI82X#0D^2<^Cm-&ljtg@0MUhr{aEww(Z5@lM(-6yvPD
z2P(1B5r(t)oFkBBbsujVI5%Ra0)w+IiDY3le&l!ncH(8nUgz}WV)nDQp|0s7V``Du
z0I-6ck4u<LcR?PWNe@8@{*ZnX&f~WkRWOEDXY;18&1s`8Xg?vO9(4X<BWRr`=*hF{
z`(#dwAvZ)E@C<p@9fq2oMiLIgS{fF5D~NH6_hFdBL2sR~oQCt>d|}y&tKL2+$LF)Q
zgCEak<>VG<K{UoG_n^SoW@r@#Xl@fuGL~71i&=%R2kpL`$3`_m9C`ge$X6JX-oM9d
zBYt=D93$@q?DXZsRqXfW3u`v~z?Y|V+*7#!-vB1PiNE?J>cmZ740hp@{<kRXXa7Ug
z0*AC6s_;>%+Fe3z)<zE)asc0uK9}<NJ;?Z&*n!^#<P|M4w#f=i;S2J9u;RQN$~?;Z
zb&LGIQ<$N|p+tQ~>EC3JQJ{qt;Yu(^O)m}#m<ap?dFqaBTWkbr483d7Pe5HMUl54U
zOht$&u2w{~#+HZMsoBHfkU;&v6t1R&g-8gd)UwD$KY>^Goz&-S_3fuTf-=TQ7#lEV
z3l*1fre4x=*Zb7v`YKRThhD&uTSy8F*e<MXkc4#ywl)Nn)DuW0ttJpKE2AscP@F$c
znuqi?-tsU{wU?xet=^Gwso_PCv9s|BYScvI)9wX+!#I$AhGj8H`9jA7TQ_-Uurnq-
zGRwWaChvD-*Q(F)>Or3LM~?5pzL<n_G1rM}+#>UP&VlR?T4))Tx&10X_8T0ZG*w*Z
z_8yb{Hn-Q9>;mO;F~E3}Td~txt96;Kf;M&=f@NY~lcaccq?MKOtHzxy7bnTP)yTu9
zP5Fa(tw}1Y(7klRrr26u(MeJpMTTH|u(nxJ7D*#+%w_7yK0HF+CLa3<kJ-Ux0?#x{
zCpz?sz^<719MtW?eN5&kTHE^qXOi0c(f`38*X{Rr<7M3r7>T=;L0W4${k)$YoZ%35
z#w7&}Bzwuka1@8hdz#0VlhnpGL$Gn2iA(t(^4Jbj>?DsW!CUb!@zVa+)OgD=!1>k!
zcn4QoLt^Ub$rxz6`|pv&ZqicUkR(pDMInhxG@r*nA}XwicqmZ~zu`n8N{N;dQL!}F
zAT)$!2O=<y-3Oxdt(>6Qj!QI8W1u}M*3=uQE<Dm65zoa9Z3-tzYi}_$dS8j$e*lk?
BI!FKj

diff --git a/xv6-user/user.h b/xv6-user/user.h
index facaabc..63e95e3 100644
--- a/xv6-user/user.h
+++ b/xv6-user/user.h
@@ -37,6 +37,8 @@ int getppid(void);
 int clone(int stacktop);
 int linkat(int olddirfd, char *oldpath, int newdirfd, char *newpath);
 int unlinkat(int dirfd, char *path);
+int gettimeofday(int *prt);
+int settimeofday(int *prt);
 // ulib.c
 int stat(const char*, struct stat*);
 char* strcpy(char*, const char*);
diff --git a/xv6-user/usys.pl b/xv6-user/usys.pl
index 5062be1..0c70d42 100644
--- a/xv6-user/usys.pl
+++ b/xv6-user/usys.pl
@@ -44,4 +44,6 @@ entry("rename");
 entry("getppid");
 entry("clone");
 entry("linkat");
-entry("unlinkat");
\ No newline at end of file
+entry("unlinkat");
+entry("gettimeofday");
+entry("settimeofday");
\ No newline at end of file
-- 
GitLab