Linux复习资料20版.docx

上传人:b****6 文档编号:5835910 上传时间:2023-01-01 格式:DOCX 页数:15 大小:36.39KB
下载 相关 举报
Linux复习资料20版.docx_第1页
第1页 / 共15页
Linux复习资料20版.docx_第2页
第2页 / 共15页
Linux复习资料20版.docx_第3页
第3页 / 共15页
Linux复习资料20版.docx_第4页
第4页 / 共15页
Linux复习资料20版.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Linux复习资料20版.docx

《Linux复习资料20版.docx》由会员分享,可在线阅读,更多相关《Linux复习资料20版.docx(15页珍藏版)》请在冰豆网上搜索。

Linux复习资料20版.docx

Linux复习资料20版

Linux期末复习资料

目录

Linux期末复习资料1

一、Linux基本概念2

二、IA架构2

(一)保护模式2

(二)中断与异常4

三、进程与进程调度4

四、系统调用5

(一)系统调用流程的描述重点5

(二)两种系统调用方式5

(三)系统调用表5

五、内核同步技术5

六、VFS虚拟文件系统7

七、设备管理8

八、访问控制9

(一)传统访问控制重点9

(二)Ext2文件标记属性10

(三)访问控制10

九、链接与可执行文件重点11

一、Linux基本概念

由于基本概念比较无聊而且很占篇幅,所以就不在这里粘了,考试时候可以直接到ppt里面找。

1、Unix

参考ch1.1Linux.ppt第4页

2、GNU

参考ch1.1Linux.ppt第6页

3、GPL

参考ch1.1Linux.ppt第7页

4、Posix

参考ch1.1Linux.ppt第8页(Posix的意义在该页ppt下面的备注里),第9页的第3点

5、Minix

参考ch1.1Linux.ppt第5页

二、IA架构

(一)保护模式

1、相对于实模式的功能扩充:

(1)全部32条地址线有效,可寻址高达4G字节的物理地址空间

(2)扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持

(3)支持多任务,能够快速地进行任务切换和保护任务环境

(4)四个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离

(5)支持虚拟8086方式,便于执行8086程序

2、保护模式下的内存寻址:

段式:

(1)什么是段描述符:

在保护方式下,每个段由如下三个参数进行定义:

段基地址(BaseAddress):

在80386保护方式下,段基地址长32位

段界限(Limit):

段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。

段属性(Attributes)

这三个参数组成一个数据结构,就称为段描述符

(2)段式存储如何保护数据?

段式存储通过段描述符中的DPL位来实现数据的保护。

DPL即描述符特权级别,当DPL为0时,只能当CPL也为0时该段才能被访问;DPL为3时,则可被任何CPL值访问。

(3)GDT(globaldescriptortable)即全局段描述符表,可理解为由段描述符组成的数组,而GDTR(globaldescriptortableregister)就是用以存放全局段描述符表地址的寄存器。

(4)保护模式段式寻址方式:

相信实模式下的寻址大家都很熟悉了,就是以前学过的DS:

IP格式,DS×16+IP即为物理地址,但保护模式与实模式不同,保护模式下,DS中存放的不是段基址,而是段选择符(段选择符格式参考ch2.1IA32基础_1.ppt第29页),段选择符中的第0位和第1位表示的是特权级别,权限从11到00递增,而第2位最为重要,它表示需要的段描述符存放在哪个寄存器,如果为0则段描述符在GDTR(全局描述符表寄存器)中,如果为1则存放在LDTR(局部描述符表寄存器)中,再根据DS中后面的13位定为到GDTR或LDTR中所保存的指定段描述符,段描述符中就包含了段基址信息,利用这个段基址×16+IP就得到了一个32位线性地址,在段式寻址方式下,这个32位线性地址就是最终的物理地址。

整个过程归纳如下:

从DS中取出段选择符

根据段选择符的第2位判断段描述符所在的寄存器

根据段选择符的后面13位,在段相应寄存器内找到段描述符

根据这个段描述符找到段基址

将段基址×16+IP即可得到一个32位线性地址

对于段式来讲,这个线性地址即为实际数据的物理地址,寻址完成

段页式:

(1)逻辑地址:

程序编译后得到的二维虚拟地址

(2)线性地址:

逻辑地址级过段式管理得到的地址

(3)物理地址:

放到地址总线上的地址

(4)保护模式段页式寻址方式:

重点

