计科1601 16281052 杨涵晨
一.系统调用实验
- 参考下列网址中的程序。阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序(请问getpid的系统调用号是多少?linux系统调用的中断向量号是多少?)。
- 上机完成习题1.13。
- 阅读pintos操作系统源代码,画出系统调用实现的流程图。
1.1题解答:
API 接口函数的直接调用代码如下:可以看到直接利用getpid()函数进行,然后返回到预先定义好的变量pid中。然后将pid打印出来。
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = getpid();
printf("%d\n",pid);
return 0;
}
利用gcc进行编译,生成可执行文件然后运行得到:3064
通过查看文档发现,getpid()函数功能为进行进程的查看,返回值为进程识别码。
通过进行linux系统调用号查询,查看vim 中的文件,可以看到这我的系统中getpid为172.但是上网查询(64位linux的编号为39,32位20)
在汇编代码中调用中,利用汇编的软中断进行调用,int 0x80;将汇编代码嵌套在c中。代码如下:
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t tt;
asm volatile (
"movl $0x14,%%eax\n\t"
"int $0x80\n\t"
"movl %%eax,%0\n\t"
:"=m"(tt)
);
printf(" current PID is : %u\n",tt);
return 0;
}
1.2题解答:
C语言的程序代码如下进行gcc编译与执行,直接调用printf()函数,进行实现
#include <stdio.h>
int main()
{
printf("hello world!!!");
return 0;
}
执行结果如下:
汇编的代码如下,通过nasm进行编译和实现。
section .data
msg db "Hello, world!",0xA
len equ $ - msg
section .text
global _start
_start:
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,len
int 0x80
mov eax,1
xor ebx,ebx
int 0x80
执行结果如下:
1.3题解答:
pintos中关于系统调用的主要源码:
- /src/lib/user/syscall.c
宏定义了四种系统调用的方式,分别是不传递参数、传递一个参数、传递两个参数、传递三个参数,如下所示:
define syscall0(NUMBER)