操作系统—xv6内核环境配置

news2024/11/16 8:30:38

文章目录

  • xv6内核环境配置
    • 1.开发环境的准备
      • (1).如果日常用Linux
      • (2).Windows的回合
        • #1.两个常见方法
        • #2.wsl的一点安装细节
        • #3.记得升级成wsl-2
      • (3).如果你是macOS
        • #1.一些起因
        • #2.最乐的一集
        • #3.Homebrew的配置
        • #4.mac用户的特权
    • 2.先换apt源
    • 3.安装xv6的依赖
    • 4.克隆RISC-V GNU 编译器工具链
    • 5.编译RISC-V GNU 编译器工具链
    • 5.安装QEMU-5.1.0
    • 6.克隆xv6内核代码,编译,QEMU启动
    • 7.GDB远程调试xv6(仅限WSL)

xv6内核环境配置

  这学期的操作系统实验课我们采用了MIT的xv6-riscv内核,所以要配置对应的qemu环境以及一套可用的RISC-V的编译工具链,理论上讲,是有一点点困难的,这里我总结了一下配置的方法,可能会对你有一点帮助

1.开发环境的准备

(1).如果日常用Linux

  如果你已经日常使用Linux了,那直接跳到3,直接安装依赖然后克隆仓库安装即可,我想你都有这能力了,大概率也不需要看这一篇博客了

(2).Windows的回合

#1.两个常见方法

  大部分情况实际上则是大家使用的是Windows,并且很大一部分人用的是Windows 10/11,你当然可以直接采用经典的VMware Workstation Pro/Oracle VirtualBox安装Ubuntu-23.10虚拟机的流程即可,但对于Windows 10/11,这里更加推荐你使用Windows Subsytem for Linux(WSL),这是微软从Windows 10的某一次大更新之后开始为Windows准备的Linux子系统,它基本上能以一个应用的形式存在于你的Windows当中,在WSL下配置xv6内核会非常方便

#2.wsl的一点安装细节

  这里我就不细讲WSL的安装方法了,主要是几个步骤:在控制面板的程序与功能中,点击左侧的启用或关闭 Windows 功能,在Hyper-V,Windows 虚拟机监控程序平台,适用于 Linux 的 Windows 子系统以及虚拟机平台前打钩(这一步中如果你用的是家庭版系统可能没有Hyper-V选项,不过这并不重要),然后点击确定,Windows 会帮你完成这些功能的添加,之后需要重启一次机器
在这里插入图片描述

  机器重启后,打开尘封已久的Microsoft Store,在搜索栏搜索Ubuntu,你应该能看到好几个结果,这里推荐选择Ubuntu 22.04.3 LTS,能出现在Microsoft Store里的Ubuntu一般都是LTS也就是长期支持版本,怎么说也相对是比较稳定的
在这里插入图片描述

  安装完成后直接启动,这一步可能会出现非常多的问题,你需要自行上网查阅资料解决,有几个常见的问题,比如需要你去BIOS中开启虚拟化的,这个就在开机时按住某个按键(自己搜搜看电脑型号对应的按键是什么),然后找到类似SVM Mode或者虚拟化之类的选项,将它启用即可

#3.记得升级成wsl-2

  现在安装的WSL一般已经是WSL-2了,为了后续的操作,我也推荐你把WSL升级为WSL-2,如果是手动升级的,你还需要在powershell里使用wsl --set-version指令进行已安装的发行版的wsl版本更换,这里也不再赘述

(3).如果你是macOS

#1.一些起因

  最近我也整了一台mac,因为mac现在全系转向arm,其实有很多事情是做不了的,这也的确是一个麻烦的问题,然后昨天我去查阅了一下MIT 6.S081也就是xv6这个内核对应的课程Operating System Engineering的课程网站,我发现课程提供的的配置教程中竟然也提供了macOS的安装方法

#2.最乐的一集

  最戏剧化的一幕来了,我本来以为macOS也要走后面章节中那些麻烦的git clone以及make的流程,没想到用homebrew几行代码就解决了,配置好代理的情况下只要五分钟,你就可以直接make qemu启动xv6了,所以macOS非常适合完成xv6的环境配置

  顺便提一嘴,homebrew是一个类似于debian下的apt,centos下的yum以及最近出现的windows下的winget的包管理器,很多软件包你都可以用过homebrew快速安装,常用的指令如下:

