《Linux内核分析》 week4作业-使用嵌入式汇编调用一个系统调用

一.fork的嵌入式汇编执行

#include <stdio.h>
#include <unistd.h>

int main(){
    pid_t pid;

    asm volatile(
        "mov $0,%%ebx\n\t"
        "mov $0x2,%eax\n\t"
        "int 0x80\n\t"
        "mov %%eax,%0\n\t"
        :"=m"(tt)
    );

    if(pid==0){
        printf("child is running..\n");
    }
    else{
        printf("father is running...\n");
    }
}

 

 二.read的系统调用(带参数的系统调用)   

int read(int fd,char buf[],int len){
     int ret;
     asm volatile(
         "mov %3,%%edx\n\t" //count->edx
         "mov %2,%%ecx\n\t" //buf->ecx
         "mov %1,%%ebx\n\t" //fd->ebx
         "mov $0x3,%%eax\n\t"
         "int $0x80\n\t"
         :"=m"(ret)
         :"b"(fd),"c"(buf),"d"(count)
     );
     return ret;
}

 

三.实验总结

   通过这次实验,让我更加深刻地理解了系统调用的执行原理。当我们应用程序调用一个系统调用时,会触发一个int $0x80中断,由用户态进入内核态,同时由eax传入系统调用号,来最终使内核确定执行相应的内核程序。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。