Linux中断、软中断、MMU内存映射-深入理解

中断:

Linux中,中断上半部不能嵌套,如果一直保存上下文,栈可能会溢出。中断上半部处理紧急事情,下半部处理非紧急事情。下半部通常通过软中断来实现。在上半部执行完后会执行下半部的软中断,如果囤积了A和B的下半部软中断,此时会把两个软中断都一起执行,即处理所有的软中断。因为系统心跳,滴答定时器中断的存在,每过10ms会触发一次硬件中断,即中断上半部,所以软中断一般都能得到及时的执行。内核中用tasklet软中断来处理中断下半部。但下半部若是执行时间过长也不太好,会阻碍系统程序运行,这时候可以把下半部用线程的方式处理,即可worker内核线程。可以再内核中创建一个work线程让他和其他任务一起调度,内部有一个work queue队列,中断上半部把要处理的work即执行函数.fun放入队列中,当worker获取cpu执行权限的时候,就会去执行中断下半部。但这样子只能在单个核上运行,并且前一个work没处理完后影响后一个work,可以通过threaded irq给每个中断的下半部函数创建一个内核线程,发生中断时,内核线程就会执行这个函数。(给每一个中断都创建一个内核线程,给中断irq注册中断服务的request_irq更改为用request_threaded_irq来注册中断的函数,上半部handler完成后,会唤醒内核线程,会去执行线程里运行的下半部函数thread_fn)

通过软件给某一个软件中断的flag=1了,表示这个软件中断产生了,那么这个软件中断的处理就是在处理完硬件中断(上半部)之后,顺便来处理。主要通过检查软件中断数组softirq_veq中有没有某一项的标志位为1,再来执行里面的函数。

工作队列是线程化的处理,而threaded irq是线程化的中断,就更进一步了

内核定时器(软件定时器)

源码位置include\linux\timer.h

定时器属于软件中断,通过定时器结构体timer_list存储定时器的相关信息和状态,初始化一个timer的时候要指定函数和data,在内核中用链表来管理多个定时器。 定时器的创建步骤:先设置一个定时器timer_setup,修改它的超时时间expires,add_timer把该定时器添加进内核里面,修改定时器超时时间可以用mod_timer。内核定时器的时间设置依托于系统滴答(tick)定时器,滴答定时器每隔10ms发生一次,全局变量jiffies就会累加1。内核定时器的值就是依托jiffies变量设定的。比如设置预期时间为jiffies+2,到时间后,内核就会去调用这个timer里面的函数。因为有多个按键,所以每个按键里面都应该有个timer_list结构体,即都有一个timer。对软件中断(软件定时器的使用示例)用于按键消抖,每次按键中断发生时都会刷新定时器的到达时间,只有定时时间到后,即软中断触发后,内核会去调用回调函数读取按键值。定时器使用完成后可用del_timer删除。在硬件中断发生后,系统会去检查软件中断,若有软件中断发生,则会去执行对应的函数。定时器(中断服务函数)也是在中断上下文中执行(中断的下半部),不能休眠,也要尽快返回。软中断不在进程上下文中,即没有进程上下文,无法进行调度操作,也就无法睡眠。

通过定时器timer_list结构体来管理,内部包含设置超时时间expires,回调函数function,传入回调函数的数据data等

按键中断中修改定时器时间

中断下半部:三种方式

硬件中断处理完成后,在返回被中断的程序之间,又会去处理软件中断。(硬件中断和软件中断是多对一的关系)软件中断通常有timer、tasklet等,会有一个softirq[]数组,其中某一个成员是tasklet,会从数组内取出action函数执行,软件中断tasklet对应的函数是tasklet_action,该函数会从某一个队列里取出里面的每一个tasklet结构体执行里面的函数func。 在中断上半部使用tasklet的时候,就是把一个预先设置好的tasklet结构体放入对应的队列(链表)中,处理软件中断时就会从这个链表里把你之前放进来的tasklet取出来,执行里面的函数。使用tasklet_schedule调度tasklet,将其放入链表(也只能执行一次,若要再次执行,则需要再次调度)。

tasklet_action从链表中取出每一项,判断下状态位,执行里面的函数。执行完后,会从链表里把它释放掉。

