设备管理与文件系统

news2024/9/24 1:27:39

1、设备管理框架

对于不同类型的设备的操作,全部由一下函数指针来完成。即操作系统对设备进行操作,只需要调用统一的API接口,无需了解相关的细节。

比如如下的接口设计:

int (*open) (device_t * dev) ;
int (*read) (device_t * dev, int addr, char * buf, int size);
int (*write) (device_t * dev, int addr, char * buf, int size);
int (*control) (device_t * dev, int cmd, int arg0, int arg1);
void (*close) (device_t * dev);

2、将tty纳入设备管理器中

介绍了如何将键盘和鼠标同时进行管理,从而为后续创建命令行解释器打下基础

此外,如果你参考相关资源,可能会看到tty设备对数据的处理有两种模式:

  • raw模式:对输入输出的数据不做任何处理

  • cooked模式:对数据做一些处理,然后再输入输出

在本门课程中,只采用了cooked模式,并且只做了非常简单的处理,即处理\r\n字符的转换。这个将在后面的课程中看到

3、为tty设备添加结构描述

希望最终做出的系统能够支持同时打开多个命令行,并且根据显存的特性,得知32KB的显存可能被用于显示8屏的数据。在代码中定义了tty_devs数组,用于表示多个tty设备

每个tty设备,使用32KB显存中的4KB来存储显示数据;输入全部采用同一块物理键盘。在后面课时中,这个键盘的数据是如何分发给每个tty设备。

在tty设备中,还增加了输入输出的缓存。缓存的主要作用是缓存处理器和外部设备工作速度的不一致

4、打开tty设备并向其写入数据

目的是在进程中能够调用open系统调用打开tty设备,然后通过printf函数向tty设备文件写入数据。

5、文件系统简介及初始化

文件系统的常见功能是将磁盘上的数据抽像成文件和目录,并将其组织成目录树的形式,一切皆文件(设备,外设接口)

6、为进程添加文件打开表

每个应用程序在运行过程中,都有可能打开文件并进行读写,且各个应用程序之间操作文件行为应当相互不干扰,以及多个进程同时打开同一文件中要处理冲突的问题

解决办法:

        定义一个全局的file_t文件表,其中包含所有打开的文件表。每个进程只维护一个指针,指向表中的某个文件。每个进程既有自己的打开文件表,同时也能够方便实现文件地共享、处理打开同一文件的冲突问题。

比如,当打开某一文件时,可以先遍历file_t文件表,看看相应的文件是否已经打开。如果已经打开,则可以直接将进程自己的打开文件表中的某表项直接指向该文件即可。

6、从tty读取键值字符串并显示

tty设备的输入来源于键盘中断,当中断发生时产生按键的键值。

该键值会被保存在tty的输入缓存中,并且通过信号量来告诉进程缓存中有键值数据

  • 按键的数据可能暂时被缓存而不必要求当时必须有进程在读取数据
  • 当缓存中没有数据时,进程也可以在信号量上等待,从而释放CPU给其它进程

主要工作流程:

  1. 进程检查缓存是否有数据,如果有使用tty_fifo_get取出。如果没有则在信号量上等待
  2. 按键中断读取键值,写入tty_fifo_put,发送信号量通知进程去取数据。如果此刻有进程在等待,则唤醒进程。

6、打开标准输出和错误输出文件

目的实现dup系统调用,从而让应用程序能够通过stdin、stdout和stderr进行输入输出

printf实际是往其内部的stdout文件写数据

scanf则是从其内部的stdin文件读取文件

stderr文件,用于输出错误信息

这三个文件,在Newlib中,其对应的序号分别为stdin - 0, stdout - 1, stderr - 2。在我们目前的设计中,这三个文件实际上都对于同一个tty设备,即从显示器输出,从键盘输入。

我们可以同时打开同一文件3次。由于目前没有处理同一文件被打开多次的情况,因此实现了dup函数,其功能是实现一个已打开的文件的描述符副本。

