Lab2:深入理解系统调用

实验要求

  • 本次实验采用39号系统调用
  • 通过汇编指令触发该系统调用
  • 通过gdb跟踪该系统调用的内核处理过程
  • 重点阅读分析系统调用入口的保存现场、恢复现场和系统调用返回,以及重点关注系统调用过程中内核堆栈状态的变化

操作系统发展的过程中保证系统稳定性和安全性的⼀种机制

Linux 操作系统中只是采⽤了其中的 0 和 3 两个级别,分别对应内核态和⽤户态。

从用户态到内核态

1、外部中断(硬件中断)

  用户态进程执行时,硬件中断信号到来,进入内核态,执行中断服务程序

2、内部中断(陷入)

  用户态进程执行时,调用了一个系统调用,陷入了内核态

查看39号系统调用,为:mkdir

 Lab2:深入理解系统调用_第1张图片

 通过 man 手册对 mkdir 指令进行查看

 Lab2:深入理解系统调用_第2张图片

 1 #include 
 2 #include 
 3 
 4 int mkdir(const char *pathname, mode_t mode);
 5 
 6 #include            /* Definition of AT_* constants */
 7 #include 
 8 
 9 int mkdirat(int dirfd, const char *pathname, mode_t mode);
10 
11 glibc的功能测试宏要求(请参阅feature_test_macros(7)):
12 
13 mkdirat():
14            Since glibc 2.10:
15                _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
16            Before glibc 2.10:
17                _ATFILE_SOURCE

描述:

  mkdir()尝试创建一个名为pathname的目录。

  参数mode指定新目录的mode(参见stat(2))。它按照通常的方式被进程的umask修改:在没有默认ACL的情况下,创建目录的模式是(mode&umask&0777)。其他模式位是否符合创建的目录取决于操作系统。对于Linux,请参阅下面的注释。

  新创建的目录将由进程的有效用户标识拥有。如果包含该文件的目录设置了set-group-ID位,或者文件系统是使用BSD组语义(mount -o bsdgroups或者同义地mount -o grpid)装载的,则新目录将继承其父目录的组ID; 否则它将被该进程的有效组ID所拥有。

  如果父目录设置了set-group-ID位,那么新创建的目录也是如此。

返回值:

  mkdir()和mkdirat()在成功时返回0,如果发生错误,则返回-1(在这种情况下,适当地设置errno)

编写代码

 1 #include 
 2 #include 
 3 #include 
 4 #include <string.h>
 5 #include 
 6 #include 
 7  
 8 int main(int argc,char *argv[]) 
 9 {
10     if(argc != 2)
11     {
12         printf("mkdir:argc error\n");
13         exit(0);
14     }
15     
16     if(mkdir(argv[1],O_CREAT|0600) == -1)
17     {
18         perror("mkdir error");
19     }
20     
21     exit(0);
22 }

Lab2:深入理解系统调用_第3张图片

 

你可能感兴趣的:(Lab2:深入理解系统调用)