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实际上创建了一个虚拟地址和物理地址之间的映射关系,并通过操作系统内核为此建立了相应的页表。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之JDBC入门详解

01-JDBC入门 一、JDBC概念 jdbc : java database connection , java数据库连接 jdbc是sun公司定义的java程序访问数据库的规范。 二、JDBC操作需要6步 三、入门程序 1、使用eclipse打开一个新的工作空间 2、切换到java视图界面 3、创建java工程:01-jdbc-helloworl…

Vue3版本的uniapp项目运行至鸿蒙系统

新建Vue3版本的uniapp项目 注意,先将HbuilderX升级至最新版本,这样才支持鸿蒙系统的调试与运行; 按照如下图片点击,快速升级皆可。 通过HbuilderX创建 官方文档指导链接 点击HbuilderX中左上角文件->新建->项目 创建vue3…

html简易流程图

效果图 使用htmlcssjs&#xff0c;无图片&#xff0c;没用Canvas demo: <!DOCTYPE html> <html> <head><link href"draw.css" rel"stylesheet" /><script src"draw.js" type"text/javascript"></…

人工智能原理实验一:知识的表示与推理实验

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等有…

针对解决前后端BUG的个人笔记

1-IDEA Q&#xff1a;Required Java version 17 is not supported by SDK 1.8. The maximum supported Java version is 8. A: 我们只知道IDEA页面创建Spring项目&#xff0c;其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将https…

Linux操作系统 ------(3.文本编译器Vim)

目录 1.前言 2.本章学习目标 3.vim的三种工作模式 3.1一般模式‌ 3.2编辑模式‌ 3.3命令行模式‌ 4.运行vim 5.vim 不同工作模式下的常见命令 6.一般模式下的功能键 6.1移动光标类 6.2删除、复制和粘贴类 6.3查找替换类 7.从一般模式进入编辑模式 8.命令行模式下的…

4种鼓励创业创新的方法

随着市场趋于饱和&#xff0c;许多企业&#xff0c;尤其是初创企业&#xff0c;很难在竞争中保持领先地位。技术为企业彻底改变其营销和管理策略铺平了道路。另一个经过实践检验的成功渗透特定市场的方法是在办公室内部激发创新&#xff0c;从员工到品牌皆如此。 那么究竟如何…

【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师

一、IS-IS的汇总 1、可以有效减少在LSP中发布的路由条目,减小对系统资源的占用。 2、会减少LSP报文的扩散,接收到该LSP报文的其他设备路由表中只会出现一条聚合路由。 3、可以避免网络中的路由震荡,提高了网络的稳定性。 4、被聚合的路由可以是IS-IS路由,也可以是被引入…

后端java——如何为你的网页设置一个验证码

目录 1、工具的准备 2.基本方法 3.实现类 4.实践 HTML文件&#xff1a; Java文件1:创建验证码 Java文件2:验证验证码 本文通过HUTOOL实现&#xff1a;Hutool参考文档Hutool&#xff0c;Java工具集https://hutool.cn/docs/#/ 1、工具的准备 如果我们通过hutool来实现这个…

1、Qt6 Quick 简介

一、Qt6 Quick 简介 1、Qt Quick简介 Qt Quick 是 Qt 6 中使用的用户界面技术的总称。它是在 Qt 4 中引入的&#xff0c;现在在 Qt 6 中进行了扩展。Qt Quick 本身是几种技术的集合&#xff1a; QML——用户界面标记语言JavaScript - 动态脚本语言Qt C - 高度可移植的增强型…

微服务系列二:跨微服务请求优化,注册中心+OpenFeign

目录 前言 一、纯 RestTemplate 方案存在的缺陷 二、注册中心模式介绍 三、注册中心技术&#xff1a;Nacos 3.1 Docker部署Nacos 3.2 服务注册 3.3 服务发现 四、代码优化&#xff1a;OpenFeign工具 4.1 OpenFeign快速入门 4.2 连接池的必要性 4.3 抽取服务、最佳实…

andrular输入框input监听值传递

效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.html <button mat-button (click)“openDialog()”>Open dialog step2: E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.ts import {Component, inject}…

像`npm i`作为`npm install`的简写一样,使用`pdm i`作为`pdm install`的简写

只需安装插件pdm-plugin-i即可&#xff1a; pdm plugin add pdm-plugin-i 然后就可以愉快地pdm i了&#xff0c;例如&#xff1a; git clone https://github.com/waketzheng/fast-dev-cli cd fast-dev-cli python -m pip install --user pipx pipx install pdm pdm plugin a…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)

插件地址&#xff1a; Smash Balloon Social Photo Feed – Easy Social Feeds Plugin – WordPress 插件 | WordPress.org China 简体中文 安装后&#xff0c;配置教程&#xff1a; Setting up the Instagram Feed Pro WordPress Plugin - Smash Balloon 从这里面开始看就…

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

如何修改网络ip地址:一步步指南‌

在当今这个数字化时代&#xff0c;网络已成为我们日常生活与工作中不可或缺的一部分。无论是浏览网页、在线办公还是享受流媒体服务&#xff0c;稳定的网络连接和适当的IP地址管理都是确保良好体验的关键。然而&#xff0c;出于隐私保护、绕过地理限制或测试网络环境等需要&…

ENSP (虚拟路由冗余协议)VRRP配置

VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;是一种用于提高网络可用性和可靠性的协议。它通过在多个路由器之间共享一个虚拟IP地址&#xff0c;确保即使一台路由器发生故障&#xff0c;网络依然能够正常运行&#xff0c;防止…

SpringCloud Alibaba-05 Seata分布式事务处理

一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用&#xff0c;就会产生分布式事务问题。但是关系型数据库提供的能力是基于单机事务的&#xff0c;一旦遇到分布式事务场景&#xff0c;就需要通过更多其他技术手段来解决问题。 1.四大模式&#xff1a; Seata AT模式(主…