设备驱动与文件系统:01 I/O与显示器
操作系统设备驱动学习之旅——以显示器驱动为例
从这一节开始,我要学习操作系统的第四个部分,就是i o设备的驱动。今天要讲的是第26讲,内容围绕i o设备中的显示器展开,探究显示器是如何被驱动的,也就是操作系统怎样让用户使用显示器,最终会落脚到print f
这个函数是如何将内容显示在屏幕上的。
设备驱动基础原理
操作系统是管理计算机硬件的一层软件。
之前,我已经学习了操作系统如何管理cpu,弄清楚了fork
以及进程管理的含义,明白了cpu是如何被抽象为进程的;也学习了内存管理相关知识,了解了内存如何分段、分页,以及虚拟内存的引出,直到数据最终写入物理内存。现在,我要开始学习计算机硬件中的另一重要部分——i o设备,这一讲和下一讲主要聚焦键盘和显示器,之后还会涉及磁盘及基于磁盘抽象出的文件系统,但本质上都是i o设备的驱动。
在学习具体设备驱动前,得先明确计算机让外设工作的原理。这是计算机的基本常识,使用外设时,每个外设都有对应的控制器,比如显示器的显卡。cpu只需向外设控制器中的寄存器或存储区域发送一条指令,控制器就会依据指令内容操控硬件。以显示器为例,cpu给显卡寄存器发指令,显卡就能让显示器显示内容。通常,cpu发出指令后会去执行别的进程,等外设完成任务,会向cpu发送中断信号,cpu再处理中断,可能涉及数据传输等操作。
总结起来,操作系统让外设工作的核心就两点:一是向控制器发指令,最终表现为类似out
的指令;二是处理外设工作完成后的中断。虽然实际操作外设的代码很多,但核心指令就那么几条。之所以有大量代码,是为了让外设使用更简单,这就需要提供统一的视图。因为不同设备的控制器不同,直接操作寄存器很麻烦,不同公司硬件设计也有差异,所以操作系统要形成统一接口,也就是文件视图,这样既能隐藏细节方便用户,内部还能进行高效处理。
简而言之,外设驱动主要做三件事:
- 发出
out
指令,操控设备控制器寄存器; - 进行设备中断处理;
- 提供统一文件视图,方便用户使用。
print f
显示原理探究
接下来,我通过print f
这个实际例子来深入理解设备驱动。print f
本质上是一段操作外设的程序,和其他设备操作一样,遵循统一规则。在linux系统中,操作设备通常表现为open
、read
、write
,print f
也不例外,它打开的是显示器对应的文件,然后进行写入操作。操作系统为用户提供统一的文件接口,通过不同的设备文件名区分操作的设备,print f
对应的设备文件名决定了它操作的是显示器。
具体来看,print f
最终会变成系统调用write
,写成write(1,buffer,...)
,这里的1
决定了数据输出到显示器,buffer
是格式化后的字符串缓冲区。系统调用通过int 0x80
进入内核,执行sys_write
。这里关键的1
是文件描述符,它来自当前进程pcb
数组的第一项,这个文件描述符对应一个文件,文件的inode
中存放着设备相关信息。
那么1
对应的文件是怎么来的呢?进程的pcb
是fork
创建时拷贝父进程的,所有进程打开文件的指针都源于父进程。系统初始化时,0
号进程创建相关进程,打开了一个文件并拷贝两份,1
对应的文件就是dev/tty0
,tty
代表终端设备。open
系统调用会根据文件名读入文件的inode
信息,操作系统依据这些信息决定后续操作路径。
根据inode
信息判断设备类型,如果是字符设备,就执行rw_char
,并根据设备号继续分支。dev/tty0
是字符设备,设备号为4
,通过设备号在函数指针数组中找到对应的处理函数rw_ttyx
。因为是write
操作,所以会调用tty_write
函数,这个函数会将数据先写入缓冲区right_q
。这涉及到缓冲技术,由于cpu和内存操作速度快,显示器显示速度慢,通过缓冲区可以平衡速度差异,缓冲区就像生产者 - 消费者模型中的共享缓冲区,写满时生产者(数据写入操作)会睡眠等待,不满时则写入数据。
数据写入缓冲区后,会调用函数从缓冲区取出数据输出到显示器。tty_write
函数会继续调用console_write
,console
就是终端设备,即显示器。console_write
函数会从缓冲区取出字符c
,通过out
指令将字符输出到显示器。具体的汇编指令会将字符属性赋给ah
,字符赋给al
(ax
由ah
和al
组成),然后将ax
写入显存地址pose
。这里涉及内存和i o设备的编址方式,如果是统一编址用mov
指令,如果是独立编址用out
指令,通常显存较大,采用独立编址,但本质上mov
和out
都是对i o设备控制器中的存储区域进行写操作。
总结与实验展望
至此,我梳理清楚了print f
的整个过程。从系统调用write
开始,通过统一文件接口,依据设备信息逐步找到驱动显示器的函数,利用缓冲技术和相关指令,最终将数据输出到显存显示在屏幕上。设备驱动的核心就是cpu
向外设控制寄存器发指令进行读写,并形成统一文件视图方便使用,同时处理中断。相比cpu和内存管理,设备驱动相对简单。
关于mov ax,pose
中的pose
,它每次写完会加2
,因为显存存储字符和属性各占一个字节。初始的pose
值在系统启动时,通过setup
程序根据bios
中断取出硬件参数(包括光标位置),将光标所在显存位置存入90000
处,初始化时再将其赋值给pose
。
相关文章:

