首页 > 其他分享 >Book-Riscv-XV6-Chap1

Book-Riscv-XV6-Chap1

时间:2024-02-29 17:03:42浏览次数:26  
标签:fork 文件 exec Riscv 描述符 Book call Chap1 进程

操作系统接口 – 阅读 xv6-riscv-book

Xv6的时钟周期:定时器芯片两次中断之间的时间
xv6作为一个简单的操作系统,利用一个“内核kernel”向其他运行中的程序提供服务的特殊程序,这个内核相当于连接了硬件和运行程序。
每一个正在运行的程序可以称为进程,都拥有子集的包含指令、数据、栈的内存空间。
指令实现程序的运算,数据是用于运算过程的变量,栈则管理程序的过程调用
内核对于一台计算机来说是唯一的。

进程会通过system call指令来调用一个内核服务。本质上是对操作系统上的接口调用。系统调用会进入内核,让内核执行服务然后返回。所以进程会在用户控件(软件层)和内核空间(操作系统层)交替运行。
System call指令由kernel提供。
内核会为每个进程关联一个PID。

进程和内存

如何创建一个进程

使用system call指令fork可以创建一个子进程。其内存内容与调用的进程完全相同,原进程称为父进程。
父进程中 fork返回子进程的PID
子进程中 fork返回0

创建一个简单的程序

在user文件夹下创建c文件,然后再Makefile文件中,UPROGS添加程序名称,然后直接在qemu中调用即可。
比如书中的fork程序
image
修改Makefile文件
image
在qemu中调用
image

exec系统调用指令

使用从文件系统中存储的文件所加载的新内存映像替换调用进程的内存,操作系统会从第一个参数的文件中加载指令到当前进程中,并且替换当前进程的内存。然后开始执行这些新加载的指令
exec有两个参数:可执行的文件名和字符串参数数组

#include "kernel/types.h"
#include "user/user.h"

int main()
{	
	//system call exe
	//echo
	char* argv[] = {"echo","this","is","echo",0};
	exec("echo",argv);
	printf("exec error\n");
	exit(0);
}

使用fork或者exec等系统调用指令,xv6系统都会分配内存。
fork依靠父进程创建子进程,需要分配足够拷贝父进程内存空间的内存
exec是切换进程,需要分配足够的内存空间供新进程使用。

I/O和文件描述符

文件描述符用于表示进程可以读取或写入的由内核管理的对象。
文件描述符所指的对象称为“文件”。通过文件描述符提供的接口可以将文件、管道和设备之间的差异抽象出来。
xv6内核使用文件描述符作为每个进程表的索引,每个进程都有一个从零开始的文件描述空间。
一个进程会从文件描述符0开始读取。将输出写入文件描述符1,将错误消息写入文件描述符2。

read 和 write system_call

  1. read
    read(fd,buf,n) 该system_call指令表明从文件描述符fd读取最多n字节,然后复制到buf中。文件的每个文件描述符都有一个与之关联的偏移量。每次read读取都是从当前文件偏移量开始读取数据,然后移动偏移量。没有字节可供读取会返回0
  2. write
    write(fd,buf,n) 将buf中的n字节写入文件描述符中,并返回写入的字节数,如果发生错误会写入小于n字节的数据,同样会存在一个文件偏移量

close system_call

用于释放一个文件描述符。新分配的文件描述符总是当前进程中编号最小的未使用描述符

I/O重定向

文件描述符和fork相互作用。
fork()会复制父进程的文件描述符表及其内存,使得子进程会具有和父进程完全相同的打开文件。
exec()会替换当前进程的内存,但会保留其文件描述符表。
所以当我们fork()后,可以在子进程中重新打开文件描述符,然后使用exec()来运行新程序。子进程修改的文件描述符不会影响到父进程。
这就是fork()和exec()两个sys_call相互分离的好处,在fork()后可以对子进程操作文件描述符而不会影响父进程。
但文件偏移量确实唯一的,即子进程修改了文件,那么偏移量发生了改变,父进程中的偏移量同样发生了改变。

