Linux实验代码,Linux实验四报告(示例代码)

张文俊 + 原创作品转载请注明出处+ 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、学习内容

系统调用:操作系统为用户态进程与硬件设备进行交互提供了一组接口

API:应用编程接口,是一个函数定义。

操作系统提供API和系统调用的关系。

二、实验部分:两种方式调用系统调用

用户态进程——(调用)——>系统调用

传参

getpid()函数功能:

取得进程识别码,返回值是进程的ID 这里直接使用getpid库函数进行系统调用。

传入的参数为NULL,通过EAX传入,再通过EAX将返回值传回。

其次,分析汇编代码调用系统调用的工作过程

975ce8b9bf8840438fd71261d5256727.jpg

系统调用传递第一个参数ebx,这里是null

8行,将ebx清零; 9行,将20放入EAX 11行,返回值用EAX存储

总之,int 80触发中断,找到中断向量表,从表中寻找中断向量(或中断门),通过中断向量,找到系统调用表,

找到system_call JMP EAX*4+system_table

最后,对两者的编译结果进行分析:两种方式的编译运行结果分别是2999和3065。

6a31d1be451d4ed5a3b79e58a9c5d763.jpg

三、总结部分

系统调用工作机制,就是应用程序应该以某种方式(库函数或汇编代码)通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态。

内核就可以代表应用程序在内核空间执行系统调用。

此外,通知内核的机制是靠软中断实现的:

通过引发异常将系统切换内核态执行异常处理程序(系统调用处理程序)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的进程通信实验代码,使用 Linux 的管道(pipe)实现父进程和子进程之间的通信。 ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define BUFFER_SIZE 25 #define READ_END 0 #define WRITE_END 1 int main(void) { char write_msg[BUFFER_SIZE] = "Hello, world!"; char read_msg[BUFFER_SIZE]; int fd[2]; pid_t pid; /* 创建管道 */ if (pipe(fd) == -1) { fprintf(stderr, "Pipe failed"); return 1; } /* 创建子进程 */ pid = fork(); if (pid < 0) { /* 错误处理 */ fprintf(stderr, "Fork failed"); return 1; } if (pid > 0) { /* 父进程 */ /* 关闭写端 */ close(fd[READ_END]); /* 写入数据到管道 */ write(fd[WRITE_END], write_msg, strlen(write_msg)+1); /* 关闭管道 */ close(fd[WRITE_END]); } else { /* 子进程 */ /* 关闭读端 */ close(fd[WRITE_END]); /* 从管道中读取数据 */ read(fd[READ_END], read_msg, BUFFER_SIZE); printf("Received message: %s\n", read_msg); /* 关闭管道 */ close(fd[READ_END]); } return 0; } ``` 该代码创建了一个管道,然后使用 `fork()` 创建了一个子进程。在父进程中,它将 `write_msg` 写入管道中,并关闭了管道的写端。在子进程中,它从管道中读取数据到 `read_msg` 中,并输出该消息。最后,子进程关闭了管道的读端。 注意,这只是一个简单的示例,实际上进程通信可能涉及更复杂的数据结构和协议。此外,此代码还没有进行错误处理,例如管道是否已成功创建和关闭等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值