linux安全第二周总结

作者:20135336  王维臻

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

一、实验过程

cd LinuxKernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzImage

然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c

1.mymain.c代码

/*
 *  linux/mykernel/myinterrupt.c
 *
 *  Kernel internal my_timer_handler
 *
 *  Copyright (C) 2013  Mengning
 *
 */
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/tty.h>
#include <linux/vmalloc.h>

#include "mypcb.h"

extern tPCB task[MAX_TASK_NUM];
extern tPCB * my_current_task;
extern volatile int my_need_sched;
volatile int time_count = 0;

/*
 * Called by timer interrupt.
 * it runs in the name of current running process,
 * so it use kernel stack of current running process
 */
void my_timer_handler(void)
{
#if 1
    if(time_count%1000 == 0 && my_need_sched != 1)
    {
        printk(KERN_NOTICE ">>>my_timer_handler here<<<\n");
        my_need_sched = 1;
    }
    time_count ++ ;
#endif
    return;
}

void my_schedule(void)
{
    tPCB * next;
    tPCB * prev;

    if(my_current_task == NULL
        || my_current_task->next == NULL)
    {
        return;
    }
    printk(KERN_NOTICE ">>>my_schedule<<<\n");
    /* schedule */
    next = my_current_task->next;
    prev = my_current_task;
    if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */
    {
        /* switch to next process */
        asm volatile(
            "pushl %%ebp\n\t"         /* save ebp */
            "movl %%esp,%0\n\t"     /* save esp */
            "movl %2,%%esp\n\t"     /* restore  esp */
            "movl $1f,%1\n\t"       /* save eip */
            "pushl %3\n\t"
            "ret\n\t"                 /* restore  eip */
            "1:\t"                  /* next process start here */
            "popl %%ebp\n\t"
            : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
            : "m" (next->thread.sp),"m" (next->thread.ip)
        );
        my_current_task = next;
        printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);
    }
    else
    {
        next->state = 0;
        my_current_task = next;
        printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);
        /* switch to new process */
        asm volatile(
            "pushl %%ebp\n\t"         /* save ebp */
            "movl %%esp,%0\n\t"     /* save esp */
            "movl %2,%%esp\n\t"     /* restore  esp */
            "movl %2,%%ebp\n\t"     /* restore  ebp */
            "movl $1f,%1\n\t"       /* save eip */
            "pushl %3\n\t"
            "ret\n\t"                 /* restore  eip */
            : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
            : "m" (next->thread.sp),"m" (next->thread.ip)
        );
    }
    return;
}

每循环十万次打印一个printk(KERN_NOTICE "my_start_kernel here %d \n",i);

2.myinterrupt.c代码

/*
 *  linux/mykernel/myinterrupt.c
 *
 *  Kernel internal my_timer_handler
 *
 *  Copyright (C) 2013  Mengning
 *
 */
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/tty.h>
#include <linux/vmalloc.h>

#include "mypcb.h"

extern tPCB task[MAX_TASK_NUM];
extern tPCB * my_current_task;
extern volatile int my_need_sched;
volatile int time_count = 0;

/*
 * Called by timer interrupt.
 * it runs in the name of current running process,
 * so it use kernel stack of current running process
 */
void my_timer_handler(void)
{
#if 1
    if(time_count%1000 == 0 && my_need_sched != 1)
    {
        printk(KERN_NOTICE ">>>my_timer_handler here<<<\n");
        my_need_sched = 1;
    }
    time_count ++ ;
#endif
    return;
}

void my_schedule(void)
{
    tPCB * next;
    tPCB * prev;

    if(my_current_task == NULL
        || my_current_task->next == NULL)
    {
        return;
    }
    printk(KERN_NOTICE ">>>my_schedule<<<\n");
    /* schedule */
    next = my_current_task->next;
    prev = my_current_task;
    if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */
    {
        /* switch to next process */
        asm volatile(
            "pushl %%ebp\n\t"         /* save ebp */
            "movl %%esp,%0\n\t"     /* save esp */
            "movl %2,%%esp\n\t"     /* restore  esp */
            "movl $1f,%1\n\t"       /* save eip */
            "pushl %3\n\t"
            "ret\n\t"                 /* restore  eip */
            "1:\t"                  /* next process start here */
            "popl %%ebp\n\t"
            : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
            : "m" (next->thread.sp),"m" (next->thread.ip)
        );
        my_current_task = next;
        printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);
    }
    else
    {
        next->state = 0;
        my_current_task = next;
        printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);
        /* switch to new process */
        asm volatile(
            "pushl %%ebp\n\t"         /* save ebp */
            "movl %%esp,%0\n\t"     /* save esp */
            "movl %2,%%esp\n\t"     /* restore  esp */
            "movl %2,%%ebp\n\t"     /* restore  ebp */
            "movl $1f,%1\n\t"       /* save eip */
            "pushl %3\n\t"
            "ret\n\t"                 /* restore  eip */
            : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
            : "m" (next->thread.sp),"m" (next->thread.ip)
        );
    }
    return;
}

每次时钟中断都调用一次printk(),printk(KERN_NOTICE "\n>>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<<\n\n");

二、学习内容

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

1.存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;

2.函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能;

enter :pushl %ebp

movl %esp,%ebp

