操作系统(李治军)实验3 系统调用

主要参考:

  1. https://blog.csdn.net/wangyi_lin/article/details/6921110
  2. https://github.com/Wangzhike/HIT-Linux-0.11/blob/master/2-syscall/2-syscall.md

这个实验我真的是做不下去了,对于我来说,真的是很难,汇编啥的只有一点点了解,基本就是mov命令cs ip等一些简单的东西。只能多看几遍了,第一遍看真的是啥也不懂。

下面先记录记录一下我在做实验3的时候遇到的一些不明白的地方,做一下汇总记录。

intel汇编 和 AT&T汇编 的区别

参考:https://blog.csdn.net/kennyrose/article/details/7575952

对于 __ asm __ volatile 函数讲解

在实验手册中首先介绍了close系统调用,但是对于下面的代码不是很明白:

1
2
3
4
5
6
7
8
9
10
11
int close(int fd)
{
long __res;
__asm__ volatile ("int $0x80"
: "=a" (__res)
: "0" (__NR_close),"b" ((long)(fd)));
if (__res >= 0)
return (int) __res;
errno = -__res;
return -1;
}

讲解:这是gcc内嵌汇编。

第一个冒号后表示汇编代码输出结果
第二个冒号后表示在这段汇编执行前输入
a 表示eax
b 表示ebx
0 表示这段代码列出的第一个寄存器即eax
这段代码的意思是把NR_close装入eax 把fd装入ebx 调用int指令陷入内核,内核返回后将eax的内容作为结果输出到res中。

另外,下面博客介绍了GCC内嵌汇编的使用:插入C语言的一个汇编语言代码片段可以分成4部分,以“:”号加以分隔,其一般形式为:\指令部:输出部:输入部:损坏部** https://blog.csdn.net/robbie1314/article/details/6329329

对include/unistd.h中添加的\NR__XXX的解释

\NR__”是在Linux的源码中为每个系统调用加上的前缀。这里其实是Linux自己命名习惯,无关紧要,但是当时看着很不理解。

关于sys.h 中 sys_call_table的介绍:

https://www.cnblogs.com/alantu2018/p/8991310.html

https://www.cnblogs.com/wuchanming/p/4490622.html

https://blog.csdn.net/qq_41453285/article/details/103055378