其实段页式寻址方式的前半部分与段式一样,都是从DS中确定寄存器,再从寄存器中找到段描述符,再找到段基址,加上IP就得到了32为线性地址,只不过在段页式中,这个线性地址并不是实际物理地址,而是一个虚拟地址,这个虚拟地址还需要经过页式存储的转换才能得到实际物理地址。

在得到了32为线性地址之后,我们将这32位的虚拟地址拆分为三个部分,第一部分有10位,保存的是页目录表中的偏移量,这时,调出CR3寄存器中保存的页目录表基址,加上这个10位的偏移量即可得到页表首地址,这时再取出32位虚拟地址中的第二部分(也是10位)作为页表偏移量,将这个偏移量与页表首地址相加即可得到页基址,这时再将32位虚拟地址的最后12位取出作为页内偏移地址,与页基址相加即可得到想要的数据(参考ch2.1IA32基础_1.ppt第34页-第36页)。

整个过程归纳如下:

从DS中取出段选择符

根据段选择符的第2位判断段描述符所在的寄存器

根据段选择符的后面13位,在段相应寄存器内找到段描述符

根据这个段描述符找到段基址

将段基址×16+IP即可得到一个32位线性地址

将这32位线性地址划分为三个部分,分别为10位(页目录表偏移量)、10位(页表偏移量)和12位(页内偏移量)

从CR3寄存器中取出系统保存好的页目录表基址,与第一个10位(页目录表偏移量)相加,得到页表基址。

将页表基址与第二个10位(页表偏移量)相加,得到页基址

将页基址与第三个12位(页内偏移量)相加,得到数据首地址

完成寻址

3、“保护”的含义

(1)特权指令的定义:

特权指令是指保护方式下只有CPL(当前特权级)=0时,才可执行的指令。

如果CPL不等于0而执行它们,那么会引起通用保护异常。

(2)I/O保护

保护模式下,通过“I/O特权级IOPL位”和“I/O许可位图”实现I/O保护。

只有当CPL(当前特权级)≤IOPL(IO特权级)或者I/O许可位图允许时,I/O敏感指令才会被允许执行。

I/O许可位图由二进制位串组成。

位串中的每一位依次对应一个I/O地址,位串的第0位对应I/O地址0,位串的第n位对应I/O地址n。

如果位串中的第m位为0,那么对应的I/O地址m可以由在任何特权级执行的程序访问;如果第m位为1,则对应的I/O地址m只能由在IOPL特权级或更内层特权级执行的程序访问。

如果在I/O外层特权级执行的程序访问位串中位值为1的位所对应的I/O地址,那么将引起通用保护异常。

参考ch2.1IA32基础_1.ppt第55页-第56页。

(二)中断与异常

1、中断的概念

程序执行过程中的强制性转移,到相应的处理程序,是软件或者硬件发生了某种情形而通知处理器行为。

分为硬中断(由硬件中断控制器产生的中断,分为可屏蔽中断和不可屏蔽中断)、异常(程序执行中出现的故障,分为故障、终止和陷阱)、软中断(程序主动产生的异常,在执行当前指令后发生.主要指程序指令int产生的异常)。

2、Intel的中断解决方案

在实模式下,使用中断描述符表来提供中断服务入口,而保护模式下则使用IDT(中断描述符表)来提供中断服务入口。

(1)IDT中断描述符表

所谓IDT即中断描述符表,它的作用是将每个异常或中断向量与它们的处理程序入口地址联系起来,IDT由表描述符组成,而且表中最多有256项(0-255)

(2)中断处理流程重点

这里类似于保护模式下的寻址方式,细节部分不再赘述:

根据所需的中断号从IDT(中断描述符表)中取出所需中断服务入口的虚拟地址

经过GDT的转换得到段描述符,将段描述符中的DPL与CPL、RPL相比较,并将段描述符中的段长度与IP偏移地址相比较,如果通过越权检查和越界检查,则得到了线性地址

对于段式存储,线性地址即为实际物理地址,若是段页式存储,则还要进行页式地址转换,最终得到终端服务程序的实际物理入口地址,进入中断

中断服务结束后,通过iret指令返回,退出中断

三、进程与进程调度

1、进程的概念

进程的概念主要有两点:

第一,进程是一个实体。

每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。

文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

第二,进程是一个“执行中的程序”。

程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

2、PCB的组成

该部分内容较多,详细内容在ch4.1进程调度.ppt里第7页-第22页。

3、线程与内核线程

(1)线程

Linux内核并不严格区分线程与进程,都使用task_struct描述,共享特定资源的进程,即可理解为线程。

(2)内核线程

特点:

仅在内核空间运行的线程

没有自己的独立内存空间(PCB的task_struct.mm=NULL)

