20233808 《Linux内核原理与分析》第五周作业

1.教材第五章学习及与chatgpt的对话

https://chat.openai.com/share/c4899523-cfb7-47a9-9c7c-e74688922c65

2.实验楼

(1)库函数API(mkdir函数)

#include <stdio.h>    
#include <stdlib.h>   // 包含标准库,用于使用exit函数
#include <sys/stat.h> // 包含sys/stat.h头文件,其中包含mkdir函数的声明

int main() {
    const char *dirname = "20233808"; // 指定要创建的目录名

    // 调用mkdir函数,创建名为"20233808"的目录,权限为0755
    if (mkdir(dirname, 0755) == 0) {
        printf("Directory created successfully.\n"); // 如果创建成功,打印成功消息
    } else {
        perror("mkdir"); // 如果创建失败,使用perror函数打印错误消息
        exit(1); // 退出程序并返回1作为错误码
    }

    return 0; // 返回0表示程序正常执行完成
}

1)模式0755表示文件所有者具有读取、写入和执行权限,文件所属组和其他用户具有读取和执行权限,但没有写入权限。

2)调用库函数API中直接使用mkdir(dirname, 0755) == 0语句进行调用。

(2)嵌入汇编(mkdir函数)

#include <stdio.h>    
#include <stdlib.h>   // 包含标准库,用于使用exit函数

int main() {
    const char *dirname = "202338082"; // 指定要创建的目录名
    int result; // 用于保存系统调用结果的变量

    asm volatile (
        "mov $39, %%eax\n"     // 设置系统调用号 (39 是 "mkdir" 的系统调用号)
        "mov %0, %%ebx\n"      // 设置目录名参数 (dirname)
        "mov $0755, %%ecx\n"   // 设置权限参数 (0755 权限)
        "int $0x80\n"          // 调用 0x80 中断来触发系统调用
        "mov %%eax, %1\n"      // 保存返回值 (结果) 到变量result
        : "=r" (result)        // 输出操作数
        : "r" (dirname)        // 输入操作数
        : "%eax", "%ebx", "%ecx" // 用于寄存器占用的约束
    );

    if (result == 0) {
        printf("Directory created successfully.\n");
    } else {
        perror("mkdir"); // 如果创建失败,使用perror函数打印错误消息
        exit(1); // 退出程序并返回1作为错误码
    }

    return 0; // 返回0表示程序正常执行完成
}

1)内嵌汇编代码具体步骤为:

  • 使用mov指令将系统调用号39放入寄存器%eax
  • dirname字符串的地址放入寄存器%ebx,作为mkdir的目录名参数。
  • 将权限模式0755放入寄存器%ecx,作为mkdir的权限参数。
  • 使用int $0x80触发0x80中断来执行系统调用。
  • 通过内联汇编中的约束,将系统调用的返回值(结果)从寄存器%eax复制到C变量result

(3)运行结果

成功创建两个目录20233808和202338082.

3.总结

对系统调用工作机制的理解:

库函数调用提供了更高的可移植性、代码清晰度和安全性,而内嵌汇编较为复杂且不常用。总之,系统调用是操作系统提供给用户程序的接口,允许用户程序执行特权操作,而不必了解或干涉底层硬件和内核细节,使用便利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值