码迷,mamicode.com
首页 > 其他好文 > 详细

操作系统基础

时间:2019-08-01 00:23:22      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:时间流   工程师   kde   兼容   虚拟机   包括   jobs   debian   假设   

RHCE:(基础)
RH033
RH133
RH253
RHCA:
RH401
RH423(LDAP)
RH442
RH436
RHS333
MySQL
RH436:
NoSQL:非关系型数据库。
岗位:
运维工程师:
系统工程师:
系统架构师:
DBA:数据库管理员。
VMware Workstation(模拟器)
计算机本身就是一个虚拟机,操作系统就是一个虚拟机,跟人一样,我们计算机只有一颗CPU在某一时候像人一样只能想一件事情,它也只能运行一个程序,为什么我们现在可以运行多个程序,运行起来的程序叫进程,为什么可以同时运行多个进程,这种同时只是我们看起来的同时,在背后事实是操作系统将我们的硬件虚拟化之后分配给多个不同进程来实现的,所以操作系统本身就是虚拟机,那也就意味着将我们有限的硬件资源给它分成多份,能够运行模拟出来多个独立运行的系统的。
VMware(模拟器)完全通过软件方式在原有计算机上模拟出来虚拟假的计算机环境,它里面什么都有,CPU、内存等等,但是有些是软件实现的,有些是用硬件资源。
rhci-5.8-1:镜像引导文件
虚拟机重启:Ctrl+Alt+Insert
电脑启动过程:
POST:加电自检。
程序:由指令和数据组成,指令和数据必须要载入内存以后才能实现的。
CPU只有加载指令以后才能执行。
指令在什么地方存储:
外存:光盘、U盘、软盘、硬盘。
自举:借助额外设备BIOS。
计算机体系结构:
运算器:数学运算器,只能加减和逻辑运算,运算器负责运算。
控制器:控制器负责运算器到哪去取数据。
存储器:存储器负责存储数据,存储器指的是内存,内存是个编址存储设备,每一个存储单元是8位,一个字节,每一个字节都是有地址的,内存里面有很多的存储单元,怎么去让每一个存储单元独立引用它的标识,这个标识就叫做地址,这种标识是平面编址的,内存上的每个存储单元在全局上有唯一的地址,这个地址如何去编,它们都使用数据的方式进行引用。
输入设备:
输出设备:
运算器和控制器合起来称为CPU。
BIOS:

