资料下载网
首页 计算机 考试教辅
LINUX复习资料完整版 pdf电子书免费下载,百度云
首页 > 计算机 > 计算机网络/服务器 > LINUX复习资料完整版 pdf电子书免费下载,百度云

《LINUX复习资料完整版》pdf电子书免费下载


下载方式一:

百度网盘下载地址:https://pan.baidu.com/s/1mFs9FX20UCzJuAsFCCEZZA
百度网盘密码:1111

下载方式二:

http://ziliaoshare.cn/Download/ad_123594_do_LINUXFXZLWZB.zip

 


LINUX复习资料完整版

作者:empty

出版社:empty

《LINUX复习资料完整版》介绍

LINUX复习资料

填空题:

1、Linux内核主要是由进程调度、内存管理、虚拟文件系统、网络接口和进程间通信组成

2、Linux系统定义了五种状态进程状态:就绪状态、可中断等待状态、不可中断等待状态、停止状态、中止状态

RT-Linux中的德实时任务在运行过程当中总是处于以下三种状态之一:

等待状态是指正在执行某些事件而无法等到执行,放弃CPU而处于暂停状态;

就绪状态也是因为有更高优先级的任务正在使用CPU而不能投入运行,任务处于等待CPU的状态,处于就绪队列中;运行状态是任务正在CPU上运行。

3、从Linux的调度来看,支持非实时(普通)和实时两种进程

4、考虑到中断处理的效率,Linux的中断处理程序分为两个部分:上半部(top half)和下半部(bottom half)

5、由外部设备引发的中断叫外部中断,处理器响应中断请求而执行的程序模块叫中断服务例程

6、交换机制:将不用或暂不用的页框中的页移出,装上新的页面

7、linux三级分页结构:页目录、中间页目录、页表

8、进程的通信与同步机制有管道、信号、消息队列、共享内存和信号量集等

9、Linux的管道有:匿名管道和命名管道

10、从信号的可靠性方面,信号可以分为:可靠信号和不可靠信号

11、linux设备驱动注册的基本参数有设备名称,设备驱动的数据结构、设备号和次设备号

12、lsmod把现在kernel中已经安装的modules列出来;insmod把某个module安装到 kernel

13、嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。

14、嵌入式系统的组成部分是嵌入式系统硬件平台、嵌入式操作系统和嵌入式系统应用。其中,嵌入式系统硬件平台为各种嵌入式器件、设备(如ARM、PowerPC、Xscale、MIPS等)

16、嵌入式操作系统是指在嵌入式硬件平台上运行的操作系统,目前主流的嵌入式操作系统有嵌入式Linux、CLinux、WinCE、C/OS-Ⅱ、VxWorks等

17、RTOS有QNX,pSOS,vxworks,RT-Linux等

18、Linux用户进程:进程控制块、系统堆栈、用户堆栈、程序代码及数据段组成;

Linux可以管理512个进程,进程调度的police域有:SCHED_OTHER; SCHED_FIFO; SCHED_RR

Linux的进程控制相关的系统调用函数有:fork,exit,vfork,wait,execve等

19、Linux 虚拟文件系统维护描述整个虚拟文件系统以及实际已挂装的文件系统的数据结构

20、嵌入式Linux系统中常见的文件系统有:yaffs, jsffs, cramfs等

21、文件系统的安装必须调用mount命令,把其他子系统安装到已经存在于文件系统的空闲节点上。文件系统类型的注册函数为register filesystem,超级用户卸载文件系统使用umount命令

22、Linux实时改造后的系统实时性较好,典型代表有:Kurt-Linux,RED-Linux,RT-Linux、RTAI和Xenomai等。

23、在基于Adeos的系统中,存在着A、B、C、D四种类型的交互。Linux内核负责非实时任务的调度,xenomai实现更小的调度延时。另外,xenomai域的优先级高于Linux域。

Xenomai除了在内核层利用Adeos实现了硬件时实时外,它在用户空间也有很好的实时性。

简答题:

1、Slab分配器思想

(1)小对象的申请和释放通过slab分配器来管理。