工作队列的内核线程,会去查看队列(链表)中有无work,有的话则把work一个个取出来执行。实际使用时,(1)需要构建一个work,初始化.func,(2)将work放入队列,并将内核线程唤醒(由schedule_work函数实现)。在2.0的内核中创建workqueue的同时会去每个cpu上创建一个内核线程,但是在哪个cpu上schedule_work会优先使用那个cpu的线程来处理那个work。在4.0的内核中,内核线程和工作队列时分开创建的,每个cpu下会先创建两个work_pool结构体用于管理内核线程,一个对应普通优先级的work,一个对应高优先级的work,之后对每个work_pool创建一个worker,每个worker对应一个内核线程。内核线程创建完成后开始创建工作队列work_queue,会与普通优先级的work_pool建立联系,在给work_queue添加工作的时候,会放入work_pool,放入对应的链表里,唤醒里面的某一个work线程。只有一个worker线程来处理这个work,优先会使用同一个cpu上的worker线程。

工作队列有个缺陷,就是当工作队列中有多个work时,前一个work没处理完会影响后面的work,要等待前一个工作work的完成。此时可以使用中断的线程化处理,下半部用一个内核线程处理,该内核线程专用于这个中断。一方面在多核cpu上时,可以同时运行多个内核线程在不同cpu核上。

MMU内存映射

应用程序不能直接读写驱动程序中的buffer,要在用户态buffer和内核态buffer间进行一次数据拷贝,但大数据传输时效率太低,可以通过mmap(memory map),把内核的buffer映射到用户态,让APP在用户态直接读写。

对于虚拟地址的概念:CPU发出的地址是虚拟地址,经过MMU(Memory Manage Unit)内存管理单元映射到物理地址上,对于不同进程的同一个虚拟地址,MMU会将它们映射到不同的物理地址上。

对于虚拟地址的映射过程:由CPU发出虚拟地址vaddr,MMU根据vaddr[31:20]高位找到一级页表项,段内偏移为[20:0]低位。即可从该表项中取出物理基地址加上偏移量,得到实际访问的物理地址。

由此可知道,我们若是想要给APP新建一块内存映射,给它开辟一块虚拟内存,让它指向某块内核buffer,需要完成以下步骤:(1)得到一块虚拟内存空间(虚拟地址):APP调用mmap时,内核就帮我们完成了(2)确定物理地址:需要由我们来提供(3)确定属性:是否使用cache、buffer(4)给虚拟地址和物理地址建立映射关系:内核中提供函数完成。所以其实mmap就是类似给MMU提供一个虚拟地址和物理地址的页表间的映射关系,下次访问时,由cpu提供虚拟地址,MMU就会通过页表将虚拟地址转换为对应的物理地址,从而实现对物理地址的访问。mmap实际上创建了一个虚拟地址和物理地址之间的映射关系,并通过操作系统内核为此建立了相应的页表。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

讲讲 kafka 维护消费状态跟踪的方法?

大家好,我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法?】面试题?希望对大家有帮助; 讲讲 kafka 维护消费状态跟踪的方法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…

CodeS:构建用于文本到 SQL 的开源语言模型

发布于:2024 年 10 月 29 日 #RAG #Text2 SQL #NL2 SQL 语言模型在将自然语言问题转换为 SQL 查询(文本到 SQL )的任务中显示出良好的性能。然而,大多数最先进的 (SOTA) 方法都依赖于强大但闭源的大型语言…

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 (一)Shiro框架概念 1.概念: Shiro是apache旗下一个开源安全框架,它对软件系统中的安全认证相关功能进行了封装,实现了用户身份认证,权限授权、加密、会话管理等功能,组成一…

「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础

在应用开发中,动画效果可以增强用户体验。鸿蒙框架提供了 translate、scale 和 rotate 等动画功能,允许对组件进行平移、缩放和旋转等操作。本篇将介绍 Animation 组件的基础知识和示例代码。 关键词 Animation 组件动画效果位置动画自动动画缩放动画 一…

详解:模板设计模式

模板设计模式(Template Pattern)是一种行为设计模式,在软件设计中有着广泛的应用,旨在提高代码的可维护性和可复用性。 一、定义与特点 定义: 模板设计模式定义了一个算法的骨架,将某些步骤推迟到子类中实…

Java中的时区和带时区的时间对象:ZoneId类、ZonedDateTime类

在 Java 中,ZoneId 和 ZonedDateTime 是处理时区和带时区日期时间的重要类,它们属于 java.time 包,这个包是在 Java 8 中引入的,用于替代旧的日期和时间 API(java.util.Date、java.util.Calendar 等)。 1、…

微积分复习笔记 Calculus Volume 1 - 4.5 Derivatives and the Shape of a Graph

