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

学习笔记链接汇总

第一周学习笔记 计算机是如何工作的

第二周学习笔记 操作系统是如何工作的

第三周学习笔记 Linux内核源代码简介

第四周学习笔记 扒开系统调用的三层皮(上)

第五周学习笔记 扒开系统调用的三层皮(下)

第六周学习笔记 进程的描述和进程的创建

第七周学习笔记 可执行程序的装载

第八周学习笔记 进程的切换和系统的一般执行过程

总结

通过八周的学习获得了很多知识。

首先,通过网课老师形象生动的讲述和描述一些专业词汇,使我更加深刻的记住并掌握了这些内容:动态的展示堆栈的变化,更容易理解一段汇编代码;分析操作系统的工作,记住了三大法宝,这引领我们学习后续课程;扒开系统调用三层皮,从理论知识入手,了解三层皮:API xyz,中断向量system_call,中断服务程序sys_xyz,再从操作入手,使用gdb跟踪;中断是学习中很重要的一点,进程切换、系统调用都离不开中断。

其次,在这八周的学习中,从打开电脑进程初始化到启动进程到进程切换,完整的梳理了我们平时使用计算机中各个应用程序之间如何协同操作,让我更加了解计算机的工作原理。

最后,通过网络学习这一学习方式以及“听课+作业+互评”学习模式,能够把自己学到的知识通过网络分享给其他人,同时也能够随时向他人学习弥补自己在学习上的漏洞,很多时候课上的知识没有很好的理解,但是浏览其他人的博客会非常详细的描述某个知识,这样就更加容易的掌握知识。

总之,人外有人天外有天,学无止境。

听着课

(一)计算机是如何工作的

  • 冯诺依曼体系结构——核心:存储程序计算机;

  • X86汇编基础

(二)操作系统是如何工作的

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

  • 在my_schedule函数中,完成进程的切换。进程的切换分两种:

    1.下一个进程没有被调度过;
    2.下一个进程被调度过,可以通过下一个进程的state知道其状态。

    进程切换通过内联汇编代码实现,需要保存之前的进程的eip和堆栈,然后将新进程的eip和堆栈的值存入相对应的寄存器中。

