首页 > 其他分享 >Xv6 操作系统组织架构

Xv6 操作系统组织架构

时间:2023-07-01 16:23:13浏览次数:54  
标签:ECALL sys 调用 架构 操作系统 kernel exec Xv6 SYS

进程概述

64 位的 RISC-V 的 VAS 是 39 位的,即 VA 只有 39 位,而 Xv6 则只有 38 位,最大虚拟地址为 #define MAXVA 0x3fffffffff

VAS 的顶端,即最高位存放了两个 page,一个是用于 trampoline,一个用于 mapping the process's trapframe。 Xv6 使用这两个 page 来切换到内核以及返回。

进程的状态被定义在 kernel/proc.h 的结构体 struct proc 所描述,进程在内核中最重要的信息就是它的 page table、 kernel stack 以及运行状态(run state)。

A process can make a system call by executing the RISC-V ecall instruction. This instruction raises the hardware privilege level and changes the program counter to a kernel-defined entry point.

The code at the entry point switches to a kernel stack and executes the kernel instructions that implement the system call. When the system call completes, the kernel switches back to the user stack and returns to user space by calling the sret instruction. (x64 架构似乎是 iret?)

tNX75y3sYmVHobl

User/Kernel mode 切换

我们是如何从 user mode 进入到 kernel mode 的?

例如,当 ls 程序运行时,会调用 read/write 系统调用;shell 程序会调用 fork 或者 exec 系统调用,所以必须要有一张方式可以使得用户的应用程序能够将控制权以一种协同工作的方式转移到内核,这样内核才能提供相应的服务。

在 RISC-V 中,有一个专门的指令用于实现这一功能,叫做 ECALL(指令而非函数?),ECALL 接收一个数字参数,当一个用户程序想要将程序的执行控制权转移到内核,它只需要执行 ECALL 指令,并且传入一个数字。这里的数字参数代表了应用程序想要调用的 System CallSystem Call 表如下所示:

static uint64 (*syscalls[])(void) = {
    [SYS_fork] sys_fork,
    [SYS_exit] sys_exit,
    [SYS_wait] sys_wait,
    [SYS_pipe] sys_pipe,
    [SYS_read] sys_read,
    [SYS_kill] sys_kill,
    [SYS_exec] sys_exec,
    [SYS_fstat] sys_fstat,
    [SYS_chdir] sys_chdir,
    [SYS_dup] sys_dup,
    [SYS_getpid] sys_getpid,
    [SYS_sbrk] sys_sbrk,
    [SYS_sleep] sys_sleep,
    [SYS_uptime] sys_uptime,
    [SYS_open] sys_open,
    [SYS_write] sys_write,
    [SYS_mknod] sys_mknod,
    [SYS_unlink] sys_unlink,
    [SYS_link] sys_link,
    [SYS_mkdir] sys_mkdir,
    [SYS_close] sys_close,
    [SYS_trace] sys_trace,
};

ECALL 会跳转到内核中一个特定的、由内核控制的位置,在 Xv6 中存在一个唯一的系统调用接入点,每一次应用程序执行 ECALL 指令,应用程序都会通过这个接入点进入到内核中。例如,不论是 shell 还是其他的应用程序,当它在用户空间执行 fork 时,它并不是直接调用操作系统中对应的函数,而是调用 ECALL 指令,并将 fork 对应的数字 SYS_fork 作为参数传给 ECALL,之后再通过 ECALL 跳转到内核中。

在内核侧,有一个位于 syscall.c 的函数 syscall,每一个从用户程序发起的系统调用都会调用到这个 syscall 函数,syscall 函数会检查 ECALL 的参数,通过这个参数,内核可以知道要调用的是 fork

假设现在要执行另外一个系统调用 exec,两个参数,用户代码会将 exec 需要的参数存放在寄存器 a0a1 中,事实上这里的两个参数都是地址,并将系统调用号存放在寄存器 a7 中。

用户态中执行的 exec 系统调用并不能直接执行内核中的 exec 代码,而是要由封装好的系统调用函数执行 ECALL 指令,所以 exec 函数实际上调用的是 ECALL 指令,指令的参数代表了 exec 系统调用的索引数字,之后控制权到了 syscall 函数,syscall 函数才实际调用 exec 系统调用。

Xv6 启动流程

RISC-V 启动时,先运行一个存储于 ROM 中的 bootloader 程序 kernel.ld 来加载 xv6 kernel 到内存中,然后在 machine 模式下从 _entry 开始运行 Xv6。bootloader 将 xv6 kernel 加载到 0x80000000 的物理地址中,因为前面的地址中有 I/O 设备

_entry 中设置了一个初始 stack,stack0 来让 Xv6 执行 kernel/start.c。在 start 函数先在 machine 模式下做一些配置,然后通过 RISC-V 提供的 mret 指令切换到 supervisor mode,使 program counter 切换到 kernel/main.c