7、允许切换tty窗口

显示器某一时刻只能将显存中的一部分用于显示,具体可以通过相应的显存寄存器来控制显示器从显存中的哪个位置开始取数据显示。

因此,采用创建多个tty,每个tty对应于显存中的一屏显示数据。最终可以创建多个终端设备,只不过这些设备都是虚拟的。限于屏幕和键盘均只有一个,因此每一时刻仅能使用某中某个tty设备。

要使用某个特定的tty设备,需要使用CTRL + Fn(n=1,2,....)来切换

8、为每个进程创建进程保护

考虑到tty设备的读写代码会被多进程访问,以及被中断访问,因此加上相应的保护

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

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

相关文章

直播行业的未来:南昌络喆科技有限公司的创新无人直播项目!

随着数字化时代的推进,直播行业迎来了前所未有的增长机遇。南昌络喆科技有限公司凭借其创新的无人直播技术,正引领着行业的新潮流,展现出直播领域的新面貌。 无人直播技术突破了传统直播的局限,实现了自动化的高效运营模式。它摒弃…

用Python解决预测问题_对数线性模型模板

对数线性模型(Log-linear model)是统计学中用于分析计数数据或频率数据的一类模型,特别是在多维列联表(contingency tables)分析中非常常见。这种模型通过取对数将乘法关系转换为加法关系,从而简化了数据分…

关于自己部署AI大模型踩的坑(三)—— 部署

最近一直在研究如何打算属于我自己的J.A.R.V.I.S.(钢铁侠中的机器人管家)。 上一篇写了我最近在部署自己的大模型,使用llama3.1, 和通义千问2。虽然最终结果也是成功了,过程却十分地坎坷。所以这一篇文章一是总结其中遇…

Nginx快速入门:编译及常用配置

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,也是一个 IMAP/POP3 邮件代理服务器。它以其高并发处理能力和低资源消耗而闻名,能够同时处理数千个连接。 Nginx 的主要功能包括: 静态资源服务器:Nginx 可以担任静态资源服务…

【Python零基础】Python测试

文章目录 前言一、使用pip安装pytest1.1 更新pip1.2 安装pytest 二、测试函数2.1 编写测试文件2.2 运行测试2.3 测试不通过2.4 测试不通过2.4 增加新测试 三、测试类3.1 断言3.2 夹具 总结 前言 代码测试是程序开发中极其重要的一环,任何代码都应该经过测试才能上生…

sqli-labs靶场通关攻略(五十一到五十六关)