设备驱动与文件系统:01 I/O与显示器
操作系统设备驱动学习之旅——以显示器驱动为例 从这一节开始,我要学习操作系统的第四个部分,就是i o设备的驱动。今天要讲的是第26讲,内容围绕i o设备中的显示器展开,探究显示器是如何被驱动的,也就是操作系统怎样让…...
.NET 9正式发布,亮点是.NET Aspire和AI
.NET 9 正式发布:.NET Aspire 与 AI 引领新潮流 一、.NET 9 发布概览 Microsoft 正式发布了 .NET 9,这一版本堪称迄今为止最高效、最现代、最安全、最智能且性能最高的 .NET 版本。它凝聚了全球数千名开发人员一年的心血,带来了数千项性能、…...
vue+mitt的简便使用
突然注意到 onMounted 在一个组件中可以多次调用,这不得发挥一下: 把绑定/解绑的逻辑封装到同一个模块中不就简化了吗,只需要在组件中注册一下子再传递一个回调就完事了。简单的组件中甚至不用引入onMounted和onUnmounted cnpm i mitt /src/utils/emi…...
Java正则表达式完全指南
Java正则表达式完全指南 一、正则表达式基础概念1.1 什么是正则表达式1.2 Java中的正则表达式支持 二、正则表达式基本语法2.1 普通字符2.2 元字符2.3 预定义字符类 三、Java中正则表达式的基本用法3.1 编译正则表达式3.2 创建Matcher对象并执行匹配3.3 常用的Matcher方法 四、…...
Windows搭建Swift语言编译环境?如何构建ObjC语言编译环境?Swift如何引入ObjC框架?Interface Builder的历史?
目录 Windows搭建Swift语言编译环境 如何构建ObjC语言编译环境? Swift如何引入ObjC框架? Swift和ObjC中IBOutlet和IBAction代表什么? Interface Builder的历史 Xcode的“Use Storyboards"的作用? Xcode的Playground是什么? Windows搭建Swift语言编译环境 Windo…...
第七部分:第四节 - 在 NestJS 应用中集成 MySQL (使用 TypeORM):结构化厨房的原材料管理系统
在 NestJS 这样一个结构化的框架中,我们更倾向于使用 ORM (Object-Relational Mapper) 来与关系型数据库交互。ORM 就像中央厨房里一套智能化的原材料管理系统,它将数据库中的表格和行映射到我们熟悉的对象和类的实例。我们可以使用面向对象的方式来操作…...
Bug 背后的隐藏剧情
Bug 背后的隐藏剧情 flyfish 1. 「bug」:70多年前那只被拍进史书的飞蛾 故事原型:1947年哈佛实验室的「昆虫命案」 1947年的计算机长啥样?像一间教室那么大,塞满了几万根继电器(类似老式开关)ÿ…...
Golang | 搜索哨兵-对接分布式gRPC服务
哨兵(centennial)负责接待客人,直接与调用方对接。哨兵的核心组件包括service HUB和connection pool。service HUB用于与服务中心通信,获取可提供服务的节点信息。connection pool用于缓存与index worker的连接,避免每…...

