Linux内核学习总结

来源:互联网 发布:淘宝购买流程 编辑:程序博客网 时间:2024/06/04 18:43

一、计算机是如何工作的

博客地址:http://blog.csdn.net/u010856103/article/details/56846457

通过课程学习,可以看出计算机的工作流程大致如下:

1)以冯诺依曼体系为基础,依据存储程序的模型,一步步取出指令,自动执行;
2)eip(32位机器为例)存放当前指令地址,通过eip来寻找指令并执行;
3)一般情况下机器指令执行是顺序执行的,call、jmp等指令可以改变eip值,实现跳转;
4)高级语言(比如C)在执行的时候会被翻译成更贴近机器的汇编,之后再是机器语言,交与机器执行;
5)栈很重要,通过跟踪栈的变化,能够了解到函数调用被调用函数时候自身数据如何保存的,数据是如何传递的,以及从被调用函数返回调用函数时,如何找到调用函数相关数据;
6)esp、ebp使得栈更具灵活性。

二、操作系统是如何工作的

博客: http://blog.csdn.net/u010856103/article/details/60469707

本次实验是分析一个简单的程序,就是实现一个简单的按照时间片轮转规则,来同时执行多个进程的系统内核。它只有内核入口函数的主循环和中断处理程序在工作。从执行结果也可以看到我们的内核主循环和时钟中断处理程序交替产生的输出。而一个操作系统应该能够同时允许多个进程在其上执行。

操作系统三个法宝:存储程序计算机、函数调用堆栈、中断机制
  
操作系统两把宝剑:中断上下文、进程上下文的切换

  操作系统核心功能:进程调度和中断机制,通过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可以使用户可以很容易操作的计算机系统   
  多进程的Linux操作系统:进程必须等到正在运行的进程空闲CPU后才能运行   进程切换:当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程。进程切换机制中包含esp的切换、堆栈的切换。

三、构造一个简单的Linux系统MenuOS

博客:http://blog.csdn.net/u010856103/article/details/61620521

idle是一个进程,其pid号为 0。其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。每个处理器单元有独立的一个运行队列,而每个运行队列上又有一个idle进程,即有多少处理器单元,就有多少idle进程。

加载linux内核开始运行后,进程开始执行start_kernel()完成Linux内核的初始化工作。包括初始化页表,初始化中断向量表,初始化系统时间等。继而调用 fork(),创建第一个用户进程: kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); 这个进程就是着名的pid为1的init进程,它会继续完成剩下的初始化工作,然后execve(/sbin/init), 成为系统中的其他所有进程的祖先。这就是我们看到的init进程,进程号为1。初始化的最后linux调用scheule()整个系统就运行起来了。

分析start_kernel:
1、start_kernel函数是内核中汇编代码和C代码的交接点:在此之前,内核的代码都是用汇编写的。主要是完成 一些最基本的初始化和相应的环境设置。
2、在此之后,就是按照c使内核开始工作了。内核中的大部分模块是在start_kernel中完成初始化工作。 start_kernel就相当于c代码中的主函数,无论你调用什么函数,都得通过这个“主函数”。
3、Linux在start_kernel中将整个系统的内核初始化,这个过程非常复杂。但是内核初始化的最后一步就是启动 init进程,它是所有进程的祖先。
4.start_kernel函数的最后,就是调用rest_init这个函数了,此时就会产生第一个真正的进程:1号进程。

四、扒开系统调用的三层皮(上)

博客:http://blog.csdn.net/u010856103/article/details/63687340

1.系统调用的三层皮:xyz system_call sys_xyz
对应的是API,中断向量对应的中断服务程序,系统调用服务程序。
API:应用编程接口
它与系统调用的关系:API可能直接提供用户态的服务,不是一个API都有与之相对应的系统调用。

2.中断处理,用户态及内核态
通过cs:eip的值判断代码段是在用户态还是内核态
中断处理是一种由用户态进入内核态的方式(系统调用也可以理解为是一种中断)
中断发生后,首先要保存现场

3.系统调用简单点说,就是通过设置输入输出变量,令其存在于ebx等寄存器中,而后将系统调用号赋给eax寄存器,最后通过int 0x80来进行中断,从而开始所选择的系统调用。
若有返回值,则将返回值传至eax寄存器中,我们便可以利用返回值来给出一定的结论(如操作成功或失败)。