brew search 软件包名        # 查询软件包
brew install 软件包名       # 安装软件包
brew uninstall 软件包名     # 卸载软件包

  这个软件比你想的可能会多一点,在apt下我们一般也就装一些基本插件,但是brew里面我们甚至可以安装有图形界面的mac版bilibili,你只需要:

brew install bilibili

  这样就安装完毕了,非常优雅,macOS用户后面就可以直接采用brew完成环境的配置

#3.Homebrew的配置

  其实刚刚的配置手册中已经有了macOS连带配置homebrew的流程了,但是通过这个方式安装的homebrew还需要手动换源,之前我看到有博客制作了一些能够自动安装并切换国内源的脚本,我自己也是使用这个的,因此你可以参考这篇博客来完成Homebrew的安装:Homebrew国内如何自动安装(国内地址)(Mac & Linux)

#4.mac用户的特权

  到这儿我相信你的Homebrew已经装好了,接下来你只需要在你的终端里输入:

xcode-select --install

  这一行代码用于安装macOS下的开发者工具,然后用brew安装git(后续需要下载仓库代码):

brew install git

  之后就可以三条指令安装RISC-V的编译器工具链了:

brew tap riscv/riscv
brew install riscv-tools
PATH=$PATH:/usr/local/opt/riscv-gnu-toolchain/bin

  前面两行代码负责安装riscv-tools,最后一行则是把它加入到环境变量中,需要注意的是,第三行的路径可能会因为芯片而产生差异,在x86-64的环境下,homebrew的安装目录默认并不在/usr/local/opt下,你需要把第三行代码修改为真实安装的目录

  接下来安装一下QEMU:

brew install qemu

  好了,结束了,接下来你可以直接跳到6了,后面的编译之类的工作不需要做了,遥遥领先

2.先换apt源

  如果是全新安装的Ubuntu,需要首先更换apt源,否则后续所有的apt-get install操作都会非常慢,这里推荐更换清华源(来自清华大学TUNA协会),进入之后点击开源软件镜像站,向下翻找到ubuntu,点击右边的问号:

在这里插入图片描述

  进入之后你能看到对应于Ubuntu-22.04 LTS的一串代码:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

  这固然很好,但是这上面没有对最新的Ubuntu-23.10 (mantic)进行适配,如果你选择的是Ubuntu-22.04及之前的版本,可以直接在上面点选更换,否则如果是23.10,就把上面所有的jammy更换为mantic:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ mantic-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ mantic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-proposed main restricted universe multiverse

  这时候在你的Linux终端里输入:

cd /etc/apt
sudo mv sources.list sources.list.b
sudo vim sources.list # 如果提示不存在vim,那就换用下面这一条
# 或者,上下两条二选一
sudo vi sources.list

  进入之后首先按i,当左下角显示INSERT的时候,把上面的代码复制粘贴进去,然后按下Esc键,之后输入 :wq(这个冒号也要输入!)这样就可以保存并退出vim/vi了,然后接下来在命令行中输入:

sudo apt-get update

  等更新完了之后,就可以完成后续的操作了。如果你用的是arm版的ubuntu,请在刚刚进入镜像站的那个地方找到ubuntu-ports,点击旁边的问号,arm版的ubuntu需要使用ubuntu-ports源而不是ubuntu源(不过,官网的arm版ubuntu是没有图形界面的,我觉得你要是自己能装,你也不需要我告诉你应该干什么了)

3.安装xv6的依赖

  最重要的是mpc, mpfr和gmp,这三个是gcc的依赖,没有的话会在后续的编译步骤中报错

sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

4.克隆RISC-V GNU 编译器工具链

  GitHub不加速是没有办法直接git clone滴~这里用gitee的riscv-gnu-toolchain进行一个镜像站的拉取(可能还是需要使用科学上网,所以这里推荐使用WSL-2),这个方法来自riscv-gnu-toolchain 下载编译 及 xv6 os编译试运行这篇博客,效率还是很不错的

git clone https://gitee.com/mirrors/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git clone --recursive https://gitee.com/mirrors/qemu.git
git clone --recursive https://gitee.com/mirrors/riscv-newlib.git
git clone --recursive https://gitee.com/mirrors/riscv-binutils-gdb.git
git clone --recursive https://gitee.com/mirrors/riscv-dejagnu.git
git clone --recursive https://gitee.com/mirrors/riscv-glibc.git
# riscv-gcc 超过1G,会clone出错,这里设置拉取最近一次提交的版本
git clone --depth 1 https://gitee.com/mirrors/riscv-gcc.git

  如果不幸,在git clone过程中多次失败然后中断,你需要删除已经被git clone创建的目录,使用如下命令进行删除

