linux基础
linux基础
操作系统基本概念
基本程序集合
### 两个主要目标
1. 与硬件交互,为包含在硬件平台上的所有底层可编程部分提供服务。
2. 为运行在计算机系统上的应用程序(即所谓用户程序)提供执行环境。
### 内核体系结构
宏内核的内部可被分为若干模块(或者是层次或其他)。但是在运行时 ,它是一个独立的二进制大映像。模块间的通信 不是通过消息传递,而是通过直接调用 其他模块中的函数来实现的。
宏内核和微内核最大的差别在于,微内核仅在内核中完成调度之类操作系统的最基本的功能,而宏内核则是倾向于将尽可能多的功能放在内核中实现。
为了达到微内核理论上的很多优点而又不影响性能,linux内核提供了模块(module) 。模块是一个目标文件,其代码可以再运行时连接到内核或从内核解除连接 。这种目标代码通常由一组函数组成,用来实现文件系统、驱动程序或其他内核上层功能。
微内核
### 优点
1-系统服务模块化,可移植性高;
2-内核安全性提高(模块内部的bug不影响内核稳定,将黑客利用软件漏洞造成的破坏限制在单个模块内部);
3-可以多套系统服务共存,相当于同时运行多种操作系统;
4-稳定统一的接口(可以独立维护私有驱动以及服务,不需要跟内核源码绑定);
5-在商业上,微内核可以避免代码受到一些开源协议的影响,比如GPL协议;
6-内核精简,可以进行形式化验证,利用数学证明内核的安全性;
7-数学可证明的实时性;
8-非常适合多处理器系统设计,在多处理器核心计算机上,互相依赖的系统服务可以同时运行;
### 缺点
1-通过进程通信的方式交换数据或者调用系统服务,而不是使用系统调用,造成额外的操作系统开销;
2-使用一些频繁使用的系统服务时,比如网络收发数据,造成的进程上下文切换对操作系统来说也是一个负担;
3-由于系统服务高度模块化,系统服务之间存在大量的内存复制;
4-对互相之间存在复杂调用关系的系统服务,难以设计通信接口;
5-系统服务与内核在地址空间上分离,造成代码局部性差,降低了cache命中率;
linux内核组成
Linux内核主要由五个子系统组成:进程调度(SCHED),内存管理(MM),虚拟文件系统(VFS),网络接口(NET),进程间通信(IPC)。
### 进程调度
由进程控制块、进程调度、中断处理、任务队列、定时器,bottom half队列、系统调用、进程通信等部分组成。
#### 阻塞态划分成
TASK_INTERRUPTIBLE 、 TASK_UNINTERRUPTIBLE 、 TASK_STOPPED 三种不同的状态。
#### 调度算法
FIFO HPF RR
#### 调度方式
主动式 被动式—用户抢占&内核抢占
#### 可重入
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误
保证函数的可重入性的方法:在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量),对于要使用的全局变量要加以保护(如采取关中断、信号量等方法),这样构成的函数就一定是一个可重入的函数。
### 内存管理
控制多个进程安全的共享内存区域
区分用户态&内核态
内核安全性高 效率高(不用在内存中复制)
系统调用
- 控制硬件 设置系统状态或读取内核数据 进程管理
- 符合POSIX标准
驱动编程属于内核编程
### 虚拟文件系统
虚拟文件系统(VirtualFileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

#### 关于文件系统的三个易混淆的概念:
- 创建:以某种方式格式化磁盘的过程就是在其之上建立一个文件系统的过程。创建文现系统时,会在磁盘的特定位置写入关于该文件系统的控制信息。
- 注册:向内核报到,声明自己能被内核支持。一般在编译内核的时侯注册;也可以加载模块的方式手动注册。注册过程实际上是将表示各实际文件系统的数据结构struct file_system_type 实例化。
- 安装:也就是我们熟悉的mount操作,将文件系统加入到Linux的根文件系统的目录树结构上;这样文件系统才能被访问。
#### VFS数据结构:
VFS依靠四个主要的数据结构和一些辅助的数据结构来描述其结构信息,这些数据结构表现得就像是对象;每个主要对象中都包含由操作函数表构成的操作对象,这些操作对象描述了内核针对这几个主要的对象可以进行的操作。
- 超级块对象
- 索引节点对象
- 目录项对象
- 文件对象

#### 跨文件系统的文件操作的基本原理
到此,我们也就能够解释在Linux中为什么能够跨文件系统地操作文件了。举个例子,将vfat格式的磁盘上的一个文件a.txt拷贝到ext3格式的磁盘上,命名为b.txt。这包含两个过程,对a.txt进行读操作,对b.txt进行写操作。读写操作前,需要先打开文件。由前面的分析可知,打开文件时,VFS会知道该文件对应的文件系统格式,以后操作该文件时,VFS会调用其对应的实际文件系统的操作方法。所以,VFS调用vfat的读文件方法将a.txt的数据读入内存;在将a.txt在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。
### 网络接口
网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。
网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
### 进程间通信
#### 通信方式
1. 管道与命名管道
2. SystemV IPC
信号量
消息队列
共享内存
驱动开发
### 模块
大部分现代操作系统内核可以动态地加载和卸载部分内核代码(如设备驱动程序就是一个典型),通常把这种结构叫做模块(module)。
- 可在运行时添加到内核中的代码被称为“模块”。
- 模块本身不被编译入内核映像,从而控制了内核的大小。
- 块一旦被加载,它就和内核中的其他部分完全一样。
#### 模块化方法
1. 模块化方法
因为任何模块都可以在运行时被链接和解除链接,因此,系统程序员必须提出明确定义的软件接口以访问由模块处理的数据结构,这使得开发新模块变得容易 ;
2. 平台无关性
即使模块依赖于某些特殊的硬件特点,但它不依赖于某个固定的硬件平台 ;
3. 节省内存使用
当需要模块功能时,把它链接到正在运行的内核中 ,否则,将该模块解除链接;
4. 无性能损失
模块的目标代码一旦被链接到内核,起作用与静态链接的内核代码完全等价 ;
#### 组成部分
1. 模块加载函数(必须)
2. 模块卸载函数(必须)
3. 模块许可证声明(必须)
#### 模块加载
1. 直接编译进Linux内核,随Linux启动时加载;
2. 编译成一个可加载模块,使用insmod加载,使用rmmod删除;
其他
### 软链接&硬链接
- 软链接是另一个文件,作用可以理解为一个指针,作用在这个文件上的操作除了删除都直接转向实际指向文件,由于是一个真实的文件所以占用磁盘空间。
- 硬链接可以认为不是一个文件,它只是实际文件的一个别名,它的作用是防止真实文件被误操作,给一个文件建立硬链接后,他们互为别名,删除其中任意一个,只会删除该别名,实际文件并不会被删除。由于只是别名没有任何其他信息,所以并不占用原始文件大小的磁盘空间。
### 常用操作
#### vim
#### make
make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。
⚠️命令前面需要敲入tab键,而不是空格
#### find&grep

浙公网安备 33010602011771号