linux安全第六周总结

20135336 王维臻

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

一、总结部分

操作系统内核三大功能:

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

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

进程控制模块: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数据结构

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

时间: 2024-08-28 11:03:15

linux安全第六周总结的相关文章

linux学习第六周总结

linux学习第六周总结 本周共学习4项内容,简单总结一下 shell脚本编程进阶 系统启动和内核管理 selinux 文本处理三剑客之awk 一.shell脚本进阶 编程中的逻辑处理: 顺序执行选择执行循环执行 循环执行 将某代码段重复运行多次重复运行多少次循环次数事先已知循环次数事先未知有进入条件和退出条件r, while, until for循环for 变量名 in 列表;do循环体done执行机制:依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一循环体; 直到列表中的元

Linux系统管理第六周作业【Linux微职位】

1.请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) CentOS系统启动流程如下: POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> GRUB --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init --> (/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --&g

linux第十六周

1.源码编译安装LNMP架构环境: 一.安装Nginx 1.解决依赖 [[email protected] ~]# yum groupinstall 开发工具 服务器平台开发 -y 2.安装 [[email protected] ~]# tar xf pcre-8.37.tar.bz2 -C /usr/local/src/ [[email protected] ~]# tar xf nginx-1.8.0.tar.gz -C /usr/local/src/ [[email protected] 

马哥linux作业第六周

(未完待续,为了对付可恶的51cto夜间审核制度) 1.复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#: vim方法: :%s/^[[:space:]]\+/#&/ %为应用于每一行 s为替换字符串命令: s/替换前字符/替换后字符/ ^[[:space:]] \+: 匹配以多个空格为行首, +要转义 #&:在匹配内容之前加#. &表示在匹配内容之前加入.没有的话是以#替代匹配内容 sed

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

LINUX内核分析第六周学习总结——进程的描述和进程的创建

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 进程的描述 进程描述符task_struct数据结构(一) 进程描述符task_struct数据结构(二) 进程的创建 进程的创建概览及fork一个进程的用户态代码 理解进程创建过程复杂代码的方法 浏览进程创建过程相关的关键代码 创建的新进程是从哪里开始执行的

linux六周第二次课(3月13日)笔记

六周第二次课(3月13日)9.4sed(上)9.5sed (下) 9.4sed(上) 匹配到会连续打印两次 不想把无关的打印出来,加-N. 需要脱意符 不加脱意符,-n后面要加r 匹配两次O 打印出文件第2-5行的用法 打印出文件所有行的用法 打印出包含某个字符的行 9.5sed (下)set区分大小小的用 编辑文件 加入一行 半年的日志,删除前五个月,只留最后一个月.根据时间,用grep查行数.用vim打开文件,非常耗费内存,用set可以直接删掉. 删除带有user的行 替换功能 加上r才能生

Linux学习笔记第六周第四次课(3月15日)

六周第四次课(3月15日) 复习 扩展 打印某行到某行之间的内容http://ask.apelearn.com/question/559 按关键词打印内容,#sed -n '/\[abcd\]/,/\[rty\]/'p test 按行数打印内容,# sed -n '4,8'p test sed转换大小写 http://ask.apelearn.com/question/7758 sed中,使用\u表示大写,\l表示小写 1. 把每个单词的第一个小写字母变大写: sed 's/\b[a-z]/\u

第六周作业。

第六周作业.额,暂时不知道写什么好.那就写写如何翻越GFW   (科学上网)的教程吧.基于Shadow socks的教程.可能不是第一个,也可能不是最后一个.但是这也算是科普吧.毕竟连翻越GWF(科学上网)能力都没有何必谈的上是一个好的Programer呢?. ========================================================== 顺便说一句:Fk GFW. ==============================================