各类操作系统的文件夹设计

发表时间:2021-01-30 21:17作者:司镜233

就在昨天,我将我用的mac电脑重新装了系统,不是还原的备份系统,原系统也没有任何问题。
但为了更好的学习一个操作系统,对自己的工具更为了解,将其变为我的利器,我将系统进行了更新,所有的配置、存储的文件都清空了。当然,以前存的各种书籍、资料还有,我已经转移到网盘上了。
这份长更日志不知道会持续多长时间,但希望它有一个好的开始,直到我能用它做我想做、它能做的事情。

主要为以下内容

  • 主流操作系统的对比学习: Mac VS. Linux VS. Windows

  • 未来操作系统的了解和测试: Google的Fuchsia, 华为的Harmony Os等

  • 基础知识的补习+扩充

  • 相关书籍、资源的推荐

Linux

目录简介
binbin是Binary的缩写, 这个目录存放着最经常使用的命令。
boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
devdev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
etc
这个目录用来存放所有的系统管理所需要的配置文件和子目录。
home用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
lib这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
medialinux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
mnt系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在
opt这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器
root该目录为系统管理员,也称作超级权限者的用户主目录。
sbins就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
selinux这个目录是Redhat
srv该目录存放一些服务启动之后需要提取的数据。
sys这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。

该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
tmp这个目录是用来存放一些临时文件的。
usr这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
usrbin,系统用户使用的应用程序。
usrsbin,超级用户使用的比较高级的管理程序和系统守护程序。
usrsrc,内核源代码默认的放置目录。
var这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
run是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 var,run 目录,应该让它指向 run。

参考资料:Linux系统目录结构

Mac

从理论上讲,任何电脑可以安装任何系统。
也就是说,一台电脑,无论是微软的、联想的,还是mac的,自己配置的,可以装Linux、Windows以及Mac系统。
但其中,不免许多支离破碎的波折,有装过系统的人,肯定更是深有体会。

Mac OS X (Unix核心)

Macintosh HD:

  • Applications

存放各种软件

  • System

系统正常运行所必须:- Applications
- DriverKit
- iOSSupport- Library- Volumes

  • User

用户专有的资源

  • Library

系统资源库,字体、ColorSync配置、偏好设置及插件等

Applications

System

  • Application Support 包含了应用相关的数据以及支持文件,比如第三方的插件,帮助应用,模板以及应用使用到但是并不需要用来支持运行的额外资源文件。按照惯例,所有这些内容都会被存储在以应用名称命名的子目录当中。

  • Assistants包含了帮助用户进行配置或者其它任务的程序。

  • ColorPickers包含了用来选择色彩的资源,它们根据某种模型,比如 HLS (色彩角、饱和度、亮度) 选择器或者 RGB 选择器。

  • ColorSync包含了 ColorSync 配置和脚本。

  • Components包含了系统包和扩展。

  • Contextual Menu Items包含了用于扩展系统级菜单的插件。

  • Dictionaries包含了系统自带的字典文件。

  • Desktop Pictures桌面图片目录。

  • Documentation包含了供计算机用户和管理员参考的文档文件和 Apple 帮助包。(Apple 帮助包在Help 子目录当中。) 在本地域中,这个目录包含了 Apple 公司发布的帮助包(不包括开发者文档)。

  • Extensions包含了设备驱动和其它内核扩展。(只存在于系统域当中。)

  • Favorites包含了指向经常访问的文件夹、文件或者网站的别名。(仅仅存在于用户域当中。)

  • Fonts包含了用于显示和打印的字体文件。

  • Java包含了Java运行环境。

  • StartupItems包含了在系统导入时刻运行的系统以及第三方脚本和程序。 (更多有关系统导入时刻启动步骤的信息请参考系统启动程序主题)

Library

  • CFMSupport CFM, Code Fragment Manager

等同旧Mac OS应用程序都会使用的共有程式库. 以确保Mac OS环境的一致性.

当中储存有一个在OS X中极为重要的档桉—CarbonLib, 是执行炭火软件时必不可欠的档桉.

此外还有DiscRecordingLib(CD|R-RW用的程式库), OpenGLLib(OpenGL), stbCLib(c语言)

  • DTDs:Document Type Definition

作为存放系统所使用的各种XML档桉, 并为其格式定义之档桉.

Mac OS X Data形式製成的文书, 分别由三个档桉管理, 分别是PropertyList.dtd,KeyboardLayout.dtd及sdef.dtd三个档桉所组成.

此外, .plist档桉亦是由XML撰写出来的.

  • Extensions

其实这裡就是用作存放硬件驱动的地方,苹果不称驱动程序为driver, 而是称为Extension.

  • Filesystems

主要就是用以存放OS X对应及支持何种档桉格式的资料.

例同标准的AppleShare(苹果档桉分享标准), ISO 9660|FTP|HFS及至网络上用的如Samba等

  • HelpViewer

一切和Mac OS Help有关的档桉及文件都存放于此

  • Find

就是搜寻机能了. 是对应多国语言的.

  • OpenSSL: Secure Sockets Layer.