智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?
随着新能源汽车的普及,智慧充电桩作为基础设施的重要组成部分,正逐步向数字化、智能化方向发展。环境监测与动态数据可视化技术的应用,为充电桩的高效管理和运维提供了全新解决方案。通过实时采集环境参数与运行数据,并结合可视化…...
debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt
系统盘: https://mirror.lzu.edu.cn/debian-cd/12.9.0/amd64/iso-dvd/debian-12.9.0-amd64-DVD-1.iso 需要的依赖包,无需安装ruby( sudo apt install -y ruby-full ruby-dev rubygems ) : apt install -y iptables; apt install -y curl;rootdebian129:~# dpkg -l iptables …...

家政小程序开发,开启便捷生活新篇章
在快节奏的现代生活中,家务琐事常常让人分身乏术,如何高效解决家政服务需求成了众多家庭的难题。家政小程序开发,正是为解决这一痛点而生,它将为您带来前所未有的便捷生活体验。 想象一下,您只需打开手机上的家政小程…...
C++ 重载(Overload)、重写(Override)、隐藏(Hiding) 的区别
C 重载(Overload)、重写(Override)、隐藏(Hiding) 的区别 这三个概念是 C 面向对象的核心知识点,也是面试必问内容。下面我们从定义、发生条件、代码示例、底层原理全方位解析它们的区别。 一、核心区别对比表(速记版) 特性重载(Overload)…...

李臻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体检报告解读、病例小结或者…...
Redis缓存落地总结
最近在优化电子签系统,涉及到缓存相关的也一并优化了,写个文档做个总结,防止以后开发时又考虑不全 1、避免大key 避免缓存大PDF文件: 💡 经验值:单个Redis Value不超过10KB,集合元素不超过500…...

Spring,SpringMVC,SpringBoot
1.Spring最核心包括aop和ioc概念 AOP 能够将将哪些于业务无关的,并且大量重复的业务逻辑进行封装起来,便于减少重复代码,降低模块之间的耦合度,给未来的系统更好的可用性和可维护性。 Spring中AOP是采用动态代理,JDK代…...
npm、pnpm、yarn使用以及区别
npm 使用 安装包:在项目目录下,npm install <包名> 用于本地安装包到 node_modules 目录,并添加到 package.json 的 dependencies 中;npm install -g <包名> 用于全局安装,适用于命令行工具等。初始化项目…...
flutter加载dll 报错问题
解决flutter加载dll 报错问题 LoadLibrary 报错 126 or 193 明确一点:flutter构建exe 时默认是MSVC的。 1. 先检查dll 的位数是否满足 file ***.dll output: PE32 executable (DLL) (console) x86-64, for MS Windows, 19 sections 这种是64位的机器。 满足的话可…...

数据分析学习笔记——A/B测试
目录 前言 A/B测试中的统计学方法 假设检验 Levenes Test莱文测试 t 检验(两组均值差异) 实战案例 数据来源及参考资料 代码详解 导入数据 计算ROI Request检验 GMV检验 ROI检验 结语 前言 什么是A/B测试?说白了就是中学生物实…...
【python深度学习】Day 41 简单CNN
知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch归一化层…...

基于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核心更多并行更快的优势显著提高算法运算速度,实现了结果不变的情况下将耗时缩短五…...