rm -rf 文件夹路径

严重警告:rm -rf是一个非常危险的指令,在敲下回车之前一定要仔细检查你输入的路径是否正确,例如在克隆qemu仓库的时候出错,你应该输入rm -rf qemu,这样就好了,不要加上多余的内容

5.编译RISC-V GNU 编译器工具链

  上述克隆仓库后,需要进行编译

# 首先确定自己在~/riscv-gnu-toolchain目录下
mkdir riscv-gdb riscv-binutils
cd riscv-binutils-gdb
cp -a * ../riscv-gdb
cp -a * ../riscv-binutils

  在确保~/riscv-gnu-toolchain/riscv-gdb和riscv-binutils两个文件夹中确实有了文件之后,接下来进行编译操作:

cd ~/riscv-gnu-toolchain
./configure --prefix=/usr/local
sudo make -j4 # 这里的数字意思是用4线程编译,如果你的机器核比较多,可以开更多,比如我是make -j16

  编译需要等待非常长的时间,期间你的CPU占用率可能会飙升到全核100%,内存占用率也可能会瞬间提高,请务必在编译命令开始前关闭一些不必要的程序,例如浏览器等

5.安装QEMU-5.1.0

  xv6内核的允许需要用到QEMU,所以这里需要安装QEMU:

cd ~ # 进入用户目录
wget https://download.qemu.org/qemu-5.1.0.tar.xz

  以防万一,直接安装几个QEMU对应的依赖:

sudo apt-get install pkg-config libglib2.0-dev libpixman-1-dev

  解压,进入目录,配置,编译,安装,这一步的时间比较长,请耐心等待

tar xf qemu-5.1.0.tar.xz
cd qemu-5.1.0
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"
make -j4 # 多线程更快
sudo make install # 写入/usr/local目录需要sudo权限 

  结束之后,因为编译的目标目录都在/usr/local下,因此可以直接在bash下用两个–version来测试是否安装成功:

riscv64-unknown-elf-gcc --version
qemu-system-riscv64 --version

  这里出现两个正常打印出的版本信息,就是安装成功了

6.克隆xv6内核代码,编译,QEMU启动

  我们的实验在我们的一个仓库上运行,如果你需要跟着MIT的课程完成xv6内核的实验,请从git://g.csail.mit.edu/xv6-labs-2021 这个链接克隆代码,这里介绍的是我们用到的仓库。在Gitee注册账户之后,在Ubuntu环境下使用下面的代码设置全局的用户名和邮箱:

git config --global user.email "you@example.com" # 替换为你Gitee账户的邮箱
git config --global user.name "Your Name"        # 替换为你Gitee账户的名字

  然后把实验用xv6内核的代码克隆下来

cd ~ # 进入用户目录
git clone https://gitee.com/greenhandzpx/xv6-oslab23-hitsz.git
# 如果你跟着MIT课程的实验,就把上面的链接换成git://g.csail.mit.edu/xv6-labs-2021

  然后进入文件夹,切换到util分支,然后用make构建内核,使用qemu启动:

cd xv6-oslab23-hitsz
git checkout util # 这一行用于切换分支
make qemu # 这一行使用Makefile文件的qemu标签构建内核

  上述操作全部完成之后,可以看到这样的结果:
在这里插入图片描述
  但是实际上,make qemu结束之后可能会出现这样的error(这是我截的别的机器上的图):
在这里插入图片描述

  它提示 ./user/sh.c这个文件当中的第57行有infinite recursion detected,也就是检测到了无线递归,所以这个地方我们要对这一行代码进行一些修改,我们输入

