# 文件
在 Linux、BSD 这样的类 Unix 系统中,万物皆文件(Everything is a file)。想象一下像文字处理程序这样的上下文中的文件,我们可以在此虚构的字处理文件上使用两个基本操作:
- 读取它(来自字处理器的现有已保存数据)。
- 向其写入(来自用户的新数据)。
在计算器中,我们与读写这样文件基础操作相关的元素还包括:屏幕、键盘、打印机、CD-ROM 等。
![抽象](https://s2.ax1x.com/2020/01/25/1eOoRS.png)
屏幕和打印机都像只写文件,但是信息不是作为位存储在磁盘上,而是显示为屏幕上的点或页面上的线。键盘就像一个只读文件,其数据来自用户提供的击键。CD-ROM 也类似,但并非直接来自用户,而是将数据直接存储在磁盘上。因此,文件的概念是数据接收器或数据源的良好抽象,它是一个可以附加到计算机的所有设备的出色抽象。这种实现是 UNIX 的强大功能,并且在整个平台的设计中显而易见。向程序员提供这种硬件抽象是操作系统的基本角色之一。可以说,抽象是支撑所有现代计算的主要概念,这可能并不过分。从设计现代用户界面到现代 CPU 的内部工作原理,没人能理解所有内容,更不用说自己构建所有内容了。对于程序员而言,抽象是允许我们进行协作和发明的通用语言。
# 文件描述符
UNIX 中每个正在运行的程序都以三个已经打开的文件开始:
| Descriptive Name | Short Name | File Number | Description |
| ---------------- | ---------- | ----------- | --------------------------- |
| Standard In | stdin | 0 | Input from the keyboard |
| Standard Out | stdout | 1 | Output to the console |
| Standard Error | stderr | 2 | Error output to the console |
![Default Unix Files](https://s2.ax1x.com/2020/01/25/1eXtW8.png)
打开调用返回的值称为文件描述符,本质上是内核保存的打开文件数组的索引;换言之,文件描述符是通往内核底层硬件抽象的门户。
![File Descriptor](https://s2.ax1x.com/2020/01/25/1eXBes.md.png)
文件描述符是内核存储的文件描述符表的索引。内核响应打开调用而创建文件描述符,并将文件描述符与底层文件状对象的某种抽象相关联,这些对象是实际的硬件设备,文件系统或其他任何东西。因此,引用该文件描述符的进程的读取或写入调用将由内核路由到正确的位置,以最终做一些有用的事情。
# 硬件文件抽象
从最低级别开始,操作系统需要程序员来创建设备驱动程序,以便能够与硬件设备进行通信。这些设备驱动程序就是那些遵循着 Linux 系统 API 的软件程序。
```c
/**
* virtio_driver - operations for a virtio I/O driver
* @driver: underlying device driver (populate name and owner).
* @id_table: the ids serviced by this driver.
* @feature_table: an array of feature numbers supported by this driver.
* @feature_table_size: number of entries in the feature table array.
* @probe: the function to call when a device is found. Returns 0 or -errno.
* @remove: the function to call when a device is removed.
* @config_changed: optional function to call when the device configuration
* changes; may be called in interrupt context.
*/
struct virtio_driver {
struct device_driver driver;
const struct virtio_device_id *id_table;
const unsigned int *feature_table;
unsigned int feature_table_size;
int (*probe)(struct virtio_device *dev);
void (*scan)(struct virtio_device *dev);
void (*remove)(struct virtio_device *dev);
void (*config_changed)(struct virtio_device *dev);
#ifdef CONFIG_PM
int (*freeze)(struct virtio_device *dev);
int (*restore)(struct virtio_device *dev);
#endif
};
```
在上面的简化示例中,我们可以看到驱动程序提供了读写功能,以响应文件描述符上的类似操作而被调用。设备驱动程序知道如何将这些通用请求转换为针对特定设备的特定请求或命令。
为了提供对用户空间的抽象,内核通过通常称为设备层的方式提供文件接口。主机上的物理设备由特殊文件系统(例如 /dev)中的文件表示。在类似 UNIX 的系统中,所谓的设备节点具有主要编号和次要编号,它们允许内核将特定节点与其底层驱动程序相关联。
```s
$ ls -l /dev/null /dev/zero /dev/tty
crw-rw-rw- 1 root root 1, 3 Aug 26 13:12 /dev/null
crw-rw-rw- 1 root root 5, 0 Sep 2 15:06 /dev/tty
crw-rw-rw- 1 root root 1, 5 Aug 26 13:12 /dev/zero
```
这将我们带到文件描述符,该文件描述符是用户空间用于与基础设备进行通信的句柄。从广义上讲,打开文件时发生的情况是内核正在使用路径信息将文件描述符与提供适当读写等 API 的内容进行映射。当此打开是针对设备的(上面的 / dev/sr0)时,打开的设备节点的主编号和次编号将提供内核找到正确的设备驱动程序并完成映射所需的信息。然后,内核将知道如何将进一步的调用(如读取)路由到设备驱动程序提供的基础功能。
尽管非设备文件之间存在更多的层,但其操作类似。这里的抽象是挂载点;挂载文件系统具有设置映射的双重目的,因此文件系统知道提供存储的底层设备,内核知道在该挂载点下打开的文件应定向到文件系统驱动程序。像设备驱动程序一样,文件系统被写入内核提供的特定通用文件系统 API。
实际上,实际上还有许多其他层使图片复杂化。例如,内核将竭尽全力在尽可能多的空闲内存中缓存来自磁盘的尽可能多的数据。这提供了许多速度优势。它还将尝试以最有效的方式组织设备访问;例如,即使没有按顺序到达请求,也要尝试命令磁盘访问以确保物理上靠在一起存储的数据被一起检索。此外,许多设备属于通用类,例如 USB 或 SCSI 设备,它们提供要写入的抽象层。因此,文件系统将直接穿过这些许多层,而不是直接写入设备。理解内核就是要理解这许多 API 是如何相互关联和共存的。
# Shell
Shell 是与操作系统进行交互的网关。无论是 bash,zsh,csh 还是许多其他 Shell 中的任何一个,它们基本上都只有一项主要任务-允许您执行程序(当我们谈论某些内部原理时,您将开始理解 Shell 实际是如何做到的)操作系统的版本)。但是,shell 所要做的不只是允许您简单地执行程序。它们具有强大的功能来重定向文件,允许您同时执行多个程序和编写完整程序的脚本。
## Redirection
很多时候我们并不希望输入输出的文件描述符指向默认的位置,譬如您可能希望将程序的所有输出捕获到磁盘上的文件中,或者让它从您之前准备的文件中读取命令;另一个有用的任务可能是希望将一个程序的输出传递给另一个程序的输入。
| Name | Command | Description | Example |
| ------------------ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
| Redirect to a file | `> filename` | Take all output from standard out and place it into `filename`. Note using `>>` will append to the file, rather than overwrite it. | `ls > filename` |
| Read from a file | < `filename` | Copy all data from the file to the standard input of the program
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业和服务提供商的首选操作系统,用于部署Web服务器、数据库服务器、邮件服务器等。Linux系统具有高效的网络功能和稳定的性能,因此被广泛应用于服务器领域,Linux是云计算的核心组成部分,被广泛用于构建云平台和云服务。许多知名的云计算服务提供商都采用Linux系统作为其基础架构,一些游戏平台和游戏开发工具采用Linux作为支持的操作系统,例如Steam平台上的某些游戏。Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
资源推荐
资源详情
资源评论
收起资源包目录
Linux系统设计-深入浅出 Linux 操作系统:操作系统原理、Linux 应用实践、并发编程、物联网操作系统 (162个子文件)
.gitattributes 128B
.gitignore 914B
index.html 6KB
LICENSE 16KB
计算机操作系统.md 127KB
2018-Linux IO 过程自顶向下分析.md 67KB
2023-从石器时代到成为“神”,一文讲透 eBPF 技术发展演进史.md 39KB
2023-无声的平台革命:eBPF 是如何从根本上改造云原生平台的.md 20KB
2021-十个问题理解 Linux epoll 工作原理.md 20KB
进程控制.md 19KB
循环.md 17KB
2020-一文帮小白搞懂操作系统之内存.md 16KB
00.让 Rust 成为你的下一门主力语言.md 16KB
_sidebar.md 14KB
第三章 处理机调度与死锁.md 14KB
2020-深入浅出让你彻底理解 epoll.md 14KB
进程模型.md 13KB
Systemd.md 13KB
第六章 输入输出系统.md 12KB
管道与连接.md 11KB
第四章 存储器管理.md 10KB
条件判断.md 10KB
进程状态.md 10KB
mmap 的内核实现.md 10KB
执行环境.md 10KB
2023-macOS Internals.md 10KB
README.md 10KB
常用 Unix 命令的现代替代.md 10KB
存储器的层次化结构.md 9KB
高速缓存.md 9KB
指令基础.md 9KB
Unix 设计哲学.md 9KB
用户管理.md 9KB
2021-从根上理解用户态与内核态.md 9KB
README.md 9KB
变量.md 9KB
README.md 8KB
README.md 8KB
第二章 进程的描述与控制.md 8KB
条件选择.md 8KB
单道批处理系统.md 8KB
页缓存.md 8KB
README.md 8KB
Linux 下的实现.md 7KB
select.md 7KB
README.md 7KB
菜单与对话框.md 6KB
函数调用.md 6KB
01.用户态与内核态.md 6KB
操作系统调度算法总览.md 6KB
虚拟存储管理.md 5KB
README.md 5KB
README.md 5KB
参数与返回.md 5KB
Page Fault.md 5KB
页面置换算法.md 5KB
重定向.md 5KB
epoll 函数使用.md 5KB
局部变量与返回.md 5KB
字符串.md 5KB
README.md 4KB
函数定义.md 4KB
块 IO 栈.md 4KB
输入与输出.md 4KB
README.md 4KB
COW.md 4KB
README.md 4KB
sed.md 4KB
页结构.md 4KB
第五章 虚拟存储器.md 4KB
README.md 4KB
进程查看.md 3KB
创建与读写.md 3KB
02.用户线程与内核线程.md 3KB
README.md 3KB
操作系统简史.md 3KB
README.md 3KB
README.md 3KB
表达式.md 3KB
数据存取.md 3KB
iostat.md 3KB
数值类型.md 3KB
AIO.md 3KB
第一章 操作系统引论.md 3KB
三大定律.md 3KB
服务与初始化.md 2KB
README.md 2KB
SSD.md 2KB
awk.md 2KB
Unix 和 Posix.md 2KB
Meltdown.md 2KB
README.md 2KB
README.md 2KB
指令集.md 2KB
路由与映射.md 2KB
README.md 2KB
中断与异常.md 2KB
DMA.md 2KB
README.md 2KB
物理内存分配与回收.md 1KB
共 162 条
- 1
- 2
资源评论
妄北y
- 粉丝: 9669
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功