计算机最基础的设备加法器。
一个加法器只能加一位,每个加法器只能对应移位相加。
加法器输入数据在什么地方,运算器从哪去找它的加数和被加数,要想实现两个数相加它是吧电路和逻辑学结合在一起完成的,用电路的闭合开关来完成计算机的逻辑运算,而后把逻辑运算转换为所谓的算术运算。
存储器:可以存储很多数据。
程序是由指令和数据组成,指令会告诉CPU在存储器的那个存储单元当中放的是加数,那个放的是被加数。
控制器:需要接受控制指令。
运算器要想运算数据,需要去读取指令,这个指令会告诉运算器我们读取的加数在什么地方,由控制器协调去到存储器的某一个存储单元里面把数据读取到运算器上去,这就是控制器,控制器需要接受控制指令,运算器要想运算数据它必须要能取得数据,对于控制器而言获取控制指令的线路叫控制总线,控制器必须要告诉运算器到存储器的那个存储单元去读取数据,当读的时候这个线路要传输数据,叫数据纵向,控制器还需要读取指令,指令也在存储器当中,存储器放的不仅仅有数据还有指令,控制器读取指令叫控制纵向,控制器将指令读取出来,控制器会通知运算器到那个地方读数据,所有运算器读的数据,控制器会告诉运算器进行什么样的运算,所以运算器再做运算,运算后有了结果,结果放入存储器,放到存储器的什么位置由控制器指示,控制器会知道内存当中那一段空间是空着的,于是找一段空闲的存储空间,把数据存储到这个空间当中,这一切都是运算器、控制器、存储器之间完成。
存储器初始的时候是空的,什么都没有,因为内存是意失性设备,作为用户来讲仍然需要将我们执行的程序给它首先放到存储器里面,然后控制器和运算器才能读到数据,这就需要外围设备,一个外围设备辅助用户把指令和数据存到存储器,从而控制器可以在里面读指令了,把结果保存到存储器一断电所有数据就丢失了,这时候仍然需要把它保存到外置地方或通过显示器显示出来,显示器就是输出设备。
对于计算机核心只有三个运算器、控制器、存储器。
输入设备和输出设备是跟用户进行交互的,用户辅助计算机运行。
I/O设备:需要计算机跟外围设备设备打交道的叫输入输出设备,I表示INPUT,O表示OUTPUT。
线路复用:用一组线即传输加数也传输被加数指令等。
寄存器:能够将第一次输入的加数暂存下来,再接受被加数计算输出结果。
CPU当中最核心的组件:运算器、控制器、寄存器;
虚拟机是什么:虚拟机就是通过软件方式模拟出来的运算器、控制器、存储器。
加电自检如何完成:
CPU要想执行指令,这个指令必须在内存当中,而内存当中必须有一段指令事先放好了,我们才能执行,但计算机刚开机那一刻尚且不知道有不有键盘、显示器;它到底层那读入数据,由那输出数据,而内存又不能事先保存一段数据放在那,借助额外设备,那就是所谓的RAM设备。
RAM:随机访问存储器。
ROM:只读存储器,此前适用于这台计算机的一堆指令,这个指令能够映射到内存里面去。
硬盘即使输入又是输出设备,硬盘也是I/O设备。
poll:轮询机制。
interrupt:中断,硬件通知机制。
中断次数多CPU的性能下降。
前端总线:FSB,
北桥:离CPU比较近,CPU需要跟内存不停打交道,因此CPU和内存直接需要总线相连,而且中间需要一个控制器,所以北桥是高速总线控制器,需要大量数据传输的,需要工作在比较高的频率下,快速实现数据交换,北桥早起是连接内存的,而现在内存直接连接CPU,这样速度可能更快,而北桥只负责连接南桥,以及其他总线的控制。
南桥:离CPU比较远,南桥是低速总线,大量的I/O设备都在南桥上,南桥是连接各种外围I/O设备,例如硬盘、键盘鼠标、显示器等等;而这些设备通过南桥汇总以后通过同一根线连接到北桥,由北桥再转给CPU。通过在北桥上接固态硬盘完成快速磁盘I/O的。
频率:一次频率能够完成一次事件,这种事件可能是加数输入和被加数输入。
缓存:
CPU缓存:
一级缓存:比较慢,分为指令缓存和数据缓存。
二级缓存:比一级缓存要慢,但是比内存要快。
寄存器可以跟CPU一样的频率工作。
内存的数据先到二级缓存,然后再到一级缓存。
程序局部性原理:包括时间上的局部性和空间上的局部性,所谓时间上的局部性是我刚刚访问的数据过一会可能还会再访问,第一次访问,从内存放到二级再放入一级,第二次访问一级缓存直接就有了,空间局部性,如果访问一个数据离这个数据非常近的数据可能马上就会被访问到,所以载入一个数据把这个数据周围那些数据都统统一块载入进来,访问第一个数据挨着的数据已经放入到缓存里面,不用再到内存里面找。
程序移植:由于底层芯片的不同,而程序必须要依赖芯片才能工作的。
机器语言:二进制语言。
微码:汇编语言,用人类语言所能表示的单词。
编译器:必须要将汇编语言编译成机器语言。
汇编语言尽管人类容易识别,但跟硬件芯片的结合程度仍然是非常紧密的,所以这种语言也被称为低级语言。
高级语言:它本身需要先转换为汇编语言,而后再转换为对应芯片上的机器语言,要结合额外的机制来弥补多种芯片的不同。
API:应用编程接口,在不同CPU上使用汇编语言而写出来的具有相同功能的程序,这个程序本身不会自动运行,它只是向上层程序,告诉上层程序CPU你不用关心是什么,反正接口是这样子的,虚拟成这种样子,所以库是一种虚拟设备,它只不过像程序虚拟了相同类型的执行环境。
硬件架构:CPU芯片不同系列
ARM:移动硬件平台,英国公司,只生产知识产权,不生产设备,负责生产三星、高通等
X86:intel和AMD的X86系列,32位的平台。
X64:AMD的X86_64系列。
安腾:intel的CPU,原来属于惠普。
alpha:惠普。
UltraSparc:san公司的,san被orgianic收购。
Power:IBM,第一个双核心、八核心、六十四核心的CPU,性能超强,第一个主频超过4GHZ的CPU。
M68000:M68K,摩托罗拉的CPU。
PowerPC:苹果、IBM、摩托罗拉三家联合生成比Power要差一点,但性能仍然很不错。
32位:并行32位。
64位:并行64位。
Android核心是Linux。
苹果的系统包括MACOS都是UNIX。
OS(操作系统):
Windows
Linux
Unix
HP-UX:惠普Linux。
Solaris:san公司的Linux。
AIX:IBM的Linux。
SCO UNIX
Unixware
OS/2
批处理:
job(作业):在计算机上运行一次完整的计算过程,多个叫jobs。
多任务:
将一个资源分成多个资源,计算机运行需要两个核心组件CPU、Memory。
CPU:
把CPU随着时间流逝而完成的,时间驱动的,因此就把CPU划分成了计算时间。
slice:CPU计算时间片,假如一个时间片5ms,运行第一个程序5ms,运行第二个程序5ms,这个时间不停进行交替。
内存切割:将内存分割,第一个程序访问前半段,第二个程序访问后半段。
内存分段机制:
虚拟地址空间:每一个程序员开发程序,不管有多少物理内存,假设你是32位系统4G内存,如果是64位系统大于4G内存。
每一个程序在它运行的时候它都有自己的虚拟地址空间,只要是32位系统都是4G内存,不管物理内存有多少,它都认为自己有4G内存。
进程:
多个程序运行方式:
CPU分成多个片,给第一个程序运行一次,给第二个程序运行一次,内存里面,第一个程序占据一半,第二个内存占据一半,操作系统协调程序占据内存的时间和顺序,操作系统也是软件运行在硬件之上负责管理硬件资源,而且将硬件资源所提供的计算能力CPU给它切割成多个片,分配给多个不同的程序,然后内存分成多个段分配给不同的程序,并且在它们之间完成协调,操作系统还负责完成程序的启动中止和回收等工作,还要完成程序的切换等工作,而这个时候不把它称之为程序,因为它是运行的实例称作进程,进程(process)就是一个处理过程,所以进程是有生命周期的,从启动到结束,而程序放到硬盘上只要不删一直都在,所以程序和进程是两码事,总而言之;操作系统就是一种通用软件,这种软件不负责完成具体的工作,它只是负责协调其它具体的程序工作。
问题:如果一个程序能在windows上运行它是不是就能在linux上运行;
库:是一堆的程序,任何程序都有自己的执行入口,库这种程序比较独特它没有执行入口,运行可以被其他程序调用执行,所以它自己不能独立执行,只能被其他程序调用执行,但是它在执行的时候可以提供统一的调用机制,它的调用接口是一样的,库只实现了调用接口,可以被程序所调用。
call:调用。
system call:操作系统接口,称为系统调用。
操作系统本身它是一种通用软件,这个软件装上去以后就将硬件本身所提供的计算能力使用软件的方式模拟出来,做了二次模拟,所以任何程序看到的不再是硬件本身,而是操作系统所提供的接口,操作系统这种功能接口为了能尽可能简化,它做的非常底层,操作系统的接口称为system call,称为系统调用,有了操作系统以后,任何程序都不能直接跟硬件打交道,要想使用硬件,必须要通过操作系统来进行协调,运行起来的程序的进程,要访问一个数据,数据在硬盘上,它就意味着要跟硬盘打交道,程序是不能直接跟硬件打交道,要通过内核来完成,内核中有一个功能,通过调用的方式输出出来叫系统调用,因此程序只需要向内核请求调用一下系统调用,而由内核负责将数据取出来再返回给这个程序进程,所以任何时候程序要跟硬件打交道都必须通过这个中间层,这个中间层叫做操作系统,操作系统的功能是通过system call来向外提供的,system call过于底层,所谓的底层将会由上层的程序员决定它的表现形式,它的应用机制,越底层它的机制变化越少,操作系统为了尽可能简化它的调用接口,所以做的都非常底层,有人将底层系统调用一个或者多个它的功能封装起来做成更高级的接口,这个高级接口就是库,因此很多程序员在开发程序的时候,是通过库来写,因为有些功能已经通过库封装好了,所以程序员负责调用别人所提供的功能然后去开发程序这样一种过程,因此有了库以后,程序员是根据库来编程的,也就意味着,我们在Windows上调用Windows的提供的库来编程,而在Linux上使用Linux提供的库来编程,如果两个库不一样的话,结果就是Windows开发的程序在Linux上运行不了,只要两边的库一样,似乎就可以。
总结:操作系统组成
最底层硬件,硬件上面是操作系统,操作系统通过系统调用将我们的功能输出出来,再向上一层是库,在库上面就是各个独立的应用,假如现在硬件、操作系统、库、应用都好了,如何让应用运行起来,还需要一个特殊的软件shell,shell就是把我们计算机的功能通过人类易于操作的方式输出一个接口,通过这个接口才能真正操作计算机,所以shell是人机交互接口,shell有图形化也有命令行的。

