Xv6驱动(一):PLIC

news2024/9/24 19:15:15

PLIC内存布局

#define PLIC 0x0c000000L
#define PLIC_PRIORITY (PLIC + 0x0)
#define PLIC_PENDING (PLIC + 0x1000)
#define PLIC_SENABLE(hart) (PLIC + 0x2080 + (hart) * 0x100)
#define PLIC_SPRIORITY(hart) (PLIC + 0x201000 + (hart) * 0x2000)
#define PLIC_SCLAIM(hart) (PLIC + 0x201004 + (hart) * 0x2000)

Xv6外部中断

外部中断通常是指来自处理器外部设备的中断。

Xv6只支持两个外设:

  • uart0:中断号为10,映射到物理内存0x10000000
  • virtio disk:中断号为1,映射到物理内存0x10001000
// qemu puts UART registers here in physical memory.
#define UART0 0x10000000L
#define UART0_IRQ 10

// virtio mmio interface
#define VIRTIO0 0x10001000
#define VIRTIO0_IRQ 1

 PLIC驱动

plicinit函数

同虚拟内存初始化,PLIC的初始化也是两阶段初始化。第一阶段的初始化由cpu0执行,也就是说该函数只执行一次。

该函数的任务是设置中断优先级。Xv6只支持两个外设:UARTvirtio mmio disk,该函数把这两个外设的中断优先级都设置为1。此外,RISC-V规定:如果两个相同优先级的中断同时触发,那么编号小的中断具有较高的优先级。

void plicinit(void)
{
	// set desired IRQ priorities non-zero (otherwise disabled).
	*(uint32 *)(PLIC + UART0_IRQ * 4) = 1;
	*(uint32 *)(PLIC + VIRTIO0_IRQ * 4) = 1;
}

plicinithart函数

该函数是PLIC的第二阶段初始化,每个核心初始化时都要执行这个函数。

该函数会使能S模式下的uart中断和virtio disk中断,并且设置S模式下中断阈值为0

这就说明了:

  1. 如果发生外部中断,那么每个核心都会收到外部中断的信号
  2. 只有一个核心会处理这次外部中断
void plicinithart(void)
{
	int hart = cpuid();

	// set enable bits for this hart's S-mode
	// for the uart and virtio disk.
	*(uint32 *)PLIC_SENABLE(hart) = (1 << UART0_IRQ) | (1 << VIRTIO0_IRQ);

	// set this hart's S-mode priority threshold to 0.
	*(uint32 *)PLIC_SPRIORITY(hart) = 0;
}

plic_claim函数

该函数由异常处理程序调用,用来返回异常号。如果同时有多个中断发生,PLIC硬件会根据之前的配置返回当前待定中断源中优先级最高的那个。其中只有一个核心会得到异常号,其他的核心的返回值是0

int plic_claim(void)
{
	int hart = cpuid();
	int irq = *(uint32 *)PLIC_SCLAIM(hart);
	return irq;
}

plic_complete函数 

中断请求寄存器和中断完成寄存器是同一个寄存器。中断处理程序处理完中断后,会调用该函数,同时将中断号写入该寄存器中

void plic_complete(int irq)
{
	int hart = cpuid();
	*(uint32 *)PLIC_SCLAIM(hart) = irq;
}

 参考资料

The xv6 Kernel-27 PLIC_Platform Level Interrupt Controller_哔哩哔哩_bilibili

Lecture 9 - Interrupts 中文版_哔哩哔哩_bilibili

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

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

相关文章

前端算法 ==== 栈的好戏还要继续!| 1047. 删除字符串中的所有相邻重复项

目录 解题 思路 题外话 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 输入&a…

E-Prime2中同时识别大小写字母与中文支持设置

识别大小写 起因是在学习Eprime过程中发现&#xff0c;一开始只设置了键盘反应为q&#xff0c;然后当键盘为大写状态时&#xff0c;按Q不会响应&#xff0c;后来看到可以同时设置Qq&#xff0c;并且也能读取&#xff0c;简单试了一下&#xff0c;发现有必要在其他地方也这么设…

Multi-class Token Transformer for Weakly Supervised Semantic Segmentation

code&#xff1a;https://github.com/xulianuwa/MCTformer 摘要 本文提出了一种基于Transformer的新框架&#xff0c;用于学习类别特定的对象定位图&#xff0c;并将其作为弱监督语义分割&#xff08;WSSS&#xff09;的伪标签。受到标准视觉Transformer中单类别token的关注区…

SpringBoot天猫商城基于前后端分离+SpringBoot+BootStrap、Vue.js、JQuery+JPA+Redis

SpringBoot天猫商城整站 一、项目介绍和演示 SPRINGBOOT天猫整站&#xff0c;基于 前后端分离思想&#xff0c; 由于该商城高并发的特点&#xff0c;后端框架便使用了方便维护的 SpringM VC、SpringBoot框架&#xff0c;而前端框架则选择了主流的BootStrap、Vue.js&#xff0c;…

