rcore-os / rCore-Tutorial-Book-v3

A book about how to write OS kernels in Rust easily.
https://rcore-os.github.io/rCore-Tutorial-Book-v3/
GNU General Public License v3.0
1.23k stars 233 forks source link

rCore-Tutorial-Book-v3/chapter7/2pipe #113

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

管道 — rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档

https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter7/2pipe.html

lindyang commented 2 years ago

还需姚

PeterWrighten commented 2 years ago

有一个问题,读完buffer后self.head == self.tail然后更新状态为空,不需要将buffer里的字段清空吗(只是读完了为空,但字段数据还在)?

wyfcyx commented 2 years ago

有一个问题,读完buffer后self.head == self.tail然后更新状态为空,不需要将buffer里的字段清空吗(只是读完了为空,但字段数据还在)?

@PeterWrighten 即使里面还有数据,但是ring buffer逻辑上已经为空了,这些数据也不会再被读到了。后面往ring buffer里写入新数据覆盖掉老数据,这些新数据才会被读到。

PeterWrighten commented 2 years ago

有一个问题,读完buffer后self.head == self.tail然后更新状态为空,不需要将buffer里的字段清空吗(只是读完了为空,但字段数据还在)?

@PeterWrighten 即使里面还有数据,但是ring buffer逻辑上已经为空了,这些数据也不会再被读到了。后面往ring buffer里写入新数据覆盖掉老数据,这些新数据才会被读到。

好的,谢谢

Wonderland23333 commented 2 years ago

管道的系统调用原型及使用方法

“因此,在第 25 和第 34 行,分别第一时间在子进程中关闭管道的写端和在父进程中关闭管道的读端。父进程在第 35 行将字符串 STR 写入管道的写端,随后在第 37 行关闭管道的写端;子进程在第 27 行从管道的读端读取字符串,并在第 29 行关闭。”

代码的行数对应错误了

olinex commented 8 months ago

这个地方

    let mut pipe_fd = [0usize; 2];
    pipe(&mut pipe_fd);

感觉应该是有问题的, 在用户态空间创建的一个栈上字节数组, 是有可能跨内存页的, 也就是在用户态上内存地址连续, 但是在内核态上两个字节分别存储在两个不连续的内存页开头和结尾. 跟传递字符串指针一样, 需要在内存空间手动拼接, 否则会出现不合法的内存访问, 这里是不是可以直接把两个 usize 放到不同的 syscall 参数当中呢? 或者我们可以换一个思路, 让每个进程在申请用户态栈空间的时候, 必须是连续的内存空间?

alanvirus commented 3 months ago

这个地方 let mut pipe_fd = [0usize; 2]; pipe(&mut pipe_fd); 感觉应该是有问题的, 在用户态空间创建的一个栈上字节数组, 是有可能跨内存页的, 也就是在用户态上内存地址连续, 但是在内核态上两个字节分别存储在两个不连续的内存页开头和结尾. 跟传递字符串指针一样, 需要在内存空间手动拼接, 否则会出现不合法的内存访问, 这里是不是可以直接把两个 usize 放到不同的 syscall 参数当中呢? 或者我们可以换一个思路, 让每个进程在申请用户态栈空间的时候, 必须是连续的内存空间?

@olinex,两个fd是分别翻译的,因此跨内存页也没事 translated_refmut(token, pipe) = read_fd; translated_refmut(token, unsafe { pipe.add(1) }) = write_fd;