(2)slab分配器有一组高速缓存,每个高速缓存保存同一种对象类型,如i节点缓存、PCB缓存等。

(3)内核从它们各自的缓存种分配和释放对象。系统分配对象时就从slab中取得。首先从这个cache中部分满的slab中分配,如果没有这样的slab, 便从空的slab中分配,如果也没有,就创建一个新的slab来分配即可。由于每个对象在释放时几乎处于分配好并且初始化好的状态,还可以节省不少初始化的时间。

(4)每种对象的缓存区由一连串slab构成,每个slab由一个或者多个连续的物理页面组成。这些页面种包含了已分配的缓存对象,也包含了空闲对象。

2、Linux系统进程调度的总体思想。

实时进程优先于普通进程,实时进程以进程的紧急程度为优先顺序,普通进程以进程平等占用CPU时间为基本调度原则。

3、Linux 内核的主要组成部分

Linux内核主要是由进程调度、内存管理、虚拟文件系统、网络接口和进程间通信五个组成。

(1) 进程调度负责控制进程对CPU的访问,调度程序使用一种策略确保所有的进程都能公平的访问CPU,并且确保内核在任意时刻能执行必要的硬件操作。

(2) 内存管理负责管理系统的物理内存,实现多进程安全享享计算机的内存。

(3) 虚拟文件系统通过将各种设备抽象为一种公共接口,从而屏蔽了各种硬件设备的细节。虚拟文件系统可以分为逻辑文件系统和设备驱动程序两部分。

(4) 网络接口提供了对各种网络标准的存取和各种网络硬件的支持,实现了对各种网络标准和网络硬件的访问。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

(5) 进程间通信子系统实现了系统内部进程间的多种通信机制。

这五个子系统互相依赖,但相对来说进程调度处在比较重要的地位。其他子系统需要挂起和恢复进程的运行都必须依靠进程调度子系统的参与。

4、基于虚拟内存技术的程序执行两次映射:

1.应用程序向虚拟内存映射:用虚拟地址为程序编址,映射到虚拟内存空间;确定其代码段、数据段和堆栈段的地址空间,系统以逻辑地址访问虚拟内存中的某个程序段;

2.把要运行的程序段复制到物理内存,映射到物理内存空间,确定程序的物理地址。虚拟内存逻辑地址与物理地址的对应记录表;系统自物理内存地址读取所需数据。

5、Buddy算法-伙伴算法

Linux对空闲内存空间管理采用Buddy算法。

Buddy算法

(1) 把内存中所有页面按照2n划分,其中n=0~5,每个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分。划分后形成了大小不等的存储块,称为页面块,简称页块。包含1个页面的页块称为1页块,包含2个页面的称为2页块,依此类推。每种页块按前后顺序两两结合成一对Buddy“伙伴” 。

(2) 每个页块组用一个双向循环链表进行管理,共有6个链表,分别为1、2、4、8、16、32页块链表。分别挂到free_area[] 数组上。

(3) 内存分配时,系统按照Buddy算法,根据请求的页面数在free_area[]对应的空闲页块组中搜索。若请求页面数不是2的整数次幂,则按照稍大于请求数的2的整数次幂的值搜索相应的页面块组。当相应页块组中没有可使用的空闲页面块时就查询更大一些的页块组,在找到可用的空闲页面块后,分配所需页面。

(4) 当某一空闲页面块被分配后,若仍有剩余的空闲页面,则根据剩余页面的大小把它们加入到相应页块组中。

(5) 内存页面释放时,系统将其做为空闲页面看待。检查是否存在与这些页面相邻的其它空闲页块,若存在,则合为一个连续的空闲区按Buddy算法重新分组。

6、针对Linux内核,如下机制严重地影响了实时性:

Linux调度及其抢占

第一,虽然Linux2.6中代码被设置了抢占点,内核已经可以抢占,因而实时性得到了加强。但是内核中仍有大量的不可抢占区域, 如由自旋锁 (spinlock)保护的临界区,以及一些显式使用preempt_disable失效抢占的临界区。还包括核心进程是不能被抢先的,即如果有Linux的核心态进程在运行时,其他进程不管其优先级多高都必须等待。

