linux及安全期中总结——20135227黄晓妍

时间:2023-01-14 12:22:50

Linux及安全期中总结

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

第一周 计算机是如何工作的

http://www.cnblogs.com/angelahxy/p/5218575.html

  • 冯诺依曼结构

    将程序指令存储器和数据存储器合并在一起的存储器结构。
  • 计算机是怎么工作的?存储器负责存储指令,cpu负责解释指令。它们通过总线连接。

    Cpu是如何解释指令:ABI:程序和 cpu接口界面,接下来主要学习汇编语言。
  • 汇编语言基础

    为什么学习:汇编语言是最接近机器语言的编程语言,能帮助我理解cpu是如何解释指令的。
    • 寄存器:通用寄存器(编程中可以直接使用的寄存器)。段寄存器
    • 常见指令:

      movl七种寻址方式

      pop,push,ret,call
    • 堆栈
  • 堆栈详细变化过程举例。

    具体见博客

第二周 操作系统是如何工作的

http://www.cnblogs.com/angelahxy/p/5245345.html

  • 重点理解myinterruput.c里进程切换的代码。(切换进程指的是下一个切换上执行的进程)

    分成两种情况,第一种是切换到的进程是执行过的进程,第二种是切换到的进程是新进程。首先第一种,先将当前进程的ebp压栈,然后将当前进程的栈顶指针esp保存到链表结构当前进程prev->thread.sp中,再将链表中切换的进程的next->thread.sp 复制给栈顶指针esp.将链表中当前进程prev->thread.ip存入函数的入口的值,再将切换进程的next->thread.ip压栈。然后第二种,先建好链表,再执行上述过程。

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

http://www.cnblogs.com/angelahxy/p/5270001.html

  • Linux启动的理解:

    在内核引导结束并启动init之后,系统就转入用户态的运行,在这之后创建的一切进程,都是在用户态进行。

      就是init进程虽然是从内核开始的,即在前面所讲的init/main.c中的init()函数在启动后就已经是一个核心线程,但在转到执行init程序(如 /sbin/init)之后,内核中的init()就变成了/sbin/init程序,状态也转变成了用户态,也就是说核心线程变成了一个普通的进程。

第四周 扒开系统调用的三层皮

http://www.cnblogs.com/angelahxy/p/5296700.html

  • 系统调用“三层皮”

    API

    中断向量

    中断服务程序

    当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。

    Linux中是通过执行int $0x80来执行系统调用,这条汇编指令产生向量为128的编程异常;即中断向量0x80与System_call绑定起来。

    系统调用号将函数xyz()和中断服务程序sys_xyz关联起来。

  • 系统调用的过程:先将系统调用号放在%eax里,相当于API和中断服务程序连接的桥梁,然后执行中断指令int$0x80,在堆栈上保存用户态栈顶地址,当时的状态字,当时的cs:eip值;内核态栈顶地址,当时的状态字,中断处理程序入口。然后系统调用的函数开始在内核执行,执行的结果(返回值)保存在%eax里,再由%eax传入gid,然后弹栈恢复现场。

第五周 扒开系统调用的三层皮 下

http://www.cnblogs.com/angelahxy/p/5313626.html

  • system_call对应的汇编代码的工作过程

    sys_call只是汇编代码的声明,不是函数,所以gdb无法跟踪sys_call的位置,但是sys_call里包含的系统调用的时机非常重要:

  • 中断向量int0x80如何与sys_call绑定的呢?

    \init\main.c里的start_kernel里有trap_init()函数

\arch\x86\kernel\traps.c中有一个函数,将SYSCALL_WECTOR(系统调用中断向量)和system_call汇编代码的入口绑定。完成初始化。

  • 系统调用处理过程

    用户态的函数根据API接口,申请一个系统调用,触发int0x80中断向量指令,中断int指令(保护现场)保存用户态的栈顶地址,当时的状态字,当时的cs:eip值和内核态的栈顶指针,当时的状态字,和中断处理程序的入口(sys_call),sys_call_table根据系统调用号查找对应的函数,如果当前进程需要调度或者有其他的信号需要处理,则分别调度和处理,如果不需要,运行函数,恢复现场(restore_all), 最后iret结束。

第六周 进程的描述和进程创建

