操作系统重要组成部分

Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
一.Linux内核内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。Linux内核的模块分为以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等。
二.Linux shellshell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。
三.Linux文件系统文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660。
四.Linux应用程序标准的Linux系统一般都有一套都有称为应用程序的程序集,它包括文本编辑器、编程语言、XWindow、办公套件、Internet工具和数据库等。

参考:https://blog.csdn.net/perfectguyipeng/article/details/76794552

**程序员的三大浪漫:编译器,图形学和操作系统。**其中最容易的就是操作系统,但也是进化得最慢的。为什么?操作系统归根结底解决的是对资源的管理和调度问题,对于资源管理的设计是整个操作系统实现的核心。
如果单说照着教程实现一个类似unix的kernel,在这个教程随处可找的时代,一个合格的高年级本科生就是可以完成。但是仅此而已真的算是写出了操作系统了么?不,还需要上层的库函数和相关的应用才能算真正可以用的操作系统。如果你说,我只要实现一个posix兼容的api就可以跑大部分的应用了,那么我问你,你的实现和linux有什么本质区别,优化的又怎么样,跨平台能力又怎么样,都是用unix-like,为什么我要用你的而不用一个广泛使用的系统?
所以实现一个全新的操作系统的本质在于,是否能有一个全新的设计来解决现在甚至将来的问题。这不仅是中国能不能写出一个操作系统的问题,而是全世界有没有一个新的设计的问题。linux并不是万能的,linux对于现在面临的很多问题都是用一种dirty hack的方式解决的,比如多核CPU的支持,NUMA支持,比如如何实现高速的IPC,如何保证内核的稳定,还有分布式计算,异构计算等等。这些问题在平头老百姓的笔记本、手机里根本不是什么大问题,因为一般用户根本遇不到这些极端case。但是对于data center、超算、iot等等领域,这些就是很大的问题了。

写操作系统,觉得好处大概有以下一些吧

  1. 了解内存的组织结构。真正动手写操作对了解内存的结构非常有好处,通过编写大量直接对内存操作的汇编代码,可以真正了解计算机的内存的组织结构。我之前也有看过CSAPP,也上过计算机组成原理课,但是觉得都比不上写操作系统对内存的组织认知得深,能够真正明白到所谓的可运行代码和数据是怎么样在内存中放置的,如何从最底层控制内存资源,一些现代编程语言的设计的核心原理是什么。
  2. 学习如何构建大型软件。操作系统本身是一个非常非常庞大的软件,而且在构建的过程中还涉及到了多种不同编程语言的交叉编译,是一个非常好的软件工程实践。从中可以学习到如何构建一套完整有效的工具链,便于编译和调试,特别是操作系统本身的开发是很灵活的,如何选用恰当的工具,是用nasm+gcc+ld,还是用tasm+tcc,调试的虚拟机是用bochs还是别的什么工具,都是可以根据自己的需要来选择的。同时操作系统的构建也是极其复杂的一个过程,如何通过不断的迭代来不断构建完善的操作系统模型也是非常有趣的实践。
  3. 学习如何参考相关资料。操作系统还有一个非常有趣的特点在于在操作系统这一个门类下面有大量不同的实现,并且从计算机诞生不久就出现了操作系统,因此网络上有大量可以参考的资料,如何从这些大量的资料中搜寻到适合自己实现的,本身就是一个值得学习的地方。同时操作系统在编译过程中可能遇到的问题也是非常多,在网络上搜寻资料来解决这些问题本身就是学习的过程。
  4. 学习如何与硬件进行底层交互。在上计算机组成原理课的时候有时候也会涉及到一些芯片的使用,但是在操作系统的最底层开发中却是无时无刻不需要和硬件进行交互的,特别是在保护模式下进行开发,所有的硬件设备都需要自己来进行处理,在这个过程中能够学习到的内容实在是太多了。比如在键盘上按下一个按键再显示到屏幕上的过程,对于最上层的C++抽象来说可能就是读取一个输入流的事情,但是对于底层来说,首先涉及到了键盘中断的处理,键盘码表的映射,键盘缓冲区的管理,输入流的管理,写显存这一系列复杂的过程。如何才能把这一个个子过程封装,最终展现给上层抽象一个可用的接口,是一个非常值得学习,对于真心热爱这门学科的程序员来说也是非常有趣的过程。
  5. 深入了解文件系统和进程的概念。(答主还没写到这部分,写到更)总得来说学习写操作系统实话实说是一个非常非常纠结而又痛苦的过程,特别是绕在汇编里面走不出来,调试又调试不清的时候,真的非常挠头,但是当你调试出一个运行良好的子过程的时候,当你按下一个按钮屏幕上真的显示出一个字符的时候,那种开心到要跳来跳去的感觉确实是特别特别棒的。

猜你喜欢

转载自blog.csdn.net/longlc123/article/details/82887729