是一套通讯加密技术, 一般用于Web服务器上, 会将密码传送时以加密的暗号处理, 从而减低第三方成功盗 取资料的可能.

一般应用于以https开首的URL上. Mac OS X内置的WebServer—Apache, 亦包含这个服务.

  • CoreServices

    • Dock   这是OS X的特徵之一, 这部份是有关Dock的资料

    • Finder.app 这个比较特别, 因为这是一个应用而非一个档桉夹, Finder.app可说是负责掌控整个OS上的一切资源.

    • Kerberos: 由MIT(麻省理工大学)开发的网络认证技术. 能够很简单地以单一ID登入系统的检证技术. Mac OS X支援其版本4的Kerberos. 所谓Kerberos, 在希腊神话中是一头住在冥界, 拥三头, 蛇尾的地狱守门犬

    • Menu ExtrasStatus bar上面所有系统自带工具的原文件,双击打开可以直接在status bar上添加相应文件

    • Setup Assistant 所有有关设定助理的资料都存放于此.

    • Software Update 这裡就是负责Software update的地方


User

包含了某个用户专有的资源。这里也有一个Library文件夹,不同与上边的那个Library,是专为你的帐号服务,里面放的是你自己的个性化字体、配置文件等

  • Applications包含仅仅当前用户可用的应用。

  • Desktop 包含了 Finder 在当前登录用户桌面上显示的桌面项。

  • Documents 包含了用户的个人文档。

  • Download 包含了下载的各种文档。

  • Library 包含了应用设置、偏好设置一起其他用户专有的系统资源

  • Documentation包含了供计算机用户和管理员参考的文档文件和 Apple 帮助包。(Apple 帮助包在Help 子目录当中。) 在本地域中,这个目录包含了 Apple 公司发布的帮助包(不包括开发者文档)。

  • Extensions包含了设备驱动和其它内核扩展。(只存在于系统域当中。)

windows

系统被分成内核模式和用户模式。

内核模式的构成文件是系统的核心文件她包含:

hal.dllntoskrnl.exe设备驱动文件系统驱动图形设备驱动win32k.sys

1.首先来看第一层HAL(硬件抽象层)

HAL使得reactOS   内核可以运行在不同的x86母板上。HAL为内核抽象母板的特定代码也许是对不同母板定义一种抽象的接口,向上提供一种标准的接口调用,这样不同的母板就不需要改变内核,思想上有点像驱动程序的设计,不过用在另外一个地方(具体的实现目前还不知道,以后边看代码边了解)。


2.ntoskrnl(内核)

内核又分成两层,第一层有的称为核心层(core)提供非常原始且基本的服务,如多处理器的同步、线程调度、中断分派等等。第二层是执行体(EXECUTIVE)内核执行体提供了系统的服务,这里的服务不是指windows服务管理器看到的那种服务,而是一些系统函数。而这些函数被划分成不同的类别:

  • 具备虚拟存储的内存管理:采用分段和分页以及虚拟内存的方式管理内存的使用。

  • 对象管理:采用面向对象的思想,用C来实现,在windows中一切资源都被抽象为对象。如文件对象,进程线程对象等。进程线程管理:负责创建和终止进程、线程。

  • 配置管理:负责管理注册表安全引用监视:在本地计算机上执行安全策略,保护计算机的资源

  • I/O管理:实现I/O的设备无关性,并负责把I/O请求分配给相应的设备驱动程序以进一步处理

  • 即插即用管理器(PNP):确定设备应该由哪个驱动程序来支持并负责加载相应驱动。在启动时的枚举过程中,它收集每个设备所需要的硬件资源,并根据设备的需要来分配合适的硬件资源如I/O端口,IRQ,DMA通道之类,当系统中的设备发生变化时它负责向系统和应用程序发送通知消息。

  • 电源管理:协调电源时间,通过合理的配置,使得CPU降低电源消耗

  • 缓冲管理器:将最近使用过的数据留在CACHE中来提高系统的整体性能本地过程调用(LPC)管理。ReactOS因为兼容windows,因此在设计上也提供相同的功能,只是实现方法有所不同而已。


3.设备驱动程序

设备驱动程序是核心态可加载模块(以.SYS为扩展名,存放在system32\drivers),它们是I/O管理器和相关硬件设备的接口。设备驱动程序采用一种I/O管理所规定的接口标准来编写,因此可以被内核执行体的I/O管理单元调用来驱动硬件的工作。


4.文件系统驱动程序

文件系统驱动程序也是核心态可加载模块(以.SYS为扩展名system32\drivers),文件系统其实是强加给存储硬件的一种文件存放规则。某类文件系统其实就是按照他的文件存取规则在存储器上组织文件的信息。比如FAT32 按照FAT32的存储规则来存放文件ext2又按照ext2的文件规则存放文件。

文件系统按照I/O管理的接口标准来实现一组存储规则,同时文件系统也可以将信息按照自己的存储方式请求I/O管理单元,让I/O管理单元通过这个设备的设备驱动程序将信息存放到该设备上。