http://www.cnblogs.com/angelahxy/p/5340674.html

  • Cpu_idle启动两个线程:(0号进程是所有线程的祖先)

   - Kernel_init用户态的进程启动,所有用户态进程的祖先(1号进程是所有进程的祖先)

   - Kthreadd所有线程的祖先

在shell命令行创建进程的本质一样:先复制一份进程描述符,0号进程是手工写进代码的,1号进程复制0号的pcb,然后根据1号进程的需要把它的pid等等信息修改掉,再加载一个init可执行程序。
  • 理解创建一个新进程如何创建和修改task_struct数据结构

    一般通过系统调用来创建新的进程。fork(),vfork(),clone()都是通过调用do_fork来创建新进程的。要通过复制父进程的信息pcb(task_struct),然后给新    的子进程分配内核堆栈,再通过copy_process来修改子进程的task_struct.

  • 特别关注新进程是从哪里开始执行的?为什么从哪里能顺利执行下去?即执行起点与内核堆栈如何保证一致。

    从ret_from_thread开始执行。子进程被创建以后是在内核运行的,因为从这里开始复制父进程的task_struct,分配内核堆栈,创建进程也是一种系统调用,在内核堆栈中,执行int0x80,保存现场,来保证执行起点和内核堆栈的一致性。

第七周 可执行程序的装载

http://www.cnblogs.com/angelahxy/p/5361076.html

  • 新的可执行程序是从哪里开始执行的?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?

新的可执行程序是从程序的头部,也就是main函数开始执行的,被装载到内核的地址空间是0x8048x00(x是整数)。

  • 为什么execve系统调用返回后新的可执行程序能顺利执行?

    要得到返回之后能顺利执行的原因,让我们来先简单地分析一下整个过程。父进程在用户态中创建一个新的子进程,在内核中给子进程分配空间,子进程从ret_from_fork开始,先修改eax=0,再将五个值压栈,在执行execve时,需要将内核堆栈中以前压栈的五个之中的两个sp,ip做修改,修改的地址映射新可执行程序的入口,这样一来,新的可执行程序就可以顺利执行了。

  • 对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?

    对于静态链接和动态链接在execve系统调用返回时有很大的不同,静态链接相对于动态链接来说要简单许多,它们的不同之处主要在修改的sp,ip的值上。静态链接直接修改为新的可执行程序的入口即可(即0x8048x000,也就是main函数处);对于动态链接,让我们先来分析一下动态链接的过程。动态链接需要先加载动态链接器ld,然后由动态连接器加载程序中需要加载的动态库,以及其他的一些资源(这是一个遍历动态库依赖关系图的过程),然后才能开始执行新的可执行程序。所以对于动态链接,execve系统调用返回到动态链接加载器ld.

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

http://www.cnblogs.com/angelahxy/p/5389036.html

  • 从swtich_to理解进程上下文切换和中断上下文切换:

    中断上下文切换是从用户态陷入内核,保存的是用户态进程的堆栈和状态,以及内核的堆栈和状态,在内核执行完毕以后,弹栈用户态进程的eip,flag等等,返回到用户态进程,继续执行。

    进程上下文切换都发生在内核态,当一个进程时间片使用完,或者有优先级更高的(实时或者普通)进程进入进程就绪队列中,发生抢占时,先调用schedule,由pick_next_task选择下一个进程,swtich_to需要将当下的进程的堆栈和状态压栈保存,然后弹栈下一个进程的堆栈和状态,运行下一个进程。

收获和遗憾

   从还在寒假中到看第一个视频,那时候视频里还有年夜里的鞭炮声,一直到后来每周周一准时下载视频观看,linux内核分析到此算是一个小结。目前为止,学习Linux最困难的部分是还是入门的时候。当然因为以前的学习基础,这次学习孟宁老师的课不算太吃力。堆栈分析在学习汇编的时候吃得算透,所以学习起来还是比较轻松。收获最大的地方是老师为我揭开了linux内核的神秘面纱。在学习中,我看到了内核代码,分析里一些比较重要的内核中断,创建新进程,进程切换,加载进程的比较重要的关键代码。甚至还自己编写了系统调用函数,让我和内核有了初步的接触。学习真的是一个有趣的过程,学得越认真,基础越扎实,往后效率就越高。特别是遇到以前学得特别起劲的汇编时,想着,计算机的课程的门门相通,这里没有学懂,这笔账就会一直着,以后遇到这个部分又会吃力。所以学习还是要对得起自己。从来没想过要抄谁的作业,抄谁的考试,我很感谢一直抱着这样想法的自己。虽然现在还是有很多不足,很多不明白的地方,不欺骗自己地接着学下去。最大的遗憾是没有能和视频同步阅读完