计算机本身就是一堆的硬件,这堆硬件当中最核心的就是CPU和存储器,为了能够实现计算机获得数据,实现数据的输入输出等等,还需要输入设备和输出设备两种,但是对于计算机系统来讲核心只是运算器控制器,也就是所谓的CPU,还有存储设备,在计算机体系内部一般来讲我们的输入输出设备是通过南桥来接入当前系统上的,彼此之间有各种总线,比如说内存到CPU的,我们可以称为内存总线,或者叫系统总线,而各种不同的外围设备,无论是键盘数据等等,它们每一种不同的接口需要实现的物理总线类型也是各不相同的,但无论如何,假如就是一个简单的PC机而已,在某一时刻只能运行一个程序,但是计算机的计算能力很强,一个程序所需要运行的程序内容占据CPU的时间可能不是特别的长,因此我们需要为了能够尽可能的利用计算机的计算能力,于是需要将计算机同时运行多个程序,因此每个程序在运行起来以后需要一个协调器,这个协调器称为Kernel(内核),操作系统的核心,内核本身就负责管理硬件资源,并切将硬件资源虚拟成其他样子,提供给上层所需要运行的应用程序,某一程序如果直接运行在硬件上,那这个程序本身就可以控制硬件的各种属性,其他程序要想再运行到硬件的时候,这些程序彼此之间可能会产生干扰,一个恶意的应用程序可能导致其他程序统统退出,所以我们需要一个统一的资源管理者,而且任何应用程序要想能够使用硬件,必须要通过内核来完成,而且内核也不会让程序直接访问硬件,他是通过将硬件所提供的运算能力通过一个一个叫做系统调用来实现的,系统调用是一种非常底层的实现,因此程序员根据系统调用来编程,会非常麻烦,会非常繁琐,而且许多程序的功能是相同的,相同功能的程序如果不做成公用的话,就意味者由于系统调用非常底层,每个相同功能的程序都需要各自开发响应的功能模块,在我们计算机上大量的功能是重复的,这种重复势必会额外占用空间,所以从资源角度来讲它也不合理,因此上我们操作系统除了提供内核之外,通常还需要将内核所提供的系统调用输出出来,而这种输出是通过较比高层的调用接口来实现,这种接口叫库,对于库本身也是一堆应用程序,只不过这堆应用程序没有执行的入口,它是不能自我独立运行的,只能被其他程序调用的时候才能执行,这就是我们把它称作库的原因,库存在的环境就是被调用,因此我们的调用不仅仅调用内核所提供的功能,还有库所提供的功能,如果一个程序员在编程的时候不使用库,直接在内核上进行编程,是可以的,只不过比较麻烦而已,所以调用除了系统调用还有库调用,库本身对于一个操作系统而言,或对于一个内核而言叫做API(应用编程接口),应用编程接口它也是程序,随意对windows而言对linux而言设置unix而言,每一个不同的系统它的程序员在开发库的时候所实现的功能以及内部实现细节可能是各不相同的,这也就意味者,如果某个人利用windows库调用进行编程,那么这个程序拿到linux上未必能运行,因为它们的库不一样,当然库的内部实现细节不一样,但是它的调用接口是一样的,这个程序可以运行,在库的上层就是各个应用程序,这些应用程序很可能直接运行在系统调用上,也有可能是通过库调用来完成,使用库调用编程可能会更简单,但是如何使用内核调用它的执行效率可能会更高,因为至少不会通过库来完成了,而且它所获得的操作权限也比较大,因此一些高级的***们,它们可能会直接使用库调用来实现编程,甚至直接利用硬件特性编程,无论有多少个应用程序,这些程序在操作系统启动起来以后,这些程序未必会运行起来,只不过说操作系统已启动,意味着这些程序已经具备了运行条件,或者说已经有了运行环境,但是它并没有运行,什么时候运行,通常我们启动程序的方式可能有多种,比如说,我们让操作系统已启动之后,这个程序就自动能够启动起来,这些进程是随系统的启动而启动的,这些进程有些叫做服务,因为操作系统自身为了完整的能力,或者为了完整的操作系统,必须要启动起来,才能让系统完整的提供一个基本的功能,这种称为后台服务,而且随系统自动启动的,但也有一些是我们按需启动的额,比如我们希望编辑一个word文档的时候,我们才有必要启动word,如果开机word就自动启动是没有任何意义的,所以有时候我们需要手动启动,而这种程序我们通常叫做交互式程序,因为它本身就是一个编辑器,需用用户不停的编辑一些内容,所以交换式程序需要跟用户进行交互的,而用户来讲我们使用计算机就是输入设备和输出设备;输入设备键盘、鼠标,输出设备显示器等等,现在问题就是,我们敲下键盘之后,信息一定是由CPU先接收的,通过中断先到达CPU,那CPU发现敲下键盘以后它怎么知道是那个程序,当我们敲下键盘之后,这些信息首先到达CPU,CPU并不知道敲键盘这个信息意味着什么,我们必须要把键盘上的键解析为对应的应用程序所能理解的功能,能够跟硬件交换的只有内核,所以CPU在获得这个信息以后他是首先通知内核来进行处理的,而不是说直接交给word,所以内核必须要在CPU上能够运行起来,并且接着去处理这么个信号,内核会知道这个进程是由那个程序所发起来的,因为整个系统资源的监控包括上层程序所运行应用程序的监控都是由内核来完成的,所以内核知道到底是由那个进程处于当前焦点进程而负责接收这样一个信号,因此由内核再转交给应用程序,操作系统本身,它也是一个程序,它也需要运行起来,它要运行就需要指令和数据,而指令和数据是放在存储器当中,那就意味着载我们存储器当中即有内核还有其他的应用程序,如果说一个恶意的应用程序能够直接访问内核的话,能够跟内核直接交换,能够直接修改内核中某些数据,这就意味着,系统的稳定性将无从得到保证,所以我们必有一种机制能够将应用程序和内核隔离开来,通常情况下,比如像inter这一类的平台上,他会提供所谓的保护机制,或者叫保护模式,一般我们的CPU有四个级别,是同心园的四个环,最内存叫0级别,或叫第0环,而0环也称为特权级别,只有内核才能运行在特权模式下,而其他应用程序只能运行在最外层级别,中间两层没用,所以任何时候应用程序是不能访问内存当中处于0级别的内存区域的,CPU和内存之间是紧密结合的,所以CPU的0级别它会映射到内存的某一段处于保护空间当中,在内存当中,当我们程序运行起来以后,它是分为两段的,事实上是三段,最底层一段叫BIOS的映射程序,计算机加电自检以后,BIOS就自动映射到内存的开端之处,所以系统能够运行起来,能够完成加电自检的,而自检完成以后,接下来就要载入我们的操作系统,说白了载入操作系统内核,因此在我们的BIOS之后这一段是运行内核空间,而后的空间是被多个应用程序彼此之间共享的,因此这一段可能运行的是程序1、程序2、程序3等等,但是这样有一个问题,这样只是为了方便理解,事实上这样划分内存是很容易出现内存碎片的,如果一个程序刚开始启动的时候需要2M内存,系统给它2M,过一会它又需要2M,因为它运行过程中需要加载一些其他数据,这就意味着,在程序1、程序2、程序3之后的剩余内存空间重新再申请2M空间,而且这段空间已经不连续了,过一会程序3退出了,程序2退出了,程序1分别两次申请的2M内存直接不能连续,所以成为碎片,所以内存管理显然不能是这种简单的机制,这就意味着操作系统是一个非常复杂的东西,它需要管理的任务,需要管理的功能,也是非常复杂的,我们启动应用程序的方式有两种,一种是让它在后台自动自动,还有一种是按需进行启动,但是我们要按需启动的话,怎么能够指挥计算机能够启动某个程序,怎么让操作系统内核接受用户的命令,我们必须要给我们的操作系统,包括它所提供的各种应用程序提供一个特殊的应用程序叫做shell,shell被称作壳,它是整个操作系统的外壳,是能够实现接受用户指令,理解用户命令,并且将它传输给内核,由内核指挥着某个应用程序启动的interface(界面),shell本身用来,首先要提供一个用户能够跟它交换的界面,其次还要将用户的指挥行为翻译成内核可以理解的命令,shell包含两种类型,一种叫图形界面的shell,一种叫命令行的shell,图形用户界面GUI和命令行用户界面CLI也是应用程序,无论是CUI还是CLI在不同的操作系统上可能有不同替换的版本,在GUI和CLI接口下所启动的任何应用程序,一旦把应用程序关闭,在这个接口下所启动的应用程序也将会关闭的,我们通过交互式接口启动的程序它跟这个交互式接口有着紧密的关系,这就是操作系统的组成。

