20169211《Linux内核原理与分析》第四周作业

20169211《Linux内核原理与分析》第四周作业内容列表

1、教材第3、5章节知识学习总结;

2、实验楼配套实验二实验报告;

1、《linux内核设计与实现》教材第3、5章节知识阅读学习总结

教材第3章节主要讲述了进程管理相关的知识,包括什么是进程、进程描述符及任务结构、如何创建进程、linux中线程的实现方法以及如何终结进程等。

首先,印象最深的是如何创建新的进程。在听孟老师的《linux内核分析》的课程时,曾谈到过计算机的“三大法宝”:存储程序计算机、函数调用堆栈和中断机制。针对于存储程序计算机这个特性,说一下我的理解:程序是存放在外边磁盘中的文件,为使其运行于计算机内存中,通过CPU一系列的计算而最终得到我们想要的结果的话,需要为其创建进程。那么,创建进程可以通过调研exec()这组函数为其创建新的地址空间,并把新的程序载入其中。在现代linux内核中,通常使用fork()来创建进程,而fork()实际上是clone()系统调用的实现。最终程序通过exit()系统调用退出程序的执行,也就是终结进程的生命周期。为了通过程序设计语言来描述我们提出的进程理论,需要为其创建进程描述符和相应的数据结构,下边是实验楼代码中一个PCB结构的代码:

typedef struct PCB{
	int pid;//进程描述符,唯一标识一个进程
	volatile long state ; 
	char stack[KERNEL_STACK_SIZE] ;
	struct Thread thread ;
	unsigned long task_entry ;
	struct PCB *next ;
} tPCB ;

其中,进程描述符中的状态域描述了进程的状态,系统中每个进程都必然处于五中状态中的一种:运行态、可中断、不可中断、跟踪态、停止。

另外,就是线程机制在现代linux内核中的实现。从内核的角度来说,linux把所有的线程都当做进程来实现。它仅被视为一个与其他进程共享某些资源的进程,可以通过clone()系统调用来创建线程。

教材第5章节主要讲述了系统调用的相关知识。为了与操作系统内核通信,应用最终需要通过系统调用来进行,而通常情况下是使用C库中定义的函数调用来进行。用户程序通过包含标准头文件并和C库连接,就可以使用系统调用。另外,linux本身提供了一些宏,用于直接对系统调用进行访问。它会设置好寄存器并调用陷入指令。例如书中给出的例子,open()系统调用的定义是:

long open(const char *filename, int flags, int mode)

不靠C库的支持,而是直接通过系统调用的宏的形式:

#define NR_open 5
_syscall3(long, open, const char*, filename, int, flags, int, mode)

这样,应用程序就可以直接使用open()了。

2、实验楼《linux内核分析》实验二实验操作过程报告

这个实验主要涉及到两个c源程序,分别是mymain.c和myinterrupt.c。通过编写这两个源程序来实现一个简单的时间片轮转多道程序内核代码。下边,分别给出这两个源程序的代码:

mymain.c

...	//硬件初始化操作所引入的头文件
void _init my_start_kernel(void){
	int i=0 ;
	while(1){
		i++ ;
		if(i%100000 == 0)
			printk(KERN_NOTICE "my_start_kernel here %d 
", i) ;
	}
}

myinterrupt.c

#define CREATE_TRACE_POINTS
#include <trace/events/timer.h>
/*
*Called by timer interrupt.
*/ 
void my_timer_handler(void){
	printk(KERN_NOTICE "
>>>>>>>>>>>>>>>>>>>");
}

编写完成之后,执行mystart_kernel中的代码,执行结果如下:

分析如上程序,通过

qemu -kernel arch/x86/boot/bzImage

从qemu窗口中可以看到my_start_kernel正在执行,同时my_timer_handle时钟中断处理程序在周期性的执行。

原文地址:https://www.cnblogs.com/sharemi/p/5964990.html