vim user/sh.c

  通过vim进入user目录下的sh.c这个文件,找到第57行的void runcmd(struct cmd *cmd) {,然后我们在void前按一下i,看到左下角变成INSERT,然后按回车,在这一行的上方插入这行代码(注意attribute的前后都有两个下划线):

__attribute__((noreturn))

在这里插入图片描述

  然后这个时候按一下Esc键,然后输入 :wq(还是记得要输入这个冒号!),这样就保存并退出了,这时候再输入make qemu,它就会继续完成项目的构建,然后通过qemu启动xv6内核,然后你就可以看到前面的运行成功的界面了

  此时输入ls可以查看所有已经内置于xv6内核中的程序,如cat等基本程序,此时可以用cat README查看xv6内核的README文档

7.GDB远程调试xv6(仅限WSL)

  WSL(Windows Subsytem for Linux)在远程连接方面具有得天独厚的优势,我们在命令行输入:

echo "set auto-load safe-path /" >>  ~/.gdbinit
expr $(id -u) % 5000 + 25000 # 这一步获取GDB端口号,要记住,一般是26000
cd xv6-oslab23-hitsz
code .

  这时候可以直接召唤出本机的VS Code,并且此时这个窗口中已经连接上了WSL的主机,此时我们需要下载Remote-SSH,C/C++,Chinese以及Native Debug等插件,结束后,在VS Code里召唤出终端(左上角点击终端→新建终端,在下面的终端中点击加号→WSL窗口),此时你应该确保当前路径在xv6-oslab23-hitsz当中

  然后此时点击VSCode左边的运行和调试,点击创建launch.json,把这个复制进去:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "gdb",
            "request": "attach",
            "name": "Attach to gdbserver",
            "executable": "${workspaceRoot}/kernel/kernel",
            "gdbpath": "gdb-multiarch",
            "remote": true,            
            "target": "127.0.0.1:此前你得到的GDB端口号",
            "cwd": "${workspaceRoot}",
            "setupCommands": {
                "text": "source ${workspaceFolder}/.gdbinit"
            }
        }
    ]
}

  然后在VSCode的kernel文件夹中找到main.c,在第11行加上断点,再打开xv6-oslab23-hitsz/.gdbinit文件,在target remote 127.0.0.1前面加上# 注释掉

  最后,按下F5/点击运行与调试的绿色三角,如果看到刚刚的断点已经成功命中,那么就成功了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Centos中用Docker部署oracle-12c

一、介绍 Oracle 12c是Oracle 11g的后续版本。12c代表云计算(Cloud Computing),这是Oracle在该版本中强调的一个关键概念。它具有多租户架构、数据库内存、安全增强、大数据管理和自动化管理等功能。它被广泛应用于企业级应用程序和大型数据…

加密与安全_深入了解Hmac算法(消息认证码)

文章目录 PreHMAC概述常见的Hmac算法Code随机的key的生成 KeyGeneratorHmacMD5用Hmac算法取代原有的自定义的加盐算法 HmacMD5 VS MD5HmacSHA256 Pre 加密与安全_深入了解哈希算法中我们提到, 存储用户的哈希口令时,要加盐存储,目的就在于抵…

Zabbix 系统告警“More than 75% used in the configuration cache”处理办法

Zabbix系统报错提示 Zabbix 系统告警“More than 75% used in the configuration cache”,看了一下意思是可用的配置缓存超过75%。 修改缓存大小 vim /etc/zabbix/zabbix_server.confesc : /CacheSize 找到配置 将64M改大一点,保存退出。 重启zabbix…

14.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据包分析工具界面与通信设计

内容参考于: 易道云信息技术研究院VIP课 上一个内容:13.如果没有工具就创造工具 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:fef5089bd11dfb86ae8b4e26f25cf59e85f896…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方,试一下一句话木马 txt 不让传txt 另存为tlyjpg,木马文件上传成功 给出了存放目录: Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

Qt应用软件【测试篇】vargrid内存检查工具

文章目录 vargrid介绍vargrid官网vargrid安装常用命令Valgrind的主要命令vargrid介绍 Valgrind是一个用于构建动态分析工具的框架,能自动检测许多内存管理和线程错误,并详细分析程序性能。Valgrind发行版包括七个成熟工具:内存错误检测器、两个线程错误检测器、缓存和分支预…

autoware.universe中跟踪模块详解,一看就懂!

目录 问题:阅读关键点:总结问题: 根据对预测模块代码的分析,发现预测框出现在点云前方的原因在于跟踪框出现在点云前方 对rviz上的目标进行观察后发现 车辆的检测框先出来一段时间后,跟踪框和预测框同步一块出来 跟踪框总是超出点云一部分 阅读关键点: 每个跟踪器最少要统计…