用来执行内核的特定维护任务(软中断页面同步)

四、系统调用

(一)系统调用流程的描述重点

1、应用程序员调用封装了系统调用的API

2、封装程序设置好参数,触发系统调用处理机制,将系统调用号压入EAX寄存器

3、通过IDTR(中断描述符表寄存器)调出IDT(中断描述符表),并根据设置好的参数,从IDT(中断描述符表)中获得相应中断服务程序的逻辑入口地址

4、通过GDTR(全局段描述符表)调出GDT(全局段描述符表),得到段描述符,再将CPL、RPL和DPL相比较,判断权限级别;通过后审查后再根据段式或段页式的寻址转换得到中断服务程序的物理地址

5、执行中断服务程序,进入系统内核态

6、调出系统调用表(arch/i386/kernel/syscall_table.S),并根据EAX寄存器中的内容(即系统调用号)找到相应系统调用服务程序的入口地址,再通过类似上述的转换与审查,得到系统调用的物理地址,执行系统调用

7、系统调用服务程序完成用户请求的服务

8、通过iret指令把返回值带到用户空间,返回用户态

参考ch5系统调用.ppt第8页。

(二)两种系统调用方式

1、通过软中断进入内核态(保存在中断描述符表中)

2、通过sysenter指令进入内核态(保存在sysenter相关寄存器中)

详见ch5系统调用.ppt第11页-第25页

(三)系统调用表

系统调用表定义于arch/i386/kernel/syscall_table.S,映射系统调用号与系统调用服务程序的对映关系

五、内核同步技术

1、SpinLock自旋锁

自旋锁是针对多CPU环境而设置的,进程或线程请求资源时,如果资源已被自旋锁锁住,则进程循环等待,直到自旋锁被释放而不必被挂起。

在spinlock保护的临界区中禁止线程切换。

自旋锁适用于较短时间的等待,中断的上下文切换和进程的上下文切换。

暂定这部分内容具体该怎么写我也没弄清楚,等晚上再改吧

具体内容和知识理解参考教材第109页-第112页

2、读写自旋锁

读写自旋锁是对普通自旋锁有针对性的细化,是Linux专门针对读写问题所设计的自旋锁。

关于考试中的程序填空,实在是不知道该怎么说才好,但大体上应该是主要让大家填写何时获得锁,获得哪个锁,以及何时释放锁,释放哪个锁,代码的格式大致如下:

spinlock_tmr_rwlock=SPIN_LOCK_UNLOCKED;

//在读者的阅读代码中:

{

read_lock(&mr_rwlock);

读者临界区代码

read_unlock(&mr_rwlock);

}

//在写者的写操作代码中:

{

write_lock(&mr_rwlock);

写者临界区代码

write_unlock(&mr_rwlock);(书上写的是&mr_lock,不过我觉得它应该是打印错了)

}

具体内容和知识理解参考教材第112页-第113页

3、semaphore信号量

如果进程所请求的资源信号量为负数,则说明资源不可用,并自动挂起,等待信号量的释放。

当信号量释放时,系统到阻塞队列中挑选一个等待进程获取信号量。

信号量适用于长时间等待,可进行进程的上下文切换。

暂定这部分内容具体该怎么写我也没弄清楚,等晚上再改吧

具体内容和知识理解参考教材第114页-第116页

4、读写信号量

读写信号量是对普通信号量有针对性的细化,是Linux专门针对读写问题所设计的信号量。

代码格式如下:

staticDECLARE_RWSEM(mr_rwsem);

//在读者的阅读代码中:

{

down_read(&mr_rwsem);

读者临界区代码

up_read(&mr_rwsem);

}

//在写者的写操作代码中:

{

down_write(&mr_rwsem);

写者临界区代码

up_write(&mr_rwsem);

}

具体内容和知识理解参考教材第117页

六、VFS虚拟文件系统

1、基本概念

虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心以及系统中运行的其他进程看来,都是相同的。

严格说来,VFS并不是一种实际的文件系统。

它只存在于内存中,不存在于任何外存空间。

VFS在系统启动时建立,在系统关闭时消亡。

虚拟文件系统所隐含的主要思想在于引入了一个通用的文件模型,这个模型能够表示所有支持的文件系统。

从本质上讲,通用文件模型就是用指针代替硬编码来实现诸如read(..)、write(..)、open(..)之类的操作。

当用户调用一个open操作时,内核根据用户的操作对象,选择不同的open实现。

2、重要结构

(1)superblock超级块

对应硬盘结构:

superblock是磁盘上的某块信息在内存中的镜像,需要实时地与磁盘同步。

它保存了整个分区的描述信息:

空闲块、被占用块、数据区的起始位置等。

主要操作:

由file_system_type生成超级块;维护文件系统的描述信息;提供生成inode结构的方法

主要数据成员:

详见ch7文件系统.ppt的第20页-第23页。

(2)inode索引节点

每个文件都对应的一个inode结构,每一个inode有一个索引节点号i_ino。

在同一个文件系统中,每一个索引节点号是唯一的。

索引节点对应的文件可以是磁盘文件、设备文件或特殊节点。

对应硬盘结构:

磁盘inode信息(大小、属性、存储位置、访问权限)

作为一个内核数据结构所需要的管理性信息(锁、内存映射、链)

主要操作:

fileoperation(文件操作)和inodeoperation(索引节点操作)

主要数据成员:

详见ch7文件系统.ppt的第32页-第34页。

(3)file文件对象

文件对象描述的是进程怎样与一个打开文件交互的过程。

只有当文件被打开时才创建file对象,主要内容则是文件的指针。

对应硬盘结构:

磁盘上没有file对应的映像。

主要操作:

主要数据成员:

详见ch7文件系统.ppt的第38页-第41页。

(4)dentry目录项

由于从磁盘读入并构造一个目录项需要花费大量的时间,而且目录项可能被经常性的访问,所在linux使用目录项调整来提高处理目录项对象的效率。

dentry是Linux文件系统中某个索引节点(inode)的链接,每个在目录树中存在的节点都对应一个目录项对象。

对应硬盘结构:

主要操作:

主要数据成员:

详见ch7文件系统.ppt的第44页-第47页。

3、操作系统打开一个文件的过程:

重点

首先大家需要明白这样几个概念:

每个文件或目录都对应了一个唯一的inode(索引节点)

inode中存放了文件的物理地址,如果是目录,则这个地址指向dentry(目录项),如果是文件,则指向文件内容

dentry是目录文件的数据结构,也就是目录文件的内容。

其中存放了该目录下的文件名与它们各自inode号的对应关系

磁盘的inodetable(索引节点表)中存放了i_ino(索引节点号)与inode的对应关系

举个例子吧,比如现在要打开/tmp/test.c这个文件,那么整个过程可以分为以下几步:

(1)操作系统从inodetable(索引节点表)中提取出第一个inode(索引节点),即为根目录“/”的inode

(2)从根目录“/”的inode中找到“/”的数据块,这个数据块即为它的dentry,dentry中存放了“/”下所有文件的文件名和相应的i_ino(索引节点号),并从这个dentry中找到名为“tmp”的项,于是得到了tmp的i_ino

(3)根据刚刚得到的tmp的i_ino搜索inodetable,得到tmp的inode

(4)从tmp的inode中找到数据块地址,同理,这个数据块即为dentry,然后找到dentry中名为“test.c”的项,得到test.c的i_ino

(5)根据刚刚得到的test.c的i_ino搜索inodetable,得到test.c的inode

(6)test.c的inode中就存放了这个文件的地址,文件已找到。

七、设备管理

1、物理设备通过主设备号与驱动程序唯一地对应起来。

2、模块可以访问内核的全部数据或结构。

3、模块的编写方法:

重点

Linux的模块代码大体包含如下几个部分:

(1)头文件

头文件与C语言所包含的库文件类似,都是以#include这样的格式开头

(2)GPL声明

这部分大家不必考虑太多,全都写MODULE_LECENSE("DUELBSD/GPL");即可

(3)自定义的各种各样的函数

这部分灵活性较大,实现题目要求的功能

(4)模块声明

模块的声明部分比较简单,只要将初始化该模块时所调用的函数名和退出模块时调用的函数名声明即可,格式如下:

module_init(函数名);

module_exit(函数名);

参照ch7.2设备管理与模块机制.ppt的第15页-第16页,第十五页右侧的截图即为一个模块实例。

八、访问控制

(一)传统访问控制重点

在Linux中,可以按照文件的角度将所有用户划分为3类:

拥有者、拥有组、其他;而对于每一类用户又都可划分为3种操作方式:

读、写、执行。

所以,Linux文件的基本属性也就应该用9(3×3)位来表示,详细列出如下:

第一位:

“文件拥有者”是否可以读这个文件

第二位:

“文件拥有者”是否可以写这个文件

第三位:

“文件拥有者”是否可以执行这个文件

第四位:

“文件拥有组”是否可以读这个文件

第五位:

“文件拥有组”是否可以写这个文件

