Linux内核期末复习

发布时间 2023-06-13 14:39:50作者: wxk1213

1、P22-25

2、P36、P165

ret指令的作用:

进程切换时用什么函数

 

_switch_to_函数如何理解 怎么实现

 

 

3、gcc、gdb命令

 

gdb

 

堆栈汇编典型示例:

 

反汇编指令:

 

 

4、内嵌汇编(10号系统调用)

#include <stdio.h>

int main() {
    long result;
    long syscall_number = 10; // 10号系统调用的编号
    long arg1 = 1; // 参数1
    long arg2 = 2; // 参数2

    asm volatile (
        "mov %1, %%rax\n\t"    // 将系统调用号存入寄存器rax
        "mov %2, %%rdi\n\t"    // 将参数1存入寄存器rdi
        "mov %3, %%rsi\n\t"    // 将参数2存入寄存器rsi
        "syscall\n\t"          // 进行系统调用
        "mov %%rax, %0\n\t"    // 将返回值存入变量result
        : "=r" (result)         // 输出操作数:返回值存入result
        : "r" (syscall_number), "r" (arg1), "r" (arg2) // 输入操作数:系统调用号、参数1、参数2
        : "%rax", "%rdi", "%rsi" // 受影响的寄存器
    );

    printf("Result: %ld\n", result);
    return 0;
}

 

 

5、fork()系统调用

 

 

0、1、2号进程

 

fork()内核机制

 

execve函数

 

int execve(const char *filename, char *const argv[], char *const envp[]);

其中,argv[]是一个以NULL结尾的字符串数组,用于传递命令行参数给新程序。每个字符串元素都是一个命令行参数,第一个元素通常是可执行文件的名称。

envp[]是一个以NULL结尾的字符串数组,用于传递环境变量给新程序。每个字符串元素都是一个环境变量,形如"key=value"的格式。

#include <unistd.h>

int main() {
    char *const argv[] = { "program", "arg1", "arg2", NULL };
    char *const envp[] = { "VAR1=value1", "VAR2=value2", NULL };

    execve("/path/to/program", argv, envp);

    // execve函数执行成功后,下面的代码不会被执行到,
    // 因为进程已经被替换为新程序。
    // 如果execve函数执行失败,会返回-1,并根据errno设置相应的错误码。

    return 0;
}

 

 

6、ELF

 

怎么映射到内存:

使用execve系统调用

 

 

符号表、重定位

 

 

7、

  

 

 

8、