标签归档:learning

Linux内核学习总结

文章目录:

  1. 实验:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
  2. 实验:完成一个简单的时间片轮转多道程序内核代码
  3. 实验:跟踪分析Linux内核的启动过程
  4. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
  5. 从system_call开始到iret
  6. 分析Linux内核创建一个新进程的过程
  7. linux可执行文件的装载
  8. 理解进程调度时机跟踪分析进程调度与进程切换的过程

1#我对linux系统的理解

linux很难,这8周的学习我对绝对还是不理解Linux的。只能说比学之前更理解它了。很多细节深入到底层硬件方面的问题,所以还需要有计算机组成原理的知识,尤其是在堆栈方面的讨论。

linux的哲学

Linux is built with a certain set of unifying principles in mind. Understanding these principles is very helpful in understanding how the system works as a whole. They are known as the “Linux Way”, which is derived from the philosophy behind the UNIX system.

The Linux Way can be summarized as:

  • Use programs that do only one task, but do it well.
    <br/>
    
  • To accomplish complex tasks, use several programs linked together.
    
  • Store information in human-readable plain text files whenever it is possible.
    
  • There is no "one true way" to do anything.
    
  • Prefer commandline tools over graphical tools.
    

Most traits of Linux are a consequence of these principles. In accordance with them, a Linux system is built out of small, replaceable components. We will examine the most important of them in more detail. Those are: the boot loader, the kernel, the shell, the X window server, the window manager and the desktop environment. After that, we will have a look at the file system in Linux. Finally, we will discuss the security of a computer running Linux.

——

Linux Guide/How Linux Works

简单总结就是KISS(keep it simple and stupid)原则

  • 用程序来完成一项任务,然后把任务做好。

  • 复杂的任务用多个程序来完成。

  • 把信息存在更人性化的文本中。

  • 没有唯一的方法。

  • 命令行能做的事就不用图形工具来完成。

这些原则使linux保持简单且高效。

用户通过交互程序与内核打交道,而内核则与硬件直接打交道。这样就把用户、内核、硬件分离开。因此内核就是理解linux的关键。

在内核与用户之间并不是直接关联的,而是通过系统调用来把用户和内核隔离开。这样既安全又方便程序员进行编程,而不是深入到内核中去操作。

内核中又分为多个模块,各各模块管理者不同的任务

通过这些模块与硬件进行打交道
整体框架大概就是这样。我并不是程序员,从我学习的目的来说我并不需要深入到每个模块是如何实现的一些具体细节。就像程序员编程不需要知道每个轮子是怎么制造的一样。 Kernel (operating system)
2#反思实验都做了些什么?

八周下来,周周有实验。再把每周标题串起来,构建一条思路。


###先整体:1~3周

1.计算机只能读懂机器代码,因此我们编程后还要将代码转换成机器代码

2.计算机要高效,就必须多个进程进行轮转。因此就产生了切换时机问题,上下文保存切换问题。

###再系统:4~5周

所谓三层皮目的就是将用户与内核分隔开。用户程序调用API,API调用系统调用,系统调用调用内核

###最后细节:6~8周

三层皮之间的相互调用必然涉及到不用的程序执行,也就是进程切换。进程又可分为用户空间和内核空间进程。进程进行切换,又设计到上下文的保存于切换,于是又回到底层的堆栈操作上。实际上我认为,在这里程序员就不再需要讨论堆栈操作了,将堆栈操作留给系统去做就可以了。否则就会陷入到无限的细节中。这也就是为什么对内核进行层层封装了。

#3.总结课程

这门课让我对linux有了一个感性的认识,这些认识对我日后学习嵌入式必然有帮助。我学习这门课的目的也大体达到。剩下的一些问题,或者说缺乏的理性认识,则可以在实践中慢慢摸索。

《Linux内核分析》课程后最大的遗憾?好吧,那就是缺乏对细节的把握。这单单看视频是不够的。

==================================================

sunfy + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

实验:完成一个简单的时间片轮转多道程序内核代码

本次实现是实验模拟操作系统是如何工作的。

mykernel

上图作证:


实验使用linux-3.9.4进行模拟。模拟操作系统如何进行进程管理以及中断处理。

Process Control Block 即PCB(进程控制块)。也称之为 Task Controlling Block。

查阅

WIKI

The role of the PCBs is central in process management: they are accessed and/or modified by most OS utilities, including those involved with scheduling, memory and I/O resource access and performance monitoring. It can be said that the set of the PCBs define the current state of the operating system. Data structuring for processes is often done in terms of PCBs. For example, pointers to other PCBs inside a PCB allow the creation of those queues of processes in various scheduling states (“ready”, “blocked”, etc.) that we previously mentioned.

可见PCB由操作系统创建和管理。同时PCB包含了足够充分的信息,这样就可以中断一个进程,并且在恢复执行该进程时就好像未被中断过一样。(《Operating Systems Internals and Design Principles》)

在mykernel中mypcb.h既是声明PCB数据结构头的文件。


PCB中定义了pid,state,stack,thread,task_entry,*next结构成员。

在定义了PCB类型的数据结构后,定义了实例变量tPCB.

在声明了PCB数据结构类型之后,Linux内核开始运作。

相关代码在mymain.c中。


该段代码在创建和管理PCB,也就是为进程设置足够充分的信息并保留下来,以便操作系统进行进程控制管理。
这是创建的一个进程。该进程是每隔1000万个时间单位打印出特定格式的信息。

为了实现多进程时间片轮转,还需要一个中断进程,不停的发出中断信号。这就是myinterrupt.c代码所执行的内容。


这就是当满足调剂时执行的中断程序。

这就是本次实验的主干内容。

可以说进程是由程序代码和相关数据还有PCB组成的。对于一个但处理器计算机,在任何时候最多只有一个进程在执行。而在运行的这个进程状态为运行态。

  • sunfy + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000