设备管理与文件系统

2024-08-31 20:12
文章标签 管理 文件系统 设备

本文主要是介绍设备管理与文件系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/1124884

相关文章

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1