根据提示,应该在syscall.c中修改syscall()。
首先在syscall.c中增加对应系统调用名称的数组:
static char *syscalls_name[] = {
[SYS_fork] "fork",
[SYS_exit] "exit",
[SYS_wait] "wait",
[SYS_pipe] "pipe",
[SYS_read] "read",
[SYS_kill] "kill",
[SYS_exec] "exec",
[SYS_fstat] "fstat",
[SYS_chdir] "chdir",
[SYS_dup] "dup",
[SYS_getpid] "getpid",
[SYS_sbrk] "sbrk",
[SYS_sleep] "sleep",
[SYS_uptime] "uptime",
[SYS_open] "open",
[SYS_write] "write",
[SYS_mknod] "mknod",
[SYS_unlink] "unlink",
[SYS_link] "link",
[SYS_mkdir] "mkdir",
[SYS_close] "close",
};
接着在syscall()中添加打印命令:
void
syscall(void)
{
int num;
struct proc *curproc = myproc();
num = curproc->tf->eax;
if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
curproc->tf->eax = syscalls[num]();
cprintf("%s -> %d\n", syscalls_name[num], curproc->tf->eax);
} else {
cprintf("%d %s: unknown sys call %d\n", curproc->pid, curproc->name, num);
curproc->tf->eax = -1;
}
}
最终执行结果如下:
xv6...
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
exec -> 0
open -> 0
dup -> 1
dup -> 2
iwrite -> 1
nwrite -> 1
iwrite -> 1
twrite -> 1
:write -> 1
write -> 1
swrite -> 1
twrite -> 1
awrite -> 1
rwrite -> 1
twrite -> 1
iwrite -> 1
nwrite -> 1
gwrite -> 1
write -> 1
swrite -> 1
hwrite -> 1
write -> 1
fork -> 2
exec -> 0
open -> 3
close -> 0
$write -> 1
write -> 1
注:shell的输出和系统调用的调用路径混在了一起,原因是shell是通过系统调用write来打印输出的
❯ grep -n uptime *.[chS]
syscall.c:105:extern int sys_uptime(void);
syscall.c:121:[SYS_uptime] sys_uptime,
syscall.h:15:#define SYS_uptime 14
sysproc.c:83:sys_uptime(void)
user.h:25:int uptime(void);
usys.S:31:SYSCALL(uptime)
extern int sys_chdir(void);
extern int sys_close(void);
extern int sys_dup(void);
extern int sys_exec(void);
extern int sys_exit(void);
extern int sys_fork(void);
extern int sys_fstat(void);
extern int sys_getpid(void);
extern int sys_kill(void);
extern int sys_link(void);
extern int sys_mkdir(void);
extern int sys_mknod(void);
extern int sys_open(void);
extern int sys_pipe(void);
extern int sys_read(void);
extern int sys_sbrk(void);
extern int sys_sleep(void);
extern int sys_unlink(void);
extern int sys_wait(void);
extern int sys_write(void);
extern int sys_uptime(void);
extern int sys_date(void); // 新添加
static int (*syscalls[])(void) = {
[SYS_fork] sys_fork,
[SYS_exit] sys_exit,
[SYS_wait] sys_wait,
[SYS_pipe] sys_pipe,
[SYS_read] sys_read,
[SYS_kill] sys_kill,
[SYS_exec] sys_exec,
[SYS_fstat] sys_fstat,
[SYS_chdir] sys_chdir,
[SYS_dup] sys_dup,
[SYS_getpid] sys_getpid,
[SYS_sbrk] sys_sbrk,
[SYS_sleep] sys_sleep,
[SYS_uptime] sys_uptime,
[SYS_open] sys_open,
[SYS_write] sys_write,
[SYS_mknod] sys_mknod,
[SYS_unlink] sys_unlink,
[SYS_link] sys_link,
[SYS_mkdir] sys_mkdir,
[SYS_close] sys_close,
[SYS_date] sys_date, // 新添加
};
#define SYS_date 22
int date(struct rtcdate*);
SYSCALL(date)
int sys_date(void) {
struct rtcdate* r = 0;
if (argptr(0, (char**)&r, sizeof(*r) < 0)) {
return -1;
}
cmostime(r);
return 0;
}
#include "types.h"
#include "user.h"
#include "date.h"
int
main(int argc, char *argv[])
{
struct rtcdate r;
if (date(&r)) {
printf(2, "date failed\n");
exit();
}
printf(1, "%d-%d-%d %d:%d:%d\n", r.year, r.month, r.day, r.hour, r.minute, r.second);
exit();
}
_date\
在完成以上步骤后,成功添加了系统调用date以及调用它的命令date,测试结果如下:
xv6...
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
init: starting sh
$ date
2022-11-10 18:19:21
$
我正在努力处理使用MITKerberos进行身份验证的Windows应用程序。如果用户使用域用户帐户登录到Windows,klist显示他从AD获得了预期的票证,包括这个:#1>Client:jalf@TESTREALM.COMServer:krbtgt/TESTREALM.COM@TESTREALM.COMKerbTicketEncryptionType:RSADSIRC4-HMAC(NT)TicketFlags0x40e00000->forwardablerenewableinitialpre_authentStartTime:1/12/20129:46:27(local)EndT
我尝试从"mobile.deSearchAPI"获取数据,但它不起作用=/..每次都会出现此错误:HTTPStatus401-ThisrequestrequiresHTTPauthentication()...我做错了什么?$authCode=base64_encode("{Benutzername}:{Passwort}");$uri='http://services.mobile.de/1.0.0/ad/search?modificationTime.min=2012-05-04T18:13:51.0Z';$ch=curl_init($uri);curl_setopt_array(
我的问题是,为什么人们创建的目录结构至少包含一个名为edu的文件夹,然后是另一个名为mit的文件夹(例如),然后是子文件夹中的所有代码?这是某种标识符吗?计算机是否出于某种原因实际使用了该结构-还是只是用来帮助读者?如果是这样,它对读者有何帮助? 最佳答案 这样做是为了防止名称冲突。默认规则是使用你的域名的反向作为包结构因此,Google会将其所有代码保存在com.google.*包中,而Microsoft会将其代码保存在com.microsoft.*包中。然后,如果两家公司都实现SearchEngine类,就不会发生命名冲突。教育
概述一、开源许可证的分类开源许可证分为2种类型:宽松型和著作权型。1、宽松型(Permissive):该类许可证往往只要求被许可方保留原作品的版权信息,对用户施加的限制较少,衍生软件可以成为私有软件,如Apache、MIT、BSD系列许可证。由于这类许可证允许衍生软件闭源,对商业化非常友好,因此广受欢迎。2、著作权型(copyleft):也称为互惠型、强保护型,要求对软件的修改和扩展,必须按照获得该软件的许可证进行开源,旨在促进开发人员的合作,保护源代码的自由共享,如GPL系列许可证。对于强制开源的许可证,使用要慎重,因为违反开源许可证被起诉已经有很多判例。进一步,可以区分为强著佐权和弱著佐权
比特计数可以通过多种方式完成,例如。带有设置位迭代器、未设置位迭代器、带有查找表或并行计数的预计算位。正如我通过搜索网络发现的那样,当未设置位较少时,未设置位迭代器速度很快,而设置位迭代器则相反。但是什么时候应该使用并行计数,尤其是MITHAKMEM(见下文)?它看起来相当快,尽管可能比查找表慢。就速度而言,它总是比设置/未设置位更好吗?除了速度和内存之外,还有其他关于选择哪一个的问题吗?intBitCount(unsignedintu){unsignedintuCount;uCount=u-((u>>1)&033333333333)-((u>>2)&011111111111);ret
个人开发者到底选择GPL协议还是MIT协议?为什么小米可以避开开源协议?安卓是开源的,为什么华为还要自己造鸿蒙?你知道史上最奇葩的开源协议吗?这些问题,都将在这篇文章中找到答案。目录GPL-强制开源LGPL-让公司能够白嫖代码卖钱MIT-受公司欢迎的宽松协议BSD-别借我的名气做宣传!Apache-避免法律纠纷WTFPL-我不敢写全称的奇葩协议开源,是很多个人开发者选择的道路。开源不仅能够帮助整个生态共同进步,也能够帮助个人开发者提升技术和名气,这一点从vue就能看出来。但是,开源的意思并不是没有规则,全部无条件的免费提供给别人用,必须要遵循一定的规则,这个规则就是开源协议(OpenSourc
文章目录IntroductionDurabilityatScaleReplicationandCorrelatedFailuresSegmentedStorageTheLogisTheDatabaseTheBurdenofAmplifiedWritesOffloadingRedoProcessingtoStorageStorageServiceDesignPointsTheLogMarchesForwardSolutionSketch:AsynchronousProcessingNormalOperationWritesCommitsReadsReplicasIntroduction现代的分布
我们正在受教xv6在我们的类(class)中。目前我们在windows下使用putty登录我们学校的linux服务器。在那里我们对xv6的源代码进行了更改(使用vim),然后在qemu中简单地编译并运行它makecleanmakemakeqemu-nox并非总是可以连接到他们的服务器,因此我希望能够使用Windows编译和运行xv6(显然在某些模拟器中)。我可以使用什么模拟器来完成上述工作?(编辑代码,编译和运行)以及如何? 最佳答案 好吧,在站点http://www.cs.mta.ac.il/~carmi/Teaching/OS.
好的,所以我有这个作业问题,我知道“主机X”向“主机Z”发送了一个数据包,Seq=46和Ack=87,有效负载/数据=“你好?”从那里我得到:一个从主机Z发送到主机X的数据包,有效负载='Goaway',最后一个数据包从主机X发送到主机Z,数据='No!'作业是找出最后两个数据包的Seq和Ack的值。我知道握手已经结束,所以它不仅仅是将Seq加1并将其放入下一个数据包的Ack中那么简单。我在某处读到,当接收到有效载荷时,接收者会发出一个等于1+有效载荷字节长度的Ack。如果那是正确的,我将如何将这些字符串转换为字节?Seq会发生什么?这仍然是直接从先前的数据包Ack中抓取的吗?非常感谢
MIT虚拟人AI-generatedCharacters一、项目简介二、原理简介三、代码实现1.数据准备2.函数定义3.人物选择/上传4.输入驱动选择/上传5.视频生成一、项目简介麻省理工学院媒体实验室(MITMediaLab)的研究人员开源了一个虚拟角色生成工具。该工具结合了面部、手势、语音和动作领域的人工智能模型,可用于创建各种音频和视频输出,一举登上《NatureMachineIntelligence》。该项目主要用于音频或视频驱动视频,暂不支持文本驱动视频。主要用于医疗视频或其他视频通话时保护个人隐私视频驱动视频,使著名的历史或现代人栩栩如生。项目地址:https://github.c