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

总结部分:

操作系统内核三大功能:

  进程管理,内存管理,文件系统

最核心的是进程管理

为了管理,首先要对每一个进程进行描述。进程描述符提供了所有内核需要了解的信息。

进程控制模块:task_struct(抽象task_struct的简化图)

  next_task,prev_task进程链表的管理

  tty_struct控制台

  fs_struct文件系统描述

  file_struct打开的文件描述符

  mm_struct内存管理的描述

  signal_struct信号的描述

Linux-3.18.6/include/linux/sched.h里的代码

  1235代码state进程运行状态

  stack指定进程的内核堆栈

  flags每个进程的标识符

  1245CONFIG SMP条件编译,多处理器时使用到的。

  1251on_rq运行队列

  1295list_head tasks进程链表(双向链表)

  linux进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状态和运行状态都是TASK_RUNNING。(这个表示它是可运行的,但是实际上有没有在运行取决于它是否占有CPU)

  1330进程标识符pid

  1349进程的父子关系

  1360pid_link pids[PIDTYPE_MAX]进程的哈希表

Linux-3.18.6/arch/x86/include/asm/processor.h

  thread_struct(很重要)

进程的创建概括以及fork()一个进程

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

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

    Kthreadd所有线程的祖先

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

  进程是如何创建:

    先看怎么在用户态创建一个子进程

    

    Pid==0是下面两个模块都会被执行,fork()系统调用在父进程子进程各返回一次,父进程中返回0,子进程中返回子进程的pid

理解进程创建过程复杂代码的方法

    系统调用:用户态int0x80(由于是陷入进入内核的,所以机器自动保存与转换堆栈;压入用户ss,压入用户esp,压入EFLAGS,压入cs,压入eip)

    中断指令跳转到内和空间sysstem_call(压入eax,把传递参数的寄存器全部压栈)执行结束后RESTORE_ALL(弹栈传递参数的寄存器,弹栈eax,iret弹栈      int0x80压栈的东西)

    Fork()的也是一个系统调用,它的过程图

    

    子进程复制了父进程的所有信息,然后做适当修改,它也会调度执行。当它被CPU调度的时候从哪里开始执行呢?子进程在内核里执行,在内核处理程序从哪里开始    执行的?与mykernel类似。

    fork,vfork,clone三个系统调用都是通过调用do_fork来创建创建一个新的进程。

先我们设想,它应该如何创建一个进程,我们画一个框架,然后再通过代码求证,再对我们的框架进行修正。

我们的框架:

    1.创建新进程都是通过复制父进程的信息。

    2.创建新进程的过程中需要做哪些事情:

      复制pcb

      还需要修改复制的父进程的pcb

      还需要分配新的内核堆栈

      子进程需要从fork返回到用户态,那么它内核堆栈也需要从父进程中拷贝一些过来,不然不能返回

      还有thread.sp(调度到子进程时的内核栈顶)和thread.ip(调度到子进程的第一条指令地址)

浏览创建进程的相关关键代码

Linux-3.18.6/kernel/fork.c

  

  1632copy_process创建一个进程的主要代码

  

    1240dup_task_struct复制pcb(看具体怎么复制)

    

    

      320arch_dup_task_struct(tsk,orig)执行复制当前进程

      

       293*dst=*src数据结构的指针的值复制

      316alloc_thread_info_node(tsk,node),分配内核空间堆栈的作用和thread_info合在一起的集合体

      153实际上是创建了一个一定大小的页面。一部分存放alloc_thread_info,一部分存放堆栈

      

335setup_thread_stack

          

          

1240p=dup_task_struct(current);复制子进程的pcb

      

                   1396 copy_thread

Linux-3.18.6/arch/x86/kernel/process_32.c

135*childregs=task_pt_regs(p);

159*childregs=*current_pt_regs();将父进程的现在的状态信息赋值给子进程(拷贝内核堆栈诗句和指定新进程的第一条指令)

164p.thread.ip通过ret_from_fork得到。

创建的新进程是从哪里开始执行的?

Linux-3.18.6/arch/x86/include/asm/ptrace.h

Pt_regs:系统调用压栈的内容(SAVE_ALL的全部内容)

Linux-3.18.6/arch/x86/kernel/entry_32.s

290entry(ret_from_fork)新进程是从这里开始执行的

505syscall exit内核堆栈返回到系统调用以前的状态继续执行

实验部分:

使用gdb跟踪调试创建新进程的过程

cd LinuxKernel

rm menu –rf

git clone https://github.com/mengning/menu.git

cd menu

mv test_fork.c test.c//覆盖test_fork.c

