视频内容知识学习 一.用户态.内核态和中断 1.内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态:处于低的执行级别下,代码只能在级别允许的特定范围内活动.在日常操作下,执行系统调用的方式是通过库函数,库函数封装系统调用,为用户提供接口以便直接使用. 3.Intel x86 CPU有四种不同的执行级别0-3,Linux只使用了其中的0 3级分别表示内核态和用户态.cs寄存器的最低两位表明了当前代码的特权级,00或者11. 4.内核态cs:e…
视频学习 可执行文件是怎么得来的? .c汇编成汇编代码.asm,然后再汇编成目标码.o.然后在连接成可执行文件,然后加载到内存可执行了. 对hello.c文件预处理(cpp),预处理负责把include的文件包含进来及宏替换等工作. 把hello.cpp编译成汇编代码hello.s 再把编译代码hello.s编译成目标代码hello.o(二进制的文件),然后把hello.o链接成可执行文件hello. hello是使用共享库的,再静态编译,把所有完全依赖的都放在hello.static的内部.…
视频知识学习 1.fork()函数被调用一次,但返回两次: 2.Linux通过复制父进程来创建一个子进程,通过调用fork来实现: 3.Linux会为每个子进程动态的分配一个task_struct结构. 创建一个新进程在内核中的执行过程 fork.vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建: Linux 通过复制父进程来创建一个新的进程,那么这就给我们理解这一个过程提供一个想象的框架: 复制一个PCB--task_struct 1. e…
缓冲区溢出漏洞实验 一.实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 系统用户名shiyanlou 实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.输入命令安装一些用于编译32位C程序的东西: sudo apt-g…
测试3的实验: 1. 用gcc -g编译vi输入的代码 2. 在main函数中设置一个行断点 3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点 4. 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息 首先建立测试1的基础上 在测试2的时候遇到了一个小问题,调用cd 文件,提示不存在此文件,具体不知道什么原因,可是并没有影响后面的实验. 测试结果: 并不复杂的实验自己重复做了好多次才成功,说明平时知识掌握不牢固,还有比较多的问题需要解决…
视频知识学习 给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.再main()函数中增加MenuConfig 3.增加对应的Time函数和TimeAsm函数(这里的函数要换成我们自己编写的使用系统调用的函数,比如mkdir和mkdirAsm) 4.make rootfs (帮我们自动编译自动生成根文件系统,自动帮我们启动起来menuos) 使用gdb跟踪系统调用内核函数sys_time 删除旧的的menu目录,重新下载新的版本.操作如下: $ cd /home/…
2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-output -S -o hello.s hello.cpp gcc -x assembler -c hello.s -o hello.o-m32 gcc -o hello hello.o 娄老师在第一次讲课时很生动的使用:"E->S->C"与"I->S->…
2018-2019-1 20189221 <Linux内核原理与分析>第七周作业 实验六 分析Linux内核创建一个新进程的过程 代码分析 task_struct: struct task_struct { volatile long state; //进程状态/* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; // 指定进程内核堆栈 pid_t pid; //进程标识符 unsigned int rt_priority; /…
2018-2019-1 20189221 <Linux内核原理与分析>第六周作业 实验五 实验过程 将Fork函数移植到Linux的MenuOS fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程.在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程.在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID.通过fork返回的值来判断当前进程是子进程还是父进程. 启动MenuOS: 在test.c中添加代码如下: int…
2018-2019-1 20189221<Linux内核原理与分析>第五周作业 实验四 实验过程 当用户态进程调用一个系统调用时,cpu切换到内核态并开始执行一个内核函数. 在Linux中是通过int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常 传参:内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数(使用eax寄存器) 系统调用也需要输入输出参数,例如:实际的值.用户态进程地址空间的变量的地址.包含指向用户态函数的指针的数据…
2018-2019-1 20189221<Linux内核原理与分析>第三周作业 实验二 完成一个简单的时间片轮转多道程序内核代码 实验过程 在实验楼中编译内核 编写mymain.c函数和myinterrupt.c函数实现时间片轮转调用 mymain.c: myinterrupt.c: make: 内核实现: 代码分析 代码使用的是<庖丁解牛Linux内核分析>书中代码: mypcb.h:定义了PCB结构体 #define MAX_TASK_NUM 4 #define KERNEL_…
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为在终端输入的命令,$ 号不需要输入.命令上有 # 的内容为注释,不需要输入 适用人群: 有 C 语言基础 会进制转换以及计算 vim 基本使用 熟悉基本 linux 命令 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一…
<Linux内核原理与分析>第十一周作业 一.本周内容概述: 学习linux安全防护方面的知识 完成实验楼上的<ShellShock 攻击实验> 二.本周学习内容: 1.学习<ShellShock 攻击实验>的背景和理论知识 1.1 实验简介 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,学生需要亲手重现攻击来理解该漏洞,并回答一些问题. 1.2 预备知识 Shellshock,…
<Linux内核原理与分析>第八周作业 一.本周内容概述: 理解编译链接的过程和ELF可执行文件格式 编程练习动态链接库的两种使用方式 使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve 二.本周学习内容: 1.理解编译链接的过程和ELF可执行文件格式 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自最早在 System…
<Linux内核原理与分析>第七周作业 一.本周内容概述: 对Linux系统如何创建一个新进程进行追踪 分析Linux内核创建一个新进程的过程 二.本周学习内容: 1.学习进程的描述 操作系统内核实现操作系统的三大管理功能:进程管理,内核管理和文件系统,其中最核心的功能是进程管理. 在操作系统原理中,我们通过进程控制块PCB描述进程,通常采用一个数据结构struct task_struct来描述进程,其中比较常见的属性如state是进程状态,常见状态有就绪态,运行态和阻塞态. 运行过程如图所示…
<Linux内核原理与分析>第六周作业 一.本周内容概述: 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用 学习系统调用system_call的处理过程,在MenuOS中运行getpid命令,通过gdb跟踪调用time函数的过程 分析system_call代码对应的工作过程 二.本周学习内容: 1.实验楼环境研究MenuOS 1.1 在MenuOS中添加并运行getpid命令 进入LinuxKernel目录,删除menu目录,然后从gi…
<Linux内核原理与分析>第五周作业 一.上周问题总结: 虚拟机将c文件汇编成汇编文件时忘记添加include<stdio.h> gdb跟踪汇编过程不熟练 二.本周学习内容: 1.课本学习 1.1 用户态.内核态和中断 内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态,对所有的指令包括特权指令都可以执行. 用户态:处于低的执行级别下,代码只能在级别允许的特定范围内活动.在日常操作下,执行系统调用的方式是通过库函数,库函数封装系统调用,…
<Linux内核原理与分析>第三周作业 一.上周问题总结: 第二周头脑风暴完成较慢 虚拟机libc配置错误 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境虚拟一个x86的CPU硬件平台 在该环境下输入如下命令: cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage 实践截图如下: QEMU窗口截图如下: 查看mymain.c: 查看myinterrupt.c: 2.实验楼环境完成一个简单的时间片轮转机制内核: 代码…
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件,对数据和设备的操作都是通过一套相同的系统调用接口进行的. Unix内核和相关的系统工具都是用C语言编写成的. Unix进程创建非常迅速. Unix提供了一套简单而稳定的进程间通信原语. Unix现在已经发展为一个支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统. 1.…
第一周作业::对Linux的基本知识进行了了解,并对基本操作进行熟悉和应用. 第二周作业::了解了冯诺依曼体系结构.各种寄存器的功能和汇编指令的作用和功能. 第三周作业::这周主要了解了Linux系统的架构,熟悉了常用的一些命令. 第四周作业::模拟了系统中的时钟中断. 第五周作业:::调试Linux内核,观察系统中代码的执行过程. 第六周作业::了解系统调用,并写一个C语言的代码嵌入系统调用命令. 第七周作业::将写好的系统调用程序部署到menu os上. 第八周作业::了解进程的执行和切换,…
一.实验 1.1task_struct数据结构 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在linux-3.18.6/include/linux/sched.h文件中. 这个结构体定义非常庞大,目测有300多行代码,所以只摘录了部分关键定义: struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */…
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作业:0博客:1.0耗时估计的公式:Y=X+X/N ,Y=X-X/N 第3章 进程管理20 3.1 进程20 进程就是处于执行期的程序(目标码存放在某种存储介质上),但进程并不仅仅局限于一段可执行程序代码.通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存…
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第十一周作业> 这个作业的目标 <缓冲区溢出漏洞实验> 作业正文 ... 本博客链接 一.实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 输…
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第八周作业> 这个作业的目标 <Linux内核如何装载和启动一个可执行程序> 作业正文 https://www.cnblogs.com/wzyxiaowang/p/14057173.html 一.知识点: 1.预处理.编译.链接和目标文件的格式 (1)预处理阶段 :编译器将C源代码中包含的头文件编译进来和执行宏替换等工作. gc…
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业> 这个作业的目标 <分析Linux内核创建一个新进程的过程> 作业正文 https://www.cnblogs.com/wzyxiaowang/p/14020866.html 一.知识点总结 1.进程的描述 1.1 操作系统三大功能:进程管理.内存管理.文件系统 1.2进程描述符:为了管理进程,内核必须对每个进程进行…
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业> 这个作业的目标 <使用gdb跟踪分析一个系统调用内核函数,分析system_call对应的汇编代码工作过程> 作业正文 https://www.cnblogs.com/wzyxiaowang/p/13977300.html 一.给MenuOS添加命令 1.删除之前的menu目录,下载新版本目录 -rm -rf me…
本章的作业依旧包括两部分,1.阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第11,12章. 2.学习MOOC「Linux内核分析」第六讲「进程的执行和进程的切换」,并完成实验楼上配套实验六. 在本次试验中,我们首先新建了一个hello.c的文件,并在里面编辑简单的输出hello world的代码. 调用命令gcc -E -o hello.cpp hello.c -m32编辑出预处理的中间文件hello.cpp.预处理负责把include的文…
这周主要对于以往的知识进行了复习,包括开始的Linux基础,以及对需要学习的新知识进行了复习,也对markdown的语法进行了初步的了解.开始学习markdown的一些基本语法和Linux的一些常用命令. Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系 统上工作离不开使用系统提供的命令.要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统.不同Linux发…
task_struck数据结构 在Linux内核中,通过task_struct这个结构体对进程进行管理,我们可以叫他PCB或者进程描述符.这个结构体定义在include/linux/sched.h中. 鉴于这个结构体的复杂,本文分成多个部分来分析它. 进程状态 进程状态由结构体中的如下代码定义: volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ 其中state的可取的值如下: /* * Task state bitm…
一 .Linux内核创建一个新进程的过程 1. 知识准备 操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理 linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状态和运行状态都是TASK_RUNNING.(这个表示它是可运行的,但是实际上有没有在运行取决于它是否占有 CPU ) fork 被调用一次,能够返回两次.在父进程中返回新创建子进程的 pid:在子进程中返回 0 调用 fork 之后,数据.堆.栈有两份,代码仍然为一份(这个代码段成为两个进程的共享代…