Linux的中断

中断总是最高优先级的,在系统调用中为了保护临界区资源,Linux会长时间关掉中断。Linux在一些同步操作中使用了中断关闭指令,中断关闭将增大中断延迟,降低系统的实时性。这种情况在实时系统中是不允许发生的。

连续的低优先的中断可能持续占有CPU,而高优先的某些进程则无法获得CPU。在Linux中,中断(包括软中断)是最高优先级的,不论在任何时刻,只要产生中断事件,内核将立即执行相应的中断处理函数以及软中断,等到所有挂起的中断和软中断处理完毕有才执行正常的任务。因此在标准的Linux系统上,实时任务根本不可能得到实时性保证。例如,假设在一个标准Linux系统上运行了一个实时任务(即使用了SCHED_FIFO调度策略并且设定了最高的实时优先级),但是该系统有非常繁重的网络负载和I/O负载,那么系统可能一直处在中断处理状态而没有机会运行任何任务,这样实时任务将永远无法运行,抢占延迟将是无穷大。因此,如果这种机制不改,实时Linux将永远无法实现。

linux的时钟粒度

操作系统必须对时间精度和时钟中断处理的时间开销进行折中考虑,时间精度越高,意味着时钟中断越频繁。Linux通过对硬件时钟编程产生周期为100hz的时钟,中断任务调度的时间精度最高能达到10ms。这无法满足一些对时间精度要求苛刻的实时应用.

在Linux 2.6内核中还是允许在编译内核时选定不同的Hz值。在Linux2.6版本内核中,时钟中断发生的频率范围为50~1200Hz,周期不小于0.8ms,而工业上很多的中断周期都在几十us之内,这无法满足一些对时间精度要求苛刻的实时应用。

Linux的虚拟内存

Linux采取了虚拟内存的内存管理方式,即Linux利用交换空间让进程运行在一个比实际内存大的虚拟内存空间里。它使得操作花费的时间具有不可预测性在实时系统中是不允许的。

7、linux使用的进程间通信方式:

(1) 管道(pipe)和有名管道(FIFO)

(2) 信号(signal)

(3) 消息队列:msgget可以创建一个新队列或打开一个存在的队列. msgctl类似于驱动程序中的ioctl函数, 可对消息队列执行多种操作. 调用msgsnd将数据放到消息队列中. 调用msgrcv将从消息队列中取消息.

(4) 共享内存:linux进程调用shmget(Shared Memory GET,获取共享内存)来分配一个共享内存块。shmat(SHared Memory Attach,绑定到共享内存)。shmctl( Shared Memory Control ,控制共享内存)函数会返回一个共享内存块的相关信息。同时 shmctl 允许程序修改这些信息。

(5) 信号量

(6) 套接字(socket)

8、安装RT-Linux的方法和步骤

1.下载RT-Linux完整的源代码tar包,存放在/usr/src目录下。

2. 下载完整的与Red Hat Linux 9版本相应的官方内核,存放在/usr/src目录下。

3.将Linux源代码右键解压至/usr/src目录,解压后会出现/usr/src/linux-2.4.20目录;

tar xvfz linux-2.4.20.tar.gz /usr/src

4.在Shell终端中输入命令,切换至src目录:#cd/usr/src

建立指向文件夹linux 2.4.20的符号连接,以简化后续命令输入:ln -S linux-2.4.20 linux

5.解压rtlinux-3.1.tar.gz至/usr/src目录,tar xvfz rtlinux-3.1.tar.gz /usr/src

解压后会出现/src/usr/rtlinux3.1目录下,在patches目录下找到与内核版本相对应的patch文件,如kernel_patch-2.4.20-rtl,并将其拷贝至/usr/src目录下,为简化后续命令输入,可将其改名为rtlinux-patch;

6。在Shell终端中输入命令,切换至linux源代码目录,并patch内核:#cd/usr/src/linux

#patch –pl ../rtlinux-patch