linux及安全期中总结——20135227黄晓妍的更多相关文章

  1. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  2. linux安全第一周总结——20135227黄晓妍

    实验部分: 我将源代码做了修改,将其中一个数字修改为我学号27 2.在实验楼环境下将其保存为text.c并将其编译,得到text.s 3.将.开头的多余的语句删去了之后,我得到了32位环境的汇编代码 ...

  3. linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍

    第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...

  4. linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍

    第三章 (由于linux不区分进程和线程,所以它们在linux中被称为task,也叫任务) 总结:本章主要包括进程以及线程的概念和定义,Linux内核如何管理每个进程,他们在内核中如何被列举,如何创建 ...

  5. linux及安全第八周总结——20135227黄晓妍

    实验部分 实验环境搭建 -rm menu -rf git clone https://github.com/megnning/menu.git cd menu make rootfs qemu -ke ...

  6. linux及安全第七周总结——20135227黄晓妍

    实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...

  7. linux及安全第六周总结——20135227黄晓妍

    总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...

  8. linux及安全第五周总结——20135227黄晓妍

    (注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了.本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分.) 实验部分 使用g ...

  9. linux及安全第四周总结——20135227黄晓妍

    总结部分: 用户态和内核态: 前提知识:cpu有几种不同指令执行的级别 用户态:代码的掌控范围受限制 内核态:高级别,代码课执行特权指令,访问任意物理地址. 权限设置的意义:没有的话,系统容易啊崩溃, ...

随机推荐

  1. PHP 中:: -> self $this 操作符的区别

    访问PHP类中的成员变量或方法时, 如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::, 反之如果被引用的变量或者方法没有被声明成 const ...

  2. mock.js-无需等待,让前端独立于后端进行开发

    概述 首先啦,我不认识mock.js的作者,带着需求找到mock.js让我觉得很惊艳. 相对于其他同类的框架的实现,mock.js超出了我的意料. 基于 数据模板 生成模拟数据. 基于 HTML模板 ...

  3. 【转】awk、nawk、mawk、gawk的简答介绍

    来自http://blog.sina.com.cn/s/blog_3d2d79aa0100h47h.html awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准 ...

  4. php strpos 用法实例教程

    定义和用法该strpos ( )函数返回的立场,首次出现了一系列内部其他字串. 如果字符串是没有发现,此功能返回FALSE . 语法 strpos(string,find,start) Paramet ...

  5. Js面向对象和数据类型内存分配(转)

    一 Js基本数据类型以及内存情况 1 Undefined Undefined类型只有一个值undefined,在使用了声明但未初始化的变量的时候,这个变量值就是undefined 1 var hi; ...

  6. set_time_limit() 控制页面运行时间

    当你的页面有大量数据时,建议使用set_time_limit()来控制运行时间,默认是30s,所以需要你将执行时间加长点,如 set_time_limit(300)  ,其中将秒数设为0 ,表示持续运 ...

  7. C#中常用关键字的作用

    ***new关键字:1.在堆中开辟空间 2.在开辟的空间中创建对象 3.调用对象的构造函数***this关键字:1.代表当前类的对象 2.调用自己的构造函数 ***return:1.立即结束本次方法2 ...

  8. hdu1038

    #include <stdio.h> #define P 3.1415927 #define toFeet(x) x/12.0 #define toMiles(x) x/5280.0 in ...

  9. 手把手教你做个AR涂涂乐

    前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...

  10. 前端工程师:电信专业转前端是如何拿到阿里、腾讯offer的?

    1.个人情况 ● 211本科 985硕士 电信专业 女生 ● 16年3月开始学习前端 ● 16年7月开始实习,共五家实习经历(不是特别厉害的厂) ● 秋招拿到两个offer(阿里.腾讯).没错只有这两 ...