make rootfs

看到增加了一个fork

使用gdb跟踪调试内核

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继续运行

b sys_clone

b do_fork

b dup_task_struct

b copy_process

b copy_thread

b ret_from_fork

copy_process

dup_task_struct

将父进程的现在的状态信息赋值给子进程(拷贝内核堆栈诗句和指定新进程的第一条指令)

将子进程的栈顶保存

线程的pid保存

直到syscall_exit就跟踪不到了。

思考部分:

  理解创建一个新进程如何创建修改task_struct数据结构

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

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

    

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

时间: 2024-11-03 23:19:36

linux及安全第六周总结——20135227黄晓妍的相关文章

linux及安全第三周总结——20135227黄晓妍

总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init   内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 Kernel 核心代码 installing the kernel source:如何安装内核源代码 构建Linux系统os 使用gdb跟踪内核运行过程 -S cpu在初始化之前将其冻结 -s 在tcp端口创建server 分析start_kernel函数 Trap init 涉及中断 这个函数用来做

linux及安全第二周总结——20135227黄晓妍

实验部分: 首先运行结果截图 代码分析: Mypcb.h /* *  linux/mykernel/mypcb.h * *  Kernel internal PCB types * *  Copyright (C) 2013  Mengning * */ #define MAX_TASK_NUM        4 #define KERNEL_STACK_SIZE   1024*8 /* CPU-specific state of this task */ struct Thread { uns

信息安全系统设计基础实验五—20135214万子惠20135227黄晓妍

北京电子科技学院(BESTI) 实验报告 课程:信息安全系统设计基础               班级:1352 姓名:黄晓妍 万子惠 学号:20135227 20135214 成绩:指导教师:娄佳鹏           实验日期:2015.11.24 实验密级:预习程度: 实验时间:15:30~18:00 仪器组次:必修/选修:       必修     实验序号:五 实验名称:简单嵌入式WEB 服务器实验 实验目的与要求: 掌握在 ARM 开发板实现一个简单WEB 服务器的过程. 学习在 A

信息安全系统设计基础实验四—20135214万子惠20135227黄晓妍

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计系统基础                        班级:1352 姓名:万子惠 黄晓妍 学号:20135214 20135227 成绩:             指导教师:娄嘉鹏    实验日期:2015.11.16 实验密级:         预习程度:      实验时间:15:30~18:00 仪器组次: 01       必修/选修:必修       实验序号:四 实验名称:外设驱动程序设计 实

20135227黄晓妍实验四

北京电子科技学院(BESTI) 实     验    报     告 课程:Java 班级: 1352    姓名:黄晓妍   学号:20135227 成绩:              指导教师:娄嘉鹏   实验日期:2015.6.9 实验密级:          预习程度:          实验时间:15:30~18:00 仪器组次:27         必修/选修:选修     实验序号:04 实验名称: 网络编程与安全 实验目的与要求:    1.掌握Java网络编程的方法: 2.掌握J

信息安全系统设计基础实验三—20135227黄晓妍 20135214万子惠

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计系统基础           班级:   1352 姓名:黄晓妍 万子惠 学号:20135227 20135214 成绩:             指导教师:娄佳鹏    实验日期:2015.11.24 实验密级:         预习程度:        实验时间:15:30~18:00 仪器组次:          必修/选修:必修     实验序号:03 实验名称:    实时系统的移植 实验目的与要求

信息安全系统设计基础期末总结—20135227黄晓妍

期末总结 每周读书笔记 第二周:http://www.cnblogs.com/angelahxy/p/4818978.html 第三周:http://www.cnblogs.com/angelahxy/p/4839577.html 第四周:http://www.cnblogs.com/angelahxy/p/4852328.html 第五周:http://www.cnblogs.com/angelahxy/p/4869061.html 第六周:http://www.cnblogs.com/ang

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

学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Linux中用户管理命令/系统相关命令/文件目录相关命令/打包压缩相关命令/比较合并相关命令/网络相关命令等 4. 熟练应用“搜索”进行举一反三的学习 二.学习资源 1. 课程资料:https://www.shiyanlou.com/courses/413   实验一,课程邀请码:W7FQKW4Y 2. Li

信息安全系统设计基础第十一周学习总结—20135227黄晓妍

第8章异常控制流 控制流:控制转移序列. 控制转移:从一条指令到下一条指令. 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流. 一.异常 1.异常的剖析,如下图所示: 异常:控制流中的突变,用来响应处理器状态的某些变化. Icurr:当前指令 事件:状态变化 2.异常处理 异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序. 异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号.异常号是到异常