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