dup sys_call

dup()接受一个文件描述符的参数,会返回这个文件描述符的引用,它们属于同一个I/O底层。这个实参和dup返回值共用一个文件偏移量。

管道

管道的两端一端用于写入,一端用于读取。为进程提供了一种通信方式。
管道具有阻塞机制,即管道的read会在没有输入时一直等待。

文件系统

标签:fork,文件,exec,Riscv,描述符,Book,call,Chap1,进程
From: https://www.cnblogs.com/XTG111/p/18042362

相关文章

  • becoming a Linux Kernal Hacker (books recommended)
    UnderstandingtheLinuxKernel,ThirdEdition3rdEditionbyDanielBovet(Author),MarcoCesati(Author)https://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/UnderstandingLinuxNetworkInternals:GuidedTourtoNetworkingonLinu......
  • [网鼎杯 2018]Fakebook
    [网鼎杯2018]Fakebook考点:sql数字型注入,php序列化,file协议,爬虫协议,源码备份,SSRF在view.php中发现数字型注入no=1or1=1回显成功no=1or1=2报错进行读取数据库数据测试字段数no=-1orderby1,2,3,4#一共四个字段读取数据库名(这里unionselect整体被过滤了)-1......
  • facebook, twitter, linkedin等的分享功能
    1.facebook分享方法一:传入参数,此时标题获取的是页面title标签中的内容<!DOCTYPEhtml><htmllang="en"><head><title>Document</title></head><body><ahref="https://www.facebook.com/sharer.php?u=https://www.go......
  • 虚拟环境下安装运行Jupyter Notebook
    首先本地安装虚拟环境1、安装virtualenvwin+R组合键进入运行窗口,然后输入cmd回车确认进入cmd命令窗口。 在cmd命令窗口输入以下命令,安装virtualenv。pipinstallvirtualenv-ihttps://pypi.douban.com/simple运行结果如下: 2.创建虚拟环境用命令行切......
  • mdbook安装使用实录
    简介mdbook是一个基于Rust的电子书系统,效果类似于gitbook。本人写图文文章一直都采用的印象笔记,但是写系列教程的情况不方便管理。因此引入mdBook,分享一下基本安装使用过程及遇到的问题。安装本机环境是win11。mdBook是写的Rust因此需要Cargo编译1.安装Rust官方下载地址: ......
  • 【机器学习科学库】全md文档笔记:Jupyter Notebook和Matplotlib使用(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论人工智能相关知识。主要内容包括,了解机器学习定义以及应用场景,掌握机器学习基础环境的安装和使用,掌握利用常用的科学计算库对数据进行展示、分析,学会使用jupyternotebook平台完成代码编写运行,应用Matplotlib的基本功能实现图形显示,应用Matplotlib......
  • Jupyter Notebook运行R程序安装过程释疑
    JupyterNotebook是一个开源的交互式笔记本环境,支持多种编程语言,包括Python和R。它被广泛应用于数据分析、机器学习、科学计算等领域。在JupyterNotebook中,用户可以结合编写文本、代码和可视化结果,以便于进行数据探索、模型开发以及结果展示。然而,随着项目的进展,往往需要对......
  • ansible-playbook
    ansible-playbookplaybooks本身由以下各部分组成(1)Tasks:任务,即通过task调用ansible的模板将多个操作组织在一个playbook中运行(2)Variables:变量(3)Templates:模板(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作(5)Roles:角色 palybook的基础应用实操1:通过......
  • ansible-playbook 之 roles
     rolesroles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include......
  • [Bookmark]--RP2040
    教程pico-examples开始使用树莓派PicoRP2040入门(一)配置开发环境开源项目logicanalyzer立创开源【核心板】RP2040最小系统YuzukiCorePicoRP2040核心板RP2040逻辑分析仪rp2040_demoRP2040开发板(兼容RaspberryPiPico)/************************(C)COPYLEFT2018M......