设备驱动与文件系统:01 I/O与显示器

news2025/6/4 7:31:48

操作系统设备驱动学习之旅——以显示器驱动为例

从这一节开始,我要学习操作系统的第四个部分,就是i o设备的驱动。今天要讲的是第26讲,内容围绕i o设备中的显示器展开,探究显示器是如何被驱动的,也就是操作系统怎样让用户使用显示器,最终会落脚到print f这个函数是如何将内容显示在屏幕上的。

设备驱动基础原理

操作系统是管理计算机硬件的一层软件。在这里插入图片描述
之前,我已经学习了操作系统如何管理cpu,弄清楚了fork以及进程管理的含义,明白了cpu是如何被抽象为进程的;也学习了内存管理相关知识,了解了内存如何分段、分页,以及虚拟内存的引出,直到数据最终写入物理内存。现在,我要开始学习计算机硬件中的另一重要部分——i o设备,这一讲和下一讲主要聚焦键盘和显示器,之后还会涉及磁盘及基于磁盘抽象出的文件系统,但本质上都是i o设备的驱动。
在这里插入图片描述

在学习具体设备驱动前,得先明确计算机让外设工作的原理。这是计算机的基本常识,使用外设时,每个外设都有对应的控制器,比如显示器的显卡。cpu只需向外设控制器中的寄存器或存储区域发送一条指令,控制器就会依据指令内容操控硬件。以显示器为例,cpu给显卡寄存器发指令,显卡就能让显示器显示内容。通常,cpu发出指令后会去执行别的进程,等外设完成任务,会向cpu发送中断信号,cpu再处理中断,可能涉及数据传输等操作。
在这里插入图片描述

总结起来,操作系统让外设工作的核心就两点:一是向控制器发指令,最终表现为类似out的指令;二是处理外设工作完成后的中断。虽然实际操作外设的代码很多,但核心指令就那么几条。之所以有大量代码,是为了让外设使用更简单,这就需要提供统一的视图。因为不同设备的控制器不同,直接操作寄存器很麻烦,不同公司硬件设计也有差异,所以操作系统要形成统一接口,也就是文件视图,这样既能隐藏细节方便用户,内部还能进行高效处理。

简而言之,外设驱动主要做三件事:

  1. 发出out指令,操控设备控制器寄存器;
  2. 进行设备中断处理;
  3. 提供统一文件视图,方便用户使用。

print f显示原理探究在这里插入图片描述

在这里插入图片描述

接下来,我通过print f这个实际例子来深入理解设备驱动。print f本质上是一段操作外设的程序,和其他设备操作一样,遵循统一规则。在linux系统中,操作设备通常表现为openreadwriteprint f也不例外,它打开的是显示器对应的文件,然后进行写入操作。操作系统为用户提供统一的文件接口,通过不同的设备文件名区分操作的设备,print f对应的设备文件名决定了它操作的是显示器。
在这里插入图片描述

具体来看,print f最终会变成系统调用write,写成write(1,buffer,...),这里的1决定了数据输出到显示器,buffer是格式化后的字符串缓冲区。系统调用通过int 0x80进入内核,执行sys_write。这里关键的1是文件描述符,它来自当前进程pcb数组的第一项,这个文件描述符对应一个文件,文件的inode中存放着设备相关信息。
在这里插入图片描述
在这里插入图片描述

那么1对应的文件是怎么来的呢?进程的pcbfork创建时拷贝父进程的,所有进程打开文件的指针都源于父进程。系统初始化时,0号进程创建相关进程,打开了一个文件并拷贝两份,1对应的文件就是dev/tty0tty代表终端设备。open系统调用会根据文件名读入文件的inode信息,操作系统依据这些信息决定后续操作路径。
在这里插入图片描述
在这里插入图片描述

