标签:read qemu 目的 lex apt-get 函数 call 接口 aliyun
学号520 实验环境基于ubuntu18.04
选择系统调用号20 getpid()分析
先安装 sudo apt install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib
使用gdb断点
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr
API和系统调用不是一个含义,API是应用编程接口,只是一个函数定义。而系统调用通过软中断(trap)向内核发出一个明确的请求。
API的作用是触发一个系统调用,这样系程序员只需要调用API,而不用触发中断,传递调用号等过程。
每个系统调用对应一个封装例程,库(Libc)引用这些封装例程定义出给用户的API。
所以一个API可能对应0~n个系统调用
在test.c中增加函数GetPID
1 #include <stdio.h> 2 #include <unistd.h> 3 int GetPID() 4 { 5 pid_t t,asm_t; 6 t =getpid(); 7 printf("pid = %d\n",t); 8 asm volatile( 9 "mov $0x14,%%eax\n\t" 10 "int $0x80\n\t" 11 "mov %%eax,%0\n\t" 12 :"=m"(asm_t) 13 ); 14 printf("asm_t = %d\n",asm_t); 15 return 0; 16 }
从实验中我们可以发现
通过eax传递系统调用号,然后由system_call交给system_service完成工作;system_service完成工作后,结果又由eax传递给用户态堆栈。
标签:read qemu 目的 lex apt-get 函数 call 接口 aliyun
原文地址:https://www.cnblogs.com/cyzhou96/p/10549726.html