7.配置内核:#make config或make menuconfig或make xconfig

8.建立依赖关系:#make dep

9编译内核及内核模块,并进行安装:#make bzlmage #make modules #make modules_install

10.安装新内核,将/arch/i386/boot目录下刚编译得到的bzlmage文件拷贝至/boot目录下,并更名至rtlinuz:#cp arch/i386/boot/zlmage boot/rtlinuz

11.配置Grub,编辑/boot/grub/grub conf加上RT Linux启动选项.

12.重新启动计算机:#reboot或shutdown-r now

13.计算机重新启动后,在Grub启动菜单中选择 RT-Linux”,回车后进入RT-Linux系统。

14.在Shell终端中输入命令,进入RT-Linux源代码包所在目录:#cd/usr/src/rtlinux_3.1

15.配置RT-Linux:#make config 此处可按缺省配置即可。

16.建立依赖关系(可选,如跳过则后面的make命令会自动建立依赖关系):#make dep

17.编译RT-Linux内核及实时模块,并进行安装:#make #make install

18.测试RT-Linux内核及实时模块是否能正常工作(可选):#make regression

19.最后,启动RT-Linux内核模块。

9、xenomai的补丁及配置移植步骤

1、压内核源码包和Xenomai源码包

tar -jvxf linux-2.6.25.8_20090807.tar.bz2 -C /opt/EmbedSky

tar -jvxf xenomai-2.4.4.tar.bz2 -C /opt/EmbedSky

2、内核源码打补丁,打上ADOES(Adaptive Domain Environment for Operating System)补丁,使linux内核源码包具有ADOES管理功能和实时为内核功能。具体步骤如下:

(1).到解压好的xenomai-2.4.4的目录下,可以看到 scripts脚本目录,在此目录下有一shell脚本prepare-kernel.sh 使用此脚本,可实现相应版本的xenomai的补丁打到相应版本的内核源码包中

$#cd xenomai-2.4.4

$# script/prepare-kernel.sh --linux=/opt/EmbedSky/linux-2.6.25.8/ --adeos= /opt/EmbedSky/xenomai-2.4.4/ksrc/arch/arm/patches/adeos-ipipe-2.6.25-arm-1.9-02.patch --arch=arm

3、编译xenomai源码包,用于xenomai域的程序开发及运行,即编译出xenomai的动态链接库,在开发xenomai程序需要链接的库及头文件应当被交叉编译,方可在arm平台上运行。同时,应该将编译后的动态库拷贝到arm平台上文件系统的/lib目录下。

具体做法,在xenomai-2.4.4目录下,运行configure –help来进行配置,以下是移植时的配置

$#./configure --build=i686-pc-linux-gnu --host=arm-linux --enable-arm-mach=s3c2410 --prefix=/opt/EmbedSky/xenomai-2.4.4/Install --with-adeos-patch=/opt/EmbedSky/xenomai-2.4.4/ksrc/arch/arm/patches/adeos-ipipe-2.6.25-arm-1.9-02.patch --enable-posix-auto-mlockall --enable-smp –enable-debug

该配置是将交叉编译好的文件安装到--prefix的目录下,也就使在xenomai-2.4.4目录下创建一个 Install的目录,并将结果放在此目录下。

$# make

$# make install

4、配置和编译内核

补丁后,到内核源码目录下运行make menuconfig命令,进入到内核配置界面,可发现多了一项 Real-time sub-system --->选项,在此选项下有多个选项

通过选择相应项,之后保存并编译内核镜像(make zImage)。则此内核镜像具有xenomai的为内核补丁了。

将编译生成的动态库拷贝到开发板的/lib目录下

将编译生成的测试工具拷贝到开发板的/bin目录下即可对xenomai进行测试

5、将xenomai的镜像下载到开发板中,看看是否内被引导成功,并运行Linux程序。

注释题:

1、Linux使用内核函数goodness()对进程进行加权处理:

Static inline goodness (struct task_struct * pint this_cpu, struct mm_struct *this_mm)