这样的方式使得文件系统只负责存储规则的定义。而驱动程序去处理硬件的调度(比如如何移动磁头臂,采用什么调度算法等)而I/O管理仅仅是他们之间的协调员,至于如何协调,I/O管理向外定义了自己的标准。


5.图形设备驱动

这个设备有点独特,从图上来看,(这个图是windows 2000的体系结构图)好像只有内核模式设备驱动也就是win32k.sys才能启动。图形设备驱动其实和其他的设备驱动程序我想也不会有太大的差别(以后看代码在了解)。

不过有一点可以了解,那就是图形设备驱动是由win32k来驱动的,估计提供的也是硬件驱动。


6.win32k

这个东西应该是windows所说的win32子系统的内核部分(原生子系统,其他的子系统是可以分割的),如果没有这个子系统windows就不能运行?(好像微软是这么说的,原因好像是win32 的文档化的 API都是通过这个子系统实现的,据说最初的子系统都通过CSRSS来实现,这个东西最初好像包含至少3个子系统,1.win32,2.OS/2,3.POSIX,随着win32的羽翼逐渐丰满,在发行时就不再包含其他两个。但是还是依然叫CSRSS,慢慢看代码才知道,这些都是道听途说)。

win32k也被划分成两个部分,第一个是USER32,第二个是GDI32,

ReactOS的win32K估计基本上都是通过wine移植过来的。

USER32:

包含了windows管理的操作吧,比如如何创建窗口,显示窗口,隐藏窗口,移动窗口排列窗口z轴,对拥有窗口的Z轴排序,Region(可视区域)操作,鼠标集中测试等。

GDI32:

包含图形设备的绘制操作(这些操作也可以叫服务),比如画点,画线,位图操作等,GDI会将一些复杂的绘图操作转变成简单的绘制请求发送给图形驱动程序(如果这个图形驱动程序不支持复杂绘制)还有就是一些设备无关的位图操作,有的可以保存在内存或文件,而如果将设备无关的位图输出的话就会被转换成设备相关的位图然后再输出。

推荐书籍&资料

《windows程序设计》

《windows核心编程》

《鸟哥Linux私房菜》

《APUE》

Linux

对于Linux应用的学习,主要有六部分:1. 环境搭建;2. 基本操作;3. 系统编程;4. 网络编程;5. 数据库编程,6. Shell编程。下面一一详细介绍。

  1. 环境搭建

作为Linux工程师,毋庸置疑一定需要Linux环境。对于Linux环境的获取,我们通常有两种方式:

将电脑整体安装为Linux系统;

在电脑里安装一个虚拟机,跑Linux电脑;

Window+Linux双系统。

得到Linux环境后还不够,还要知道如何配置、如何远程连接Linux电脑、如何与Linux电脑互传文件、如何在主机上阅读Linux电脑中的代码,等等。

  1. 基本操作

众所周知,Linux很少或几乎没有界面,所有的操作几乎都可以通过命令行来完成。对于运维人员来说,需要掌握相当大量的Linux命令。而对于应用、驱动方向的人员来说,只需掌握一些基本的常用的命令即可。对于这部分很多人建议看 「鸟哥的私房菜」 ,但我觉得这个更适合运维人员,我们无需掌握那么多命令。

  1. 系统编程

在学系统编程之前,一定要先学习Makefile,这会为后续的学习提高很大效率。之后的系统编程,主要有几大块:IO编程、进程、线程、进程间通讯(包括管道、信号、信号量、共享内存等)。这几部分学完了,基本也就差不多了。

  1. 网络编程

网络编程主要就是socket,poll,epoll,以及对TCP/IP的理解,同时要学会高并发式服务器的编写。

  1. 数据库编程

数据库的内容其实并不属于Linux,但在项目中经常要用到。这部分主要要学会数据库的基本操作,以及如何写一套接口去操作数据库。

  1. Shell编程

Shell是Linux下的脚本语言,功能虽然不如高级语言强大,但它可能做很多事,在某些场合甚至比高级语言要方便得多。当然除了Shell脚本,还有Python脚本。

Linux应用编程书籍推荐:

UNIX环境高级编程。简称APUE,号称程序员的圣经。它不是一本API字典,它还讲述了很多操作系统的细节,内存,文件系统等方面,是一本难得的好书。但是它起点有点高,不适合初学者。

Linux程序设计。如果觉得APUE有点难入门的话,可以选择此书进行入门。

Unix/Linux系统编程手册。这本书号称是一本超越APUE的书,它是一本比较新的书,里面新增了APUE所没有的Linux/Unix新特性。而且对于一些概念性的东西讲的确实比APUE好。但至于能否超载APUE,还有待历史的考验。

UNIX 网络编程。也是一本非常经典的书,主要是网络编程方向的。

MySQL必知必会。本书在Amazon上长期排在数据库销售榜首,建议想快速了解数据库原理和MySQL的新手阅读。快餐性质,简洁明快,小开本,而且很薄,比较好阅读。

Linux Shell脚本攻略。这本书很薄很精华,它追求的不是全,而是精,所以用它来入门再适合不过了。