sqli-labs-master靶场第五十一关 步骤一,尝试输入?sort1 我们发现这关可以报错注入 步骤二,爆库名 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- 步骤三,爆表名 ?sort1 and updatexml(1,concat(0x7e,(select group_conc…

数据结构:树形结构(树、堆)详解

数据结构:树形结构(树、堆)详解 一、树(一)树的性质(二)树的种类二叉树多叉树满N叉树完全N叉树 (三)二叉树的实现1、二叉树结构定义2、二叉树功能实现(1&…

数字化转型中的数据应用:挑战、机遇与追赶之路

在数字化时代的大潮中,数据已悄然从企业的边缘资源跃升为最宝贵的核心资产。然而,这场数据盛宴并未带来普遍的数据应用成熟,反而揭示了企业在数据利用上的巨大鸿沟。即便是全球500强企业,在数据应用的征途上,也仅仅是比…

秋招突击——笔试总结——8/31——京东笔试

文章目录 引言正文第一题——下一个字典序的字符个人实现 第二题——冒泡排序的变种个人实现空间复杂度比较低的版本 第三题——两人走路个人实现 总结 引言 今天京东笔试做的并不好,有很多问题的关窍都没有找到,所以在很多问题上都浪费了大量的时间&am…

JVM下篇:性能监控与调优篇-04-JVM运行时参数

文章目录 4. JVM 运行时参数4.1. JVM 参数选项4.1.1. 类型一:标准参数选项4.1.2. 类型二:-X 参数选项4.1.3. 类型三:-XX 参数选项 4.2. 添加 JVM 参数选项4.3. 常用的 JVM 参数选项4.3.1. 打印设置的 XX 选项及值4.3.2. 堆、栈、方法区等内存…

Java多线程(二)线程同步

1、线程同步问题 当多个线程同时操作同一个数据时,就会产生线程同步问题。 为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步”。当一个线程运行到需要同步的语句后,CPU不去执行其他线程中的、可能影响当前线程中的下一句代…

记一次学习--webshell绕过(动态检测)

目录 第一种样本 代码分析 第二种样本 代码分析 题目分析 结果 不断学习&#xff0c;不断进步 快就是慢&#xff0c;慢就是快。审视自身 第一种样本 <?php class xxxd implements IteratorAggregate {public $xxx "system";public function __construct(…

C++ | Leetcode C++题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; class Solution { public:int lengthLongestPath(string input) {int n input.size();int pos 0;int ans 0;vector<int> level(n 1);while (pos < n) {/* 检测当前文件的深度 */int depth 1;while (pos < n && in…

R语言统计分析——单因素协方差分析

参考资料&#xff1a;R语言实战【第2版】 单因素协方差分析&#xff08;ANCONA&#xff09;扩展了单因素方差分析&#xff08;ANOVA&#xff09;&#xff0c;包含一个或多个定量的协变量。下面使用multcomp包中的litter数据集进行操作&#xff1a; # 加载数据集 data(litter,p…

0-HDMI高速接口协议基础介绍

高清多媒体接口(HDMI&#xff0c;High Definition Multimedia Interface)是一种数字化视频/音频接 口技术&#xff0c;是适合影像传输的专用型数字化接口&#xff0c;其可同时传送音频和视频信号&#xff0c;同时无需在 信号传送前进行数/模或者模/数转换。从2002年HDMI发布最初…

Windows 环境nginx安装使用及目录结构详解

一、 Windows 环境nginx安装及基本使用 1、下载 nginx-1.27.1 最新的主线版本 安装 nginx/Windows&#xff0c;请下载1.27.1最新的主线版本&#xff0c; nginx 的主线分支包含所有已知的修复程序。 2、 解压缩 nginx-1.27.1 版本 nginx/Windows 作为标准控制台应用程序&#x…

YOLO | YOLO目标检测算法(分类、检测、分割)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 分类、检测、分割 思考&#xff1a;计算机视觉能够解决哪些问题&#xff1f;&#xff1f;&#xff1f;&#xff1f;分类、检测、分割 分割&#xff1a;语义分割和实例分…

SOMYO™——将“照片”转为“手绘素描”的专业级软件

一定要往下看&#xff0c;最精彩的在最后哦&#xff01; 1 关于素描的几句话 素描是西方美术的灵魂。值得为自己、亲人与好友留下一张别致的素描。 素描的定义&#xff1a;艺术家通过线条的粗细、浓淡、疏密等变化&#xff0c;试图精准地再现形态的体感、质感和动感的艺术…

轻量级进程(LWP)和线程

线程是CPU调度的基本单位 进程是承担系统资源的基本实体(进程是资源分配的基本单位) 线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配 任何一个线程都可以创建或撤销另一个线程 多进程里&#xff0c;子进程可复制父进程的所有堆和栈的数据&#xff1b…

黑神话悟空-提高画质、防卡顿、修复等各种功能、各种CT表、各种存档、武器包、人物、装备替换等193+MOD合集

193MOD合集&#xff0c;提高画质&#xff0c;减少卡顿、修复等功能MOD各种CT表各种存档武器包、物品、人物、装备、造型替换等 具体MOD可在文件内查看 特别说明&#xff1a;3款珍品大圣套装替换初始套装MOD是不同的&#xff0c;&#xff08;其中全装备珍品大圣套装是不可以跳出…