system call:系统调用。
library call:库调用,简称为lib原因。
API:Application Program interface应用编程接口。
kernel space:内核空间。
碎片:
shell:壳。
shell包含两种类型:
GUI:一种叫图形界面的shell,图形用户界面。
CLI:command line interface一种叫命令行的shell。
Linux常见三种图形界面:
1.gnome
2.KDE
3.xface
内核的功能:
1.进程管理
2.内存管理
3.文件系统
4.网络功能
5.硬件驱动
6.安全机制
批处理系统:是现代操作系统的前身。
jobs1$$$$$$$$jobs2$$$$$$$$
GE(通用电气),BELL(贝尔实验室),MIT(麻省理工大学智能实验室)三大公司研发比批处理系统功能要大的多,多任务、多用户的系统,功能很复杂技术很先进,当时使用汇编语言研发。
MainFrame:大型机,体积庞大。
汇编语言:
Multics:开发的系统名。
Ken(人名)
Space Travel(游戏)为MainFrame研发。
DEC:数字设备公司,生产小型机,中型机小型机。
PDP-11
VAX --> vms
Unics --> Unix汇编语言开发,性能不错,移植麻烦。
B -->C:B语言,脚本语言,引入静态变量,指针变为编译型语言C语言。
Bill Joy:BSRG研究小组,修复Unix的BUG,开发驱动。
BSD:Berkeley System Distribution
CP/M -->DOS(磁盘操作系统)
Microsoft,Xenix
jobs(乔布森)
Xerox:复印件
PARK
FreeBSD:运行在PC机的Unix
OpenBSD:安全
NetBSD:服务
苹果系统内核FreeBSD内核。
Sum MicroSystem
Sun OS --> Solaris
CSH:兼容C语言的shell。
Windows NT Server内核是VMS
Andrew(人名):Minix
Linus:Linux
Stallman(人名),Freedom
GNU:GNU is Not Unix
GPL:General Public License通用公共许可证
LGPL:Lesser
GPLv2
GPLv3
BSD
Apache
Open Source开源:开放源代码
自由:自由获取,自由修改,自由学习
Emacs:文本编辑器
gcc:GNU C Complier编译器
bash:命令行界面
Linux:glibc,gcc,
GNU/Linux
源代码:C开发的程序,编译成二进制(交叉编译)
ABI:Application Binary Interface应用二进制接口
Linux的发行商
RedHat,rpm
SLS
Debian,dpt不受商业公司支持,技术最先进,最难用。
SUSE -->Novell (Netware),OpenSUSE
CentOS:Community Enterprise OS社区版红帽
Fedora:
Mandriva
Ubuntu:Mint
Linux:内核版本0.1, 1.0, 2.0, 2.2, 2.4, 2.6, 3.0
Linux内核网站: www.kernel.org
RHEL 3.0, 4.0, 5.0, 6.0发行版版本
Android:核心也是Linux,只不过Android是JAVA程序,他是运行在Linux上的JAVA虚拟机上的JAVA程序。
安装Linux:
boot:linux ip=172.16.x.1 networkmask=255.255.0.0 gateway=172.16.0.1 dns=172.16.0.1 ks=http://172.16.0.1/class.cfg

操作系统基础

标签:时间流   工程师   kde   兼容   虚拟机   包括   jobs   debian   假设   

原文地址:https://blog.51cto.com/smoke520/2425426

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!