虚拟机扩展分区

1、删除快照后 先扩展 虚拟机空间 2、 创建分区 rootlocalhost /]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 99.5G 0 part ├─VolGroup-lv_root (dm-0) 249:0 0 50G 0 lvm / ├─VolGroup-lv…

网络防火墙的主要功能及其弊端

防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;是由Check Point 创立者Gil Shwed于1993 年发明并引入国际互联网。 它是一种位于内部网络与外部网络之间的网络安全系统。是一项信息安全的防护系统&#xff0c;依照特定的规则&#xff0c;允许或是限…

【python】时间序列模型(ARIMA)

文章目录 前言一、示例二、代码实现----python全部数据的平稳性检验划分训练集平稳性检验确定 p&#xff0c;q结果分析和模型检验模型预测 前言 接上一篇博客&#xff0c;用python完成代码编写。 【学习笔记】时间序列模型(ARIMA) 一、示例 已知一个上市公司一段时期的开盘价…

leetcode 数组+哈希+双指针+子串+滑动窗口

——————双指针 283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …

AI大模型日报#0820:DeepMind创始人访谈、阿里多模态mPLUG-Owl3、抱抱脸SOTA小模型

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

linux文件——文件系统——学习硬件:磁盘

前言&#xff1a;本节将带领友友们认识计算机外设中的——磁盘。 目的是为后面学习文件系统打好基础。认识磁盘我们将从——磁盘的组成、磁盘的逻辑结构两个方面进行讲解。 下面开始我们的学习吧。 ps&#xff1a;本节适合所有阶段的友友们学习哦&#xff0c; 友友们可以在本篇…

推荐几款论文初稿ai工具,一键生成!

开题报告-科研加速秘籍&#xff1a;AI论文写作工具推荐&#xff01; 在科研的世界里&#xff0c;论文写作是不可或缺的一部分。 然而&#xff0c;很多时候我们在开题报告的编写上就遇到了巨大的挑战。 别担心&#xff0c;今天我要分享这个工具来帮助你轻松应对这个问题。 通过…

(java)动态代理

1.思想分析 不能修改原有的代码&#xff1a; 代理&#xff1a;相当于中介公司 代理&#xff1a;转移职责 代理&#xff1a;做准备工作 调用对象中的方法 代理&#xff1a;通过接口--接口中的方法就是要代理的方法

JVM类加载机制—类加载器和双亲委派机制详解

一、概述 上篇我们介绍了JVM类加载机制—JVM类加载过程&#xff0c;类加载过程是类加载机制第一阶段&#xff0c;这一阶段主要做将类的字节码&#xff08;class文件&#xff09;加载JVM内存模型中&#xff0c;并转换为JVM内部的数据结构&#xff08;如java.lang.Class实例&…

Java常用工具类之Date类和Calender类

1、 Date类中常用方法 1. Date类的常用方法 Date类的常用方法 方法 含义 new Date&#xff08;&#xff09; 实例化Date对象&#xff0c;常见于获得系统当前时间 new Date&#xff08;long time&#xff09; 实例化Date对象&#xff0c;并根据具体的时间偏移量time设置时…

C语言 | Leetcode C语言题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; int getSum(int a, int b){ int c; while(b) {c(unsigned int)(a&b)<<1;a^b;bc; }return a; }

静态网页的制作步骤

静态网页是由HTML、CSS和JavaScript等前端技术构建而成的&#xff0c;它们通常用于展示静态内容&#xff0c;不涉及动态数据的处理。制作静态网页的过程涉及多个步骤&#xff0c;包括规划、设计、编码和测试等。下面是一个详细的制作静态网页的步骤&#xff0c;希望对你有帮助。…

Apache Flink内存模型

Flink 内存模型 大数据中所有开源的框架都会使用到JVM&#xff0c;不如&#xff0c;MapReduce&#xff0c;Storm&#xff0c;Spark等&#xff0c;这些计算框架处理数据过程中涉及到将大量数据存储到内存中&#xff0c;此时如果内存管理过渡依赖JVM&#xff0c;会出现java对象存…

国产GD32单片机开发入门(二)GD32单片机详解

文章目录 一.概要二.单片机型号命名规则三.GD32F103系统架构四.GD32F103C8T6单片机启动流程五.GD32F103C8T6单片机主要外设资源六.单片机开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.GD32单片机内部框图3.GD32单片机管脚图4.GD32单片机每个管脚功能5.单片机功耗数…

Mybatis--其他查询操作和数据库连接池(下下)

序 准备工作&#xff1a; mysql数据库和表的信息更新&#xff1a; DROP TABLE IF EXISTS articleinfo;CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEF…

24 messagebox 组件

messagebox 组件使用指南 Tkinter messagebox 组件用于创建弹出式消息框&#xff0c;以显示信息、警告、错误或询问用户问题。它提供了一种简单的方法来向用户展示消息&#xff0c;并等待用户响应。以下是对 messagebox 组件的详细说明和一个使用案例。 messagebox 组件方法 …