4.5 Derivatives and the Shape of a Graph - Calculus Volume 1 | OpenStax

Windows配置Nodejs及nmp简明教程(2024可用)

一、下载及安装Nodejs 下载 Node.js 中文网 (nodejs.com.cn)在此下载windows长期维护版本的.msi安装包,64位 安装: 双节安装包一直点击Next下一步,注意安装路径选择C盘默认路径(C:\Program Files\nodejs\)即可&#x…

MATLAB实现蝙蝠算法(BA)

MATLAB实现蝙蝠算法(BA) 1.算法介绍 蝙蝠算法(简称BA)是一种受微型蝙蝠回声定位机制启发的群体智能算法,由Xin-She Yang于2010年提出。这种算法模拟了微型蝙蝠通过向周围环境发出声音并监听回声来识别猎物、避开障碍物以及追踪巢穴的行为。…

JavaStream流

认识 在java.util.stream util包下的新增API,可以用于操作集合或者数组的数据。 功能强大(提供了很多结合Lambda的API),性能高效(有很多优化),代码简洁(Lambda),可读性好…

【LwIP源码学习4】主线程tcpip_thread

前言 本文对lwip的主要线程tcpip_thread进行分析。 正文 tcpip_thread是lwip最主要的线程,其创建在tcpip_init函数中 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);tcpip_init函数被TCPIP_Init函数调用。…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(二)

书接上回,让我们继续来学习ArkUI的其他组件 目录,可以点击跳转到想要了解的组件详细内容 组件四:Button组件五:Slider组件六: Column & Row组件七:循环控制组件八: List 组件四:…

四、k8s快速入门之Kubernetes资源清单

kubernetes中的资源 ⭐️ k8s中所有的内容都抽象为资源,资源实列化之后,叫做对象 1️⃣名称空间级别 ⭐️ kubeadm在执行k8s的pod的时候会在kube-system这个名称空间下执行,所以说当你kubectl get pod 的时候是查看不到的查看的是默认的po…

【收藏版】产品经理工作全流程拆解:每一步都是成功的基石

在信息爆炸的今天,产品经理的角色愈加重要。市场分析、用户需求调研、竞品分析、市场定位、产品设计、开发测试……每一个环节都可能决定产品的成败。这篇文章将带你逐步解读从产品立项到上线运营的全流程,为你揭开产品经理的核心工作要点。无论你是新手…

11.1组会汇报-基于区块链的安全多方计算研究现状与展望

基础知识 *1.背书,这个词源来自银行票据业务,是指票据转让时,原持有人在票据背面加盖自己的印鉴,证明该票据真实有效、如果有问题就可以找原持有人。 区块链中的背书就好理解了。可以简单的理解为验证交易并声明此交易合法&…

客如云:大型业务报表的分区化改造提升性能|OceanBase 应用实践

一 概述 1 背景 在过去两到三年的时间里,客如云的KPOS产品在商户数量和订单量均实现了数倍的增长,充分展示了产品的市场吸引力和业务模式的成功。然而,随着更多的大型连锁商户的加入,客如云商家平台迎来了前所未有的挑战。特别是…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划: 资源准备 虚拟机软件:就别自己找了 现在换网站了 下载比较费劲 Centos8: 阿里云镜像地址下载(下载比较版 但是有不同版本):centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

git 删除远程不存在本地命令却能看到的分支

要删除远程不存在但本地却能看到的分支&#xff0c;你可以按照以下步骤操作&#xff1a; 删除本地分支&#xff1a; 如果你确定要删除的分支已经没有用处&#xff0c;可以使用以下命令来删除本地分支&#xff1a; git branch -d <branch-name>这里的 <branch-name>…

为数据集而生的 SQL 控制台

随着数据集的使用量急剧增加&#xff0c;Hugging Face 社区已经变成了众多数据集默认存放的仓库。每月&#xff0c;海量数据集被上传到社区&#xff0c;这些数据集亟需有效的查询、过滤和发现。 Dataset Monthly Creations 每个月在 Hugging Face Hub 创建的数据集 我们现在非常…

城市道路智慧照明服务认证介绍

城市道路智慧照明服务认证介绍 一 认证依据标准 城市道路智慧照明服务认证主要依据《城市道路智慧照明服务评价技术规范》标准&#xff0c;对城市道路照明服务提供商在智慧照明领域的服务质量、技术能力、管理水平等方面&#xff0c;进行综合评估和认证。 二 认证范围 城市道路…