根据inode信息判断设备类型,如果是字符设备,就执行rw_char,并根据设备号继续分支。dev/tty0是字符设备,设备号为4,通过设备号在函数指针数组中找到对应的处理函数rw_ttyx。因为是write操作,所以会调用tty_write函数,这个函数会将数据先写入缓冲区right_q。这涉及到缓冲技术,由于cpu和内存操作速度快,显示器显示速度慢,通过缓冲区可以平衡速度差异,缓冲区就像生产者 - 消费者模型中的共享缓冲区,写满时生产者(数据写入操作)会睡眠等待,不满时则写入数据。
在这里插入图片描述

数据写入缓冲区后,会调用函数从缓冲区取出数据输出到显示器。tty_write函数会继续调用console_writeconsole就是终端设备,即显示器。console_write函数会从缓冲区取出字符c,通过out指令将字符输出到显示器。具体的汇编指令会将字符属性赋给ah,字符赋给alaxahal组成),然后将ax写入显存地址pose。这里涉及内存和i o设备的编址方式,如果是统一编址用mov指令,如果是独立编址用out指令,通常显存较大,采用独立编址,但本质上movout都是对i o设备控制器中的存储区域进行写操作。

总结与实验展望

至此,我梳理清楚了print f的整个过程。从系统调用write开始,通过统一文件接口,依据设备信息逐步找到驱动显示器的函数,利用缓冲技术和相关指令,最终将数据输出到显存显示在屏幕上。设备驱动的核心就是cpu向外设控制寄存器发指令进行读写,并形成统一文件视图方便使用,同时处理中断。相比cpu和内存管理,设备驱动相对简单。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关于mov ax,pose中的pose,它每次写完会加2,因为显存存储字符和属性各占一个字节。初始的pose值在系统启动时,通过setup程序根据bios中断取出硬件参数(包括光标位置),将光标所在显存位置存入90000处,初始化时再将其赋值给pose

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

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

相关文章

智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?

随着新能源汽车的普及,智慧充电桩作为基础设施的重要组成部分,正逐步向数字化、智能化方向发展。环境监测与动态数据可视化技术的应用,为充电桩的高效管理和运维提供了全新解决方案。通过实时采集环境参数与运行数据,并结合可视化…

家政小程序开发,开启便捷生活新篇章

在快节奏的现代生活中,家务琐事常常让人分身乏术,如何高效解决家政服务需求成了众多家庭的难题。家政小程序开发,正是为解决这一痛点而生,它将为您带来前所未有的便捷生活体验。 想象一下,您只需打开手机上的家政小程…

李臻20242817_安全文件传输系统项目报告_第14周

安全文件传输系统项目报告(第 14 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: SecureFileTransfer/ ├── client/ # 客户端主目…

20250531MATLAB三维绘图

MATLAB三维绘图 三维曲线:plot3功能介绍代码实现过程plot3实现效果 三维曲面空间曲面作图命令:meshmeshgrid语法示例应用meshgrid实操训练 peakspeaks 的基本用法peaks数学表达式实操训练自定义网格大小使用自定义网格 meshMATLAB代码对齐快捷键Ctrli墨西…

深入理解C#异步编程:原理、实践与最佳方案

在现代软件开发中,应用程序的性能和响应能力至关重要。特别是在处理I/O密集型操作(如网络请求、文件读写、数据库查询)时,传统的同步编程方式会导致线程阻塞,降低程序的吞吐量。C# 的异步编程模型(async/aw…

基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别

目录 说明 前言 需求 流程说明 表结构说明 整体流程 百度智能云 注册和实名认证 创建应用 费用说明 大模型API说明 集成大模型 设计Prompt 上传体检报告 读取PDF内容 功能实现 智能评测 抽取大模型工具 功能实现 总结 说明 AI体检报告解读、病例小结或者…

Spring,SpringMVC,SpringBoot

1.Spring最核心包括aop和ioc概念 AOP 能够将将哪些于业务无关的,并且大量重复的业务逻辑进行封装起来,便于减少重复代码,降低模块之间的耦合度,给未来的系统更好的可用性和可维护性。 Spring中AOP是采用动态代理,JDK代…

数据分析学习笔记——A/B测试

目录 前言 A/B测试中的统计学方法 假设检验 Levenes Test莱文测试 t 检验(两组均值差异) 实战案例 数据来源及参考资料 代码详解 导入数据 计算ROI Request检验 GMV检验 ROI检验 结语 前言 什么是A/B测试?说白了就是中学生物实…

基于RK3568/RK3588/全志H3/飞腾芯片/音视频通话程序/语音对讲/视频对讲/实时性好/极低延迟

一、前言说明 近期收到几个需求都是做音视频通话,很多人会选择用webrtc的方案,这个当然是个不错的方案,但是依赖的东西太多,而且相关组件代码量很大,开发难度大。所以最终选择自己属性的方案,那就是推流拉…

解决 Win11 睡眠后黑屏无法唤醒的问题

目录 一、问题描述二、解决方法1. 禁用快速启动2. 设置 Management Engine Interface3. 允许混合睡眠其他命令 4. 修复系统文件5. 更新 Windows 或驱动程序6. 其他1)更改电源选项2)刷新 Hiberfil.sys 文件3)重置电源计划4)运行系统…