(三) 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之前,也可在后

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

  • 三层皮:API xyz,中断向量system_call,中断服务程序sys_xyz

  • 系统是通过中断的方式将用户态转换为内核态,并通过调用系统函数来实现系统功能。

  • 系统调用是一个软中断,中断号是0x80——通过int 0x80,触发系统调用。

  • 嵌入汇编格式为:

    asm ( assembler template
    : output operands /* optional /
    : input operands /
    optional /
    : list of clobbered registers /
    optional */
    );

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

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

  • 使用gdb跟踪

    make rootfs:自动编译,生成根文件系统,自动启动.
    (gdb)list 查看代码.
    (gdb)s 单步调试进入函数体.
    (gdb)n 单步调试不进入函数体.

  • 给MenuOS增加time和time-asm命令、添加了fork(详见第五周学习笔记

(六) 进程的描述和进程的创建

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

  • 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; //调度到子进程时的第一条指令地址

(七) 可执行程序的装载

  • Linux内核装载和启动一个可执行程序

    1.创建新进程
    2.新进程调用execve()系统调用执行指定的ELF文件
    3.调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;
    (以上系统调用终止后,新进程开始执行放在可执行文件中的代码。)

  • 当ELF被load_elf_binary()装载完成后,函数返回至do_execve()在返回至sys_execve()。ELF可执行文件的入口点取决于程序的链接方式:

    1.静态链接:elf_entry就是指向可执行文件里边规定的那个头部,即main函数处。
    2.动态链接:可执行文件是需要依赖其它动态链接库,elf_entry就是指向动态链接器的起点。

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

  • schedule()函数负责调度;

  • linux系统的一般执行过程:

    X正在运行--->发生中断,可能陷入内核,CPU自动保存加载--->SAVE_ALL保存现场--->调用schedule,switch_to进程上下文切换--->标号1之后运行Y(之前有进行准备动作)--->restore_all恢复现场--->iret- pop cs:eip/ss:esp/eflags from kernel stack--->继续运行用户态进程Y

  • 特殊情况

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

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

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

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

Mooc总结——Linux内核分析的更多相关文章

  1. Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

    姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...

  2. Linux内核分析笔记

    我在MOOC<Linux内核分析>的学习笔记,这里只做个索引! 计算机是如何工作的

  3. 【MOOC EXP】Linux内核分析实验八报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...

  4. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

  5. 【MOOC EXP】Linux内核分析实验六报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述和进程的创建 知识点梳理: ...

  6. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  7. 【MOOC EXP】Linux内核分析实验二报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [操作系统是如何工作的]   教学内 ...

  8. 【MOOC EXP】Linux内核分析实验三报告

     程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...

  9. 【MOOC EXP】Linux内核分析实验四报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [使用库函数API和C代码中嵌入汇编代 ...

随机推荐

  1. IDEA设置注释的颜色

    IDEA默认的灰色注释确实让人看不清,但如果把灰色调成黑色又和代码的颜色相同了,所以,不如给注释添加上绿色的背景,又护眼又容易分辨 新版本的IDEA打开Settings——Editot——Color ...

  2. Alpha冲刺! Day10 - 砍柴

    Alpha冲刺! Day10 - 砍柴 今日已完成 晨瑶:处理一些杂碎: 反思. 昭锡:主页添加时间选择器,实现随机分布的光点与数据绑定. 永盛:定下来了 MVC 的许多东西,完成 Router 的样 ...

  3. Beta冲刺! Day4 - 砍柴

    Beta冲刺! Day4 - 砍柴 今日已完成 晨瑶:追进度 昭锡:改主页UI(还在 永盛:完成大部分接口和接口文档,上线代码 立强:文章去广告,适配手机屏幕.第三方编辑器整合到记录模块. 炜鸿:完成 ...

  4. [ISE 14.7]Fail to Link the designer导致无法仿真问题

    一.当前配置 操作系统:WIN 8.1 64位 软件:Xilinx ISE 14.7 二.解决方法 首先,似乎64位的binary都有些问题,所以先把ISE Design Suite 14.7这个快捷 ...

  5. Scout YYF I POJ - 3744(矩阵优化)

    题意:一条路上有n个地雷,给出地雷的位置.某人从起点(位置1)出发,走一步的概率是p,走两步的概率是(1-p),然后问有多少概率走过这个雷区. 思路: 只要走过最后一个地雷就代表走过雷区了. 而每到 ...

  6. 完美解决centos安装linux后不能上网的问题

    vi / etc /sysconfig/network-scripts/ifcfg-eth0 配置ip地址 DEVICE=eth0 HWADDR=00:0C:29:8C:F7:6F TYPE=Ethe ...

  7. Vue2 第四天学习(Vue的生命周期)

    阅读目录 1.理解VUE---混合 2.Vue实例化选项 3.Vue实例化的生命周期 回到顶部 1.理解VUE---混合 在了解Vue生命周期之前,我们先来学习Vue中的混合吧: 为什么需要使用混合? ...

  8. 在模拟器上运行Android项目时报错:DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs

    今天在Android Studio自带的模拟器上运行项目的时候,出现如下所示Error:当点击ok后,发现模拟器不能运行程序. 解决办法: 更改Android Studio中的设置: File---& ...

  9. 即时通讯IM工具

    即时通讯IM工具,目前已知的服务及收费方式:一.专业第三方IMLeanCloud(按需收费)LeanCloud融云(免费+收费)融云即时通讯云环信(免费+收费)环信-即时通讯云领导者云之讯(免费+收费 ...

  10. Linux下ftp安装配置及三种用户的验证

    一.原理简介 二.安装配置 三.三种用户的验证 一.简介 FTP即文件传输协议(File Transfer Protocol),完成各主机的文件共享功能,基于客户端-服务器的协议,工作在应用层,tcp ...