main 先对一些设备和子系统进行初始化,然后调用 kernel/proc.c 中定义的 userinit 来创建第一个用户进程。这个进程执行了一个 initcode.S 的汇编程序,这个汇编程序调用了 exec 这个 system call 来执行 /init,重新进入 kernel。exec 将当前进程的内存和寄存器替换为一个新的程序(/init),当kernel执行完毕exec指定的程序后,回到 /init 进程。/inituser/init.c)创建了一个新的 console device 以文件描述符 0, 1, 2 打开,然后在 console device 中开启了一个 shell 进程,至此整个系统启动了

标签:ECALL,sys,调用,架构,操作系统,kernel,exec,Xv6,SYS
From: https://www.cnblogs.com/zwyyy456/p/17519456.html

相关文章

  • Linux主流架构运维工作简单剖析
    随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如CentOS、RedHat、Ubuntu、Fedora等等,成千上亿个网站涌现在当今互联网,互联网已经成为必不可少的工具,那今天我们跟大家一起来分享讨论目前用的最多的Linux下主流网站架构。随着IT运维......
  • 系统架构设计师随笔
    memcached文档下载:http://www.jb51.net/books/42140.htmlgit教程:廖雪峰:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000redis中文文档:http://doc.redisfans.com/redis下载网站:https://redis.io/downloadredis安装参考解压的文件夹里面的READ......
  • Linux操作系统加固建议
    1、Linux操作系统加固建议1.1.1口令锁定策略1、执行备份(1)、redhat执行备份:#cp-p/etc/pam.d/system-auth/etc/pam.d/system-auth_bak(2)、SUSE9:#cp-p/etc/pam.d/passwd/etc/pam.d/passwd.bak(3)、SUSE10:#cp-p/etc/pam.d/common-passwor......
  • 数字经济下的架构新图景—2023架构·可持续未来峰会(北京主会场)成功举办!
     2023 年6 月29日,由TheOpenGroup主办的2023架构·可持续未来峰会(北京主会场)在机械工业出版社圆满落幕。 本次大会以“可持续未来”为主题,采取1+3,即北京主会场+上海/成都/深圳三个城市峰会场模式,聚焦架构设计、架构语言、云计算、微服务、敏捷转型、人才培养等丰富主题,为150......
  • 企业架构师权威认证—TOGAF® 认证组合中文考试正式上线!
    @所有架构从业人员TOGAF®认证组合中文版考试正式上线啦!  TheOpenGroup亚太区负责人高美华女士进行发布 千呼万唤始出来—TOGAF®认证组合中文版考试正式上线!一直翘首以待中文版考试的朋友们可以开始报名预约啦! 2023年6月29日,在TheOpenGroup主办的「架构·可持续未来峰会......
  • UWB定位系统的应用及技术架构详解
    UWB定位是通过TDOA到达时间差的算法来实现人员定位的,有抗遮挡、抗干扰的优点,更适用于室内定位。其次,UWB是一种实时定位技术,可以不停的上报当前的人员数据,实时性非常强。再者,UWB定位系统的超高精度,定位误差小于10cm,使企业能够很精确的对人员进行监控。最为重要的是,UWB定位系统还可提......
  • RedHat 6.9 操作系统安装
    重启服务器--按F11--biosbootmanager---选择自己的U盘通过U盘启动RedHat6.9系统,如图安装界面:选择Installorupgradeanexisingsystem选项回车。系统安装进程初始化成功后,提示安装系统是否进行测试。按键盘tab移动光标选择Skip点击回车进入图形化系统安装界面,点击NEXT......
  • 微服务架构必读篇 - 网关
    前言由于互联网的高速发展,网络数据请求数激增,使得服务器承受的压力越来越大。在早期的系统架构中,为减轻单台服务器的压力,通常使用LoadBalancer来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多,传统的LoadBalancer为主的系统架构的局限性就变得明显起来......
  • celery 之 celery介绍架构和安装、celery执行异步任务、包结构celery、celery执行
    目录一、celery介绍架构和安装1、celery:分布式的异步任务框架,主要用来做:2、celery框架,原理3、celery架构4、安装celery5、celery不支持win,所以想再win上运行,需要额外安装eventlet二、celery执行异步任务基本使用1再虚拟环境中装celery和eventlet2写个py文件,实例化得到app对象......
  • 11celery介绍架构和安装,celery执行异步任务,包结构celery,celery执行延迟任务和定时任务
    1celery介绍架构和安装#celery:分布式的异步任务框架,主要用来做: -异步任务-延迟任务-定时任务---》如果只想做定时任务,可以不使用celery,有别的选择#celery框架,原理1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)2)celery服务为为其他项目......