[ElasticSearch] RestAPI

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

Linux中的shell脚本

什么是shell脚本 shell脚本是文本的一种shell脚本是可以运行的文本shell脚本的内容是由逻辑和数据组成shell脚本是解释型语言 用file命令可以查看文件是否是一个脚本文件 file filename 脚本书写规范 注释 单行注释 使用#号来进行单行注释 多行注释 使用 : " 注释内容…

dvwa3——CSRF

LOW: 先尝试change一组密码:123456 修改成功,我们观察上面的url代码 http://localhost/DVWA/vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange# 将password_new部分与password_conf部分改成我们想要的…

【学习笔记】Transformer

学习的博客(在此致谢): 初识CV - Transformer模型详解(图解最完整版) 1 整体结构 Transformer由Encoder和Decoder组成,分别包含6个block。 Transformer的工作流程大体如下: 获取每个单词的em…

欢乐熊大话蓝牙知识12:用 BLE 打造家庭 IoT 网络的三种方式

🏠 用 BLE 打造家庭 IoT 网络的三种方式 不止是“蓝牙耳机”,BLE 还能把你家“点亮成精”! 👋 前言:BLE 不只是蓝牙耳机的“代名词” 蓝牙?很多人一听就联想到“耳机连接失败请重试”。但你知道吗?现在 BLE(Bluetooth Low Energy)在智能家居中已经偷偷搞起了大事情。…

02.上帝之心算法用GPU计算提速50倍

本文介绍了上帝之心的算法及其Python实现,使用Python语言的性能分析工具测算性能瓶颈,将算法最耗时的部分重构至CUDA C语言在纯GPU上运行,利用GPU核心更多并行更快的优势显著提高算法运算速度,实现了结果不变的情况下将耗时缩短五…

MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能

前言: 在当今竞争激烈的制造业环境中,企业面临着提高生产效率、降低成本、提升产品质量以及快速响应市场变化等多重挑战。MES管理系统作为连接企业上层计划管理系统与底层工业控制之间的桥梁,扮演着至关重要的角色。它能够实时收集、分析和处…

LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++

https://leetcode.cn/problems/search-a-2d-matrix/description/ 一、题目分析 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 ta…

VectorStore 组件深入学习与检索方法

考虑到目前市面上的向量数据库众多,每个数据库的操作方式也无统一标准,但是仍然存在着一些公共特征,LangChain 基于这些通用的特征封装了 VectorStore 基类,在这个基类下,可以将方法划分成 6 种: 相似性搜…

HackMyVM-First

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 06:13 EDT Nmap scan report for 192.168.43.1 Host is up (0.0080s latency). MAC Address: C6:45:66:05:91:88 (Unknown) …