leave :movl %ebp,%esp

  • popl %ebp
  • 函数参数传递机制和局部变量存储
  • 3.中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序。
  • (二)函数调用堆栈
  • 堆栈
  • 1.堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间。
  • 2.堆栈存在的目的:函数调用框架;传递参数;保存返回地址;提供局部变量空间;
  • 3.了解堆栈存在的目的和编译器对堆栈使用的规则是理解操 作系统一些关键性代码的基础。
  • 堆栈寄存器和堆栈操作
  • 1.堆栈相关的寄存器:esp,堆栈指针(stack pointer):ebp,基址指针(base pointer)
  • 2.堆栈操作:push 栈顶地址减少4个字节(32位) pop 栈顶地址增加4个字节
  • 3.ebp在C语言中用作记录当前函数调用基址
  • (三)借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断
  • (四)在mykernel基础上构造一个简单的操作系统内核
  • 三、学习心得
  • 在这次学习中我通过内核源代码了解,从环境搭建起来,mystartkernerl开始初始化至完成,启动0号进程,利用时间片,每个进程每隔1000万次,判断是否需要调度,调度使用myshedule()进行调度.设置时间片的大小,时间片用完时,设置一下调度标识。调度分两种情况,一种是下一个进程正在进行的,另一种是从未调度过的,进程从未执行过,执行起来特殊点,将状态转成运行时状态,作为当前执行的进程。
 
时间: 2024-10-18 14:07:37

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

马哥linux 培训第二周作业

注意:第二周作业,请将以下题目整理在51cto博客当中,完成后请将对应的博文链接地址提交在答案栏中,提交格式如下:学号+姓名+博文链接地址eg:1+张三+http://mageedu.blog.51cto.com/4265610/1794420 本周作业内容:1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 文件管理的命令有cp.mv.rm 复制命令:cp 用法: cp [-adfilprsu] 来源文件(source) 目标文件(destination) cp [o

linux博文第二周

LINUX第二周博客 1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. cp, mv, rm 1.复制命令: cp cp [Option] ...[-T] SRC(源) DEST(目的) (如果目标不存在,则新建DEST, 并将SRC中的内容填充至DEST中. 如果目标存在:如果DEST是文件,将SRC内容覆盖至DEST中.此时建议为cp命令使用-i选项. 如果DEST是目录,在DEST下新建与原文件同名的文件,并将SRC中内容填充至DEST中) 实例:cp /etc

马哥Linux培训第二周课程作业

1.   Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. #    文件及目录列表查看:ls #    文件内容查看:cat, tac #    修改文件时间戳或创建新文件:touch #    文件编辑: vi, nano 文件管理:cp, mv, rm, (mkdir, rmdir:创建.删除目录) (1)     .复制命令:cp 格式: cp[OPTION]... [-T] SOURCE DEST cp[OPTION]... SOURCE... DIRECTOR

Linux学习第二周作业

1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. Linux上的文件管理类命令: cp命令:复制文件或目录 单源复制:cp [OPTION]...[-T] SRC DEST 多源复制:cp [OPTION]...SRC...DIRECTORY cp [OPTION]...[-T] SRC DEST 其常用选项为:-i 交互式,提醒目标存在,是否覆盖. -r,-R:递归复制源目录下所有目录与文件 -a 归档复制,保留所有的文件的元数据,相当于-dR --preserv=

linux内核第二周

chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能: 1 2 3 4 5 6 7 enter pushl %ebp movl %esp,%ebp leave movl %ebp,%esp popl %ebp 函数参数传递机制和局部变量存储 ③中断,多道程序操

linux 作业第二周

1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 文件管理: cp, mv, rm 复制命令:cp cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... cp SRC DEST SRC是文件: 如果目标不存在:新建DEST,并将SRC中内容填充至DEST中: 如果目录存在: 如果DEST是文件:将SRC中的内容覆盖

linux学习第二周;rpm包管理;yum管理;定制yum库

rpm安装(无法解决包之间依赖性问题): rpm -ivh # 安装包(需要给出包绝对路径) rpm -V #用作包校验,包无变化则不执行操作,包被改变则显示包改变的属性 rpm -e # 卸载包 rpm -qi rpm -ql rpm -qf rpm -K yum安装(可解决包之间依赖性问题): 定制yum库: 1.先移走/etc/yum.repos.d/文件里默认的互联网yum源 2.cd  /etc/yum.repos.d/ 3.vim  base.repo #后缀为.repo,名字随便起

linux学习第二周;vim文本编辑器

扩展模式下: r file绝对路径  # 将file文件内容写入当前光标下一行 w filename  # 将当前vim打开的文件当前内容写入到filename中(新建文件filename,将内容写入) w!file1  # 强制将vim打开的文件当前内容写入到file1中,即覆盖file1中原来的内容(file1已存在) !command  # 临时执行command命令(该命令不能是别名) r!command  # 将command执行结果写入当前光标下面(该命令不能是别名) 原文地址:ht

linux学习第二周;shell编程

pstree -p #显示进程编号(树状) echo $$ #显示当前shell进程编号 脚本的基本结构 : #!SHEBANG (表明使用什么shell打开文件,一般使用bash) CONFIGURATION_VARIABLES #定义变量 FUNCTION_DEFINITIONS#定义函数 MAIN_CODE #主要执行命令 检测脚本中的语法错误 bash -n /path/to/some_script 调试执行 bash -x /path/to/some_script 变量命名法则: 1.