五、扒开系统调用的三层皮(下)

博客:http://blog.csdn.net/u010856103/article/details/66476223

系统调用的处理过程可分成以下3步:
  (1)将处理机状态由用户态转为系统态。之后,由硬件和内核程序进行系统调用的一般性处理,即首先保护被中断进程的CPU环境,将处理机状态字PSW、程序计数器PC、系统调用号、用户找指针以及通用寄存器内容等压入堆栈,然后,将用户定义的参数传送到指定的地方保存起來。
  (2)分析系统调用类型,转入相应的系统调用处理子程序。为使不同的系统调用能方便地转向相应的系统调用处理子程序,在系统中配置了一张系统调用入口表。表中的每个表目都对应一条系统调用,其中包含该系统调用自带参数的数目、系统调用处理子程序的入口地址等。内核可利用系统调用号去查找该表,即可找到相应处理子程序的入口地址而转去执行它。
  (3)在系统调用处理子程序执行完后,恢复被中断的或设置新进程的CPU现场,然后返冋被中断进程或新进程,继续往下执行。

六、进程的描述和进程的创建

博客:http://blog.csdn.net/u010856103/article/details/68952976

1、创建进程:
fork系统调用在父进程和子进程各返回一次
子进程中返回的是0,父进程中返回值是子进程的pid
fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建

具体创建过程如下:复制当前进程作为子进程、由do_fork实现复制父进程的pcb、给子进程分配内核堆栈、修改子进程的pid等相关信息

2、进程是怎么描述的
linux中使用task_struct结构体来描述进程。该结构体包含了大量的进程信息,源代码中该结构体大概有400多行代码。task_struct又被称为进程控制块。它是一个描述进程的进程描述符。

七、可执行程序的装载

博客:http://blog.csdn.net/u010856103/article/details/69929658

在bash 下输入命令执行某个ELF程序:
bash进程调用fork()系统调用创建一个新的进程,新的进程调用execve()执行指定的ELF。原先的 bash进程继续返回等待刚才启动的新进程结束。
在进入execve()系统调用之后,Linux内核开始进行真正的装载工作:
1.查找被执行的文件,如果找到文件,读取文件的前128个字节以判断文件的格式。
2.搜索和匹配合适的可执行文件装载处理过程。
1)根据ELF的程序头表的描述,对ELF进行映射。
2)初始化ELF进程环境。
3)将系统调用的返回地址修改为ELF可执行文件的入口点(静态链接为文件头e_entry所指地址;动态链接为动态连接器)。
3.系统调用返回,新的程序开始执行。

八、进程的切换和系统的一般执行过程

博客:http://blog.csdn.net/u010856103/article/details/70196442

  1、Linux进程调度是基于分时和优先级的。
  2、Linux中,内核线程是只有内核态没有用户态的特殊进程。
  3、内核可以看作各种中断处理过程和内核线程的集合。
  4、Linux系统的一般执行过程 可以抽象成正在运行的用户态进程X切换到运行用户态进程Y的过程。
  5、Linux中,内核线程可以主动调度,主动调度时不需要中断上下文的切换。
  6、Linux内核调用schedule()函数进行调度,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换。

九、课程总结

首先:单单从操作系统的角度来说学习LINUX操作系统和学习WINDOWS操作系统几乎是相同的,同样的几大构成部分,同样的系统调用,进程调度,这几乎与我上学期所学习的windows操作系统讲的东西差不多。

但是在一些其他的方面两者还是有很大的区别。其中让我感触最深的就是LINUX系统可以进行内核的编译,人人都可以对linux的内核进行创新,它的内核是完全开源的,每个人都可以编写一个属于自己的内核,而这是Windows做不到的。

其次,我们在用linux的时候经常会使用到指令集,通过它来完成软件的安装,用户切换,权限设置等等的功能,linux和windows相比更加注重这一类的建设,而不像windows更加注重的是桌面的设计。因此linux才会成为高端的用户,和大公司的首选操作系统。最后

感谢老师10周以来的教导,让我对linux系统的入门和了解有了一个非常良好的基础和开始。谢谢老师!!!

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

0 0
原创粉丝点击