{Int weight;

Weight=-1;

 If (p->policy & SCHED_YIELD)// /*判断如果任务的调度策略被置为SCHED_YIELD的话,则置权值为-1,返回。

goto out;

If (p->policy==SCHED_OTHER) /*先对普通进程进行处理(由于多数是普通进程,这样做有利于提高系统效率)*/

{weight=p->counter; /*返回权值为进程的counter值*/

If (! weight)

Goto out;

#Ifdef CONFIG_SMP

If (p->processor==this_cpu)

Weight+=PROC_CHANGE_PENALTY;

#Endif

If (p->mm==this_mm||! p->mm)

Weight+=1; /*对进程权值进行微调,如果进程的内存空间使用当前正在运行的进程的内存空间,则权值额外加1*/

Weight+=20-p->nice; /*将权值加上20与进程优先级nice的差。普通进程的权值主要由counter值和nice值组成*/

Goto out;

}

Weight=1000+p->rt_priority; //对实时进程进行处理,返回权值为rt_priority+1000,确保优先级高于普通进程*/

Out:

return weight;}

2、linux 进程及管道应用实例

#include stdio.h>

#include unistd.h>

int main()

{

int n,fd[2]; // 这里的fd是文件描述符的数组,用于创建管道做准备的

pid_t pid;

char line[100];

if(pipe(fd) 0) // 创建管道

printf( pipe create error/n );

if((pid=fork()) 0) //利用fork()创建新进程

printf( fork error/n );

else if(pid>0){ //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world

close(fd[0]);

write(fd[1], hello word/n ,11);

}

else{

close(fd[1]); //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据

n= read(fd[0],line,100);

write(STDOUT_FILENO,line,n);

}

exit(0);

}

3、小任务是指对要推迟执行的函数进行组织的一种机制。其数据结构为tasklet_struct,每个结构代表一个独立的小任务,其定义如下:

struct tasklet_struct {

struct tasklet_struct *next; /*指向链表中的下一个结构*/

unsigned long state; /* 小任务的状态 */

atomic_t count; /* 引用计数器 */

void (*func) (unsigned long); /* 要调用的函数 */

unsigned long data; /* 传递给函数的参数 */

};

4、

#include linux/module.h>

#include linux/kernel.h>

#include linux/init.h>

void testirq_interrupt(int,void *,struct pt_regs *);

static int testirq_init(void);

/**********************************************************/

void testirq_interrupt(int irq,void *d,struct pt_regs *regs)

{/*clear interrupt register for EINT5*/

SRCPND &= (~0x00000010); //(1)中断源待决寄存器赋值

INTPND = INTPND;

EINTPEND &= (~0x00000020); //(2) 外部中断待决寄存器赋值

printk( Entered an interrupt! Beginning interrupt service! n );}

/****************************************************/

static int __init testirq_init(void)

{static int result;

unsigned long gpfup;

set_external_irq(IRQ_EINT5, EXT_FALLING_EDGE, GPIO_PULLUP_DIS);// (3)中断配置安装

gpfup = ioremap(0x56000058,4); //(4) gpfup寄存器地址映射

(*(volatile unsigned long *)gpfup) = 0;

disable_irq(IRQ_EINT5);// (5)关中断

enable_irq(IRQ_EINT5);// (6)开中断

result=request_irq(IRQ_EINT5,&testirq_interrupt,SA_INTERRUPT, testirq ,NULL);// (7)中断注册

if (result)

{printk( Can't get assigned irq %d,result=%d n ,IRQ_EINT5,result);

return result;}

printk( Testirq interrupt registered ok!!! n );

return 0;}

static void __exit testirq_exit(void){

disable_irq(IRQ_EINT5);

free_irq(IRQ_EINT5, NULL);// (8)释放中断

printk( exit ok n );}

module_init(testirq_init);// (9)模块初始化

module_exit(testirq_exit);// (10) 模块退出


《LINUX复习资料完整版》目录

empty

计算机


python
AI人工智能
javascript
计算机网络/服务器
数据库技术
计算机F

考试教辅


考研考博
英语四六级

沪ICP备18046276号-5
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:15618918379