《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传入系统调用号,来最终使内核确定执行相应的内核程序。

你可能感兴趣的:(linux)