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、
标签:调用,const,复习,char,参数,result,Linux,execve,内核 From: https://www.cnblogs.com/wxk1213/p/17477446.html