Linux期末总结

Linux内核学习总结

1.计算机是如何工作的?

存储程序计算机工作模型

X86汇编基础

汇编一个简单的C程序分析其汇编指令执行过程

2.操作系统是如何工作的?

三个法宝——存储程序计算机、函数调用堆栈、中断机制;

借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断 

在mykernel基础上构造一个简单的操作系统内核

3.构造一个简单的Linux系统MenuOS 

Linux内核源代码简介

构造一个简单的Linux系统

跟踪调试Linux内核的启动过程

sched_init()进程调度初始化函数,函数内关键的初始化——对0号进程,即idle进程进行初始化;

rest_init()其他初始化函数,函数内将创建1号进程,即init进程;

内核的启动过程:

rest_init实际是start_kernel内核一启动的时候会一直存在,这个就叫0号进程;0号进程创建了1号进程kernel_init和其他服务线程。

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

# 关于-s和-S选项的说明:

-S freeze CPU at startup (use ’c’ to start execution)

-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

gdb

(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)break start_kernel # 断点的设置可在target remote之前,也可在后

4.扒开系统调用的三层皮(上)

(一)用户态、内核态和中断处理过程

(二)系统调用概述

系统调用概述和系统调用的三层皮

(三)使用库函数APIC代码中嵌入汇编代码触发同一个系统调用

使用库函数API获取系统当前时间

C代码中嵌入汇编代码的方法(复习)

使用C代码中嵌入汇编代码触发系统调用获取系统当前时间

5.扒开应用系统的三层皮(下)

(一)给MenuOS增加time和time-asm命令

(二)使用gdb跟踪系统调用内核函数sys_time

(三)系统调用在内核代码中的工作机制和初始化

  1. 系统调用在内核代码中的工作机制和初始化

  2. 简化后便于理解的system_call伪代码

3. 简单浏览system_call和iret之间的主要代码

set_system_trap_gate,设置系统陷阱门,即系统调用。

 

使用gdb跟踪

make rootfs:自动编译,生成根文件系统,自动启动.

(gdb)list 查看代码.

(gdb)s 单步调试进入函数体.

(gdb)n 单步调试不进入函数体.

给MenuOS增加time和time-asm命令、添加了fork

6.进程的描述和进程的创建

进程的描述

  1. 进程描述符task_struct数据结构(一)
  2. 进程描述符task_struct数据结构(二)

进程的创建

  1. 进程的创建概览及fork一个进程的用户态代码
  2. 理解进程创建过程复杂代码的方法
  3. 浏览进程创建过程相关的关键代码
  4. 创建的新进程是从哪里开始执行的?
  5. 使用gdb跟踪创建新进程的过程

 

操作系统的三大管理功能:进程管理、内存管理、文件系统;

PCB task_struct中:进程状态、进程打开的文件、进程优先级信息;

PID唯一的标识进程;

创建一个新进程在内核中的执行过程

1.使用系统调用clone、fork、vfork均可创建一个新进程,但都是通过调用do_fork来实现进程的创建;

2.复制父进程PCB--task_struct来创建一个新进程,要给新进程分配一个新的内核堆栈;

3.修改复制过来的进程数据,比如pid、进程链表等等执行copy_process和copy_thread

4.p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶

p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

7.可执行程序的装载

(一)预处理、编译、链接和目标文件的格式

1.可执行程序是怎么得来的

2.目标文件的格式ELF 

3.静态链接的ELF可执行文件和进程的地址空间

(二)可执行程序、共享库和动态加载

1.装载可执行程序之前的工作

2.装载时动态链接和运行时动态链接应用举例

(三)可执行程序的装载

1.可执行程序的装载相关关键问题分析

2.sys_execve的内部处理过程

3.使用gdb跟踪sys_execve内核函数的处理过程

4.可执行程序的装载与庄生梦蝶的故事

5.浅析动态链接的可执行程序的装载

8.进程的切换和系统的一般执行过程

(一)进程切换的关键代码switch_to分析

1.进程进度与进程调度的时机分析

2.进程上下文切换相关代码分析

(二)Linux系统的一般执行过程

1.Linux系统的一般执行过程分析

2.Linux系统执行过程中的几个特殊情况

3.内核与舞女

(三)Linux系统架构和执行过程概览

1.Linux操作系统架构概览

2.最简单也是最复杂的操作——执行ls操作

3.从CPU和内存的角度看Linux系统的执行

(四)特殊情况

    通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;

内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;

创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;

加载一个新的可执行程序后返回到用户态的情况,如execve 

 

每周学习情况汇总

第一周:http://www.cnblogs.com/20135105wangxc/p/5225876.html

第二周:http://www.cnblogs.com/20135105wangxc/p/5247948.html

第三周:http://www.cnblogs.com/20135105wangxc/p/5272081.html

第四周:http://www.cnblogs.com/20135105wangxc/p/5298136.html

第五周:http://www.cnblogs.com/20135105wangxc/p/5323204.html

第六周:http://www.cnblogs.com/20135105wangxc/p/5349065.html

第七周:http://www.cnblogs.com/20135105wangxc/p/5368736.html

第八周:http://www.cnblogs.com/20135105wangxc/p/5398216.html

 

 

王雪铖

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

posted on 2016-04-29 22:22  20135105  阅读(432)  评论(0编辑  收藏  举报