第六位:

“文件拥有组”是否可以执行这个文件

第七位:

“其他用户”是否可以读这个文件

第八位:

“其他用户”是否可以写这个文件

第九位:

“其他用户”是否可以执行这个文件

其中每一位都以1代表是,0代表否。

这9个二进制数可以三三结合,变成3个十进制数,比如111101101就对应了755。

更改文件权限的命令是chmod,这个命令的使用格式如下:

chmodXXX文件名

其中XXX就代表了那三个十进制数,例如:

chmod740test.c

首先,这条命令是对当前目录下名为test.c的文件进行的操作,命令更改了它的权限,至于改成了什么权限,我们再来分析:

740是个十进制数,按照上面的换算方法,我们可以通过740得到一串二进制数111100000,再用这串二进制数对应上面的具体位的含义就会发现,740(111100000)代表着将文件的权限改为“文件拥有者可读可写可执行+文件拥有组可读不可写不可执行+其他用户不可读不可写不可执行”。

完整地理解这条命令,就是将当前目录下的test.c文件权限修改为“文件拥有者可读可写可执行+文件拥有组可读不可写不可执行+其他用户不可读不可写不可执行”。

在这9位权限位的前面,其实还有3位特殊访问位,分别为SUID、SGID、STICKY,含义为:

SUID:

任何用户在执行该程序时,是否拥有文件所有者的执行权限

SGID:

任何用户在执行该程序时,是否拥有文件所有组的执行权限

STICKY:

当对某个目录设置该位时,非授权用户不能删除或重命名这个目录中其他用户的文件。

该位只针对目录有效,对文件没有效果。

如果想要将这3个特殊访问位也修改的话,chmod命令后面的数字就应该是4个而不是3个了,其中第一个数字就代表了这3个特殊访问位的值。

另外,chmod命令后面还可以接字符参数,比如:

chmodo+xtest.c

这句话的含义即为给test.c文件增加其他用户的可执行权限。

类似的命令还可以有:

chmodg-wtest.c

chmodgo-wxtest.c

chmodugo+rxtest.c

chmoda+xtest.c

其中各个参数的含义为:

a:

所有用户(all)

u:

文件拥有者(user)

g:

文件拥有组(group)

o:

其他用户(other)

+:

增加相应权限

-:

删除相应权限

r:

可读(read)

w:

可写(write)

x:

可执行(execute)

详见ch8.1linux传统访问控制.ppt的第17页-第35页。

(二)Ext2文件标记属性

1、文件标记与文件访问权限的区别

文件标记是针对所有用户的,高于文件权限设置。

如:

某文件具有EXT2_IMMUTABLE_FL,则无论任何人都不可修改该文件,与文件访问权限的设置无关。

2、支持

并不是所有文件系统都支持该特征,仅ext2、ext3文件系统支持。

3、相关命令

(1)lsattr显示文件的标记属性

格式:

lsattr文件名

(2)chattr修改文件的标记属性

格式:

chattr参数文件名

其中参数可以为A、a、d、i、s、S,各个参数的含义可参考ch8.1linux传统访问控制.ppt的第38页-第39页。

(三)访问控制

1、自主访问控制(DAC)和强制访问控制(MAC)的区别

(1)自主访问控制(DAC)是一个接入控制服务,它执行基于系统实体身份和它们的到系统资源的接入授权。

这包括在文件,文件夹和共享资源中设置许可。

(2)强制访问控制是“强加”给访问主体的,即系统强制主体服从访问控制政策。

强制访问控制(MAC)的主要特征是对所有主体及其所控制的客体(例如:

进程、文件、段、设备)实施强制访问控制。

为这些主体及客体指定敏感标记,这些标记是等级分类和非等级类别的组合,它们是实施强制访问控制的依据。

系统通过比较主体和客体的敏感标记来决定一个主体是否能够访问某个客体。

用户的程序不能改变他自己及任何其它客体的敏感标记。

2、SELinux使用到的安全技术

类型加强(TypeEnforcement,TE)

基于角色访问控制(RBAC)

多级安全(MLS)

九、链接与可执行文件重点

1、预处理:

处理以#开头的声明(比如define后的字符或include),将库函数的声明和所需的数据结构一并复制到源代码中,并去掉注释。

2、编译:

将文本形式的代码转换为汇编语言文件。

3、汇编:

将汇编文件转换为二进制机器码文件。

4、链接:

进行符号解析,将程序中的符号引用和符号定义相关联(这个关联就是符号表)

将代码中include的库函数的二进制代码块粘贴到目标文件上(即静

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1