【JSON2WEB】07 Amis可视化设计器CRUD增删改查

总算到重点中的核心内容,CRUD也就是增删改查,一个设计科学合理的管理信息系统,95%的就是CRUD,达不到这个比例要重新考虑一下你的数据库设计了。 1 新增页面 Step 1 启动amis-editor Setp 2 新增页面 名称和路径随便命名&#xf…

网络安全、信息安全、计算机安全,有何区别?

这三个概念都存在,一般人可能会混为一谈。 究竟它们之间是什么关系?并列?交叉? 可能从广义上来说它们都可以用来表示安全security这样一个笼统的概念。 但如果从狭义上理解,它们应该是有区别的,区别在哪呢&…

08、关于语法:resp?.data?.data 的含义与实际操作中可能遇到的问题

1、数据情况: 其一、从后端拿到的数据为: let resp.data {"data": [],"lag_mode": 3,"totol": 0 }或: let resp.data {"data": [],"totol": 0 }其二、目标数据为: // 想要…

git拉取代码提示403

错误提示信息 remote: Access denied 拒绝访问 fatal: unable to access ‘ https:/ /gitee. cohe requested URL 403解决 找到凭据管理器 找到git的信息,删掉,重新拉取代码,就会提示输入用户名密码

CentOS的yum报错except OSError, e:

报错信息 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile base: mirrors.cloud.aliyuncs.comextras: mirrors.cloud.aliyuncs.comupdates: mirrors.cloud.aliyuncs.com File “/usr/libexec/urlgrabber-ext-down”, line 28 except OSError, e: ^…

Git源码管理

参考视频:16-git的日志以及版本管理_哔哩哔哩_bilibili 参考博客:Git && Docker 学习笔记-CSDN博客 目录 简介 个人操作初始化 初始化git目录 查看生成的git目录文件 配置git工作目录的用户信息 查看工作区的状态,生成文件的…

Nacos环境搭建 -- 服务注册与发现

为什么需要服务治理 在未引入服务治理模块之前,服务之间的通信是服务间直接发起并调用来实现的。只要知道了对应服务的服务名称、IP地址、端口号,就能够发起服务通信。比如A服务的IP地址为192.168.1.100:9000,B服务直接向该IP地址发起请求就…

Linux网络编程——网络基础

Linux网络编程——网络基础 1. 网络结构模式1.1 C/S 结构1.2 B/S 结构 2. MAC 地址3. IP地址3.1 简介3.2 IP 地址编址方式 4. 端口4.1 简介4.2 端口类型 5. 网络模型5.1 OSI 七层参考模型5.2 TCP/IP 四层模型 6. 协议6.1 简介6.2 常见协议6.3 UDP 协议6.4 TCP 协议6.5 IP 协议6…

05 OpenCV图像混合技术

文章目录 理论算子示例 理论 其中 的取值范围为0~1之间 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 参数1:输入图像Mat …

进程操作(Win32, C++)

CProcessUtils.h #pragma once#include <wtypesbase.h> #include <tchar.h> #include <vector> #include <map> #include <string>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 进程信息 typed…

element-plus表格合并

要实现这样的表格&#xff0c; 怎么做呢&#xff1f; 甚至是这种三级的呢&#xff1f; 官网的案例也是通过这个方法进行配置的&#xff0c;也就是说表格长什么样&#xff0c;关键在怎么处理的方法上。 这是官网的方法&#xff0c;可参考拓展&#xff1a; const arraySpanMeth…

SLAM ORB-SLAM2(21)基础矩阵的计算和评分

SLAM ORB-SLAM2&#xff08;21&#xff09;基础矩阵的计算和评分 1. 前言2. 基础矩阵2.1. 对级约束2.2. 推导2.3. 计算原理 3. ComputeF214. CheckFundamental 1. 前言 在 《SLAM ORB-SLAM2&#xff08;20&#xff09;查找基础矩阵》 中了解到 查找基础矩阵主要过程&#xff1…

nginx 配置浏览器不缓存文件 每次都会从服务器 请求新的文件

目录 解决问题方法说明 测试html环境js环境第一步然后修改内容 打开带有js缓存的页面强制刷新 配置nginx 每次打开页面都会重新请求index.js 文件重启nginx再次修改index.js 总结设置为全局 解决问题 适用于实时更新数据的&#xff0c;网页 可以让用户每次都是重新请求&#x…