• 基于mykernel 2.0编写一个操作系统内核


    一、实验要求:

    基于mykernel 2.0编写一个操作系统内核

    1. 按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译;
    2. 基于mykernel 2.0编写一个操作系统内核,参照https://github.com/mengning/mykernel 提供的范例代码
    3. 简要分析操作系统内核核心功能及运行工作机制

    二、环境:

    下载补丁:
    wget https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch
    安装axel:

    sudo apt install axel

    多线程下载:

    axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz

     

    解压:
    xz -d linux-5.4.34.tar.xz
    tar -xvf linux-5.4.34.tar

     

    打补丁:
    cd linux-5.4.34
    patch -p1 < ../mykernel-2.0_for_linux-5.4.34.patch

     

    安装必须的库:
    sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
    生成内核编译:
    make defconfig

    编译(超长时间):

     

     安装qemu:

    sudo apt install qemu

     

    二、实验过程:

    查看当前的kernel运行状态:
    qemu-system-x86_64 -kernel arch/x86/boot/bzImage

    从qemu窗口中您可以看到my_start_kernel在执行,同时my_timer_handler时钟中断处理程序可以执行。

      

    进入mykernel目录可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c:

     

      

    执行编译:
    make clean
    make allnoconfig          
    make

     

      

    修改:
    mymain.c

     myinterrupt.c

    
    
    解析一下进程切换的代码:

    1,2 保存的是前一个进程的ebp和esp,ebp保存在栈中,esp保存在pcb.sp中

    3 更换了进程栈,原本esp指向前一个进程的栈,而后指向了后一个进程的栈

    4 将$1f 保存到了前一个线程的pcb.ip中(可以看做是保存当前进程的ip)

    5,6 修改当前eip寄存器的值,相当于原来rip的内容为前一个进程的指令地址,现在为后一个进程的指令地址

    7,8 将ebp寄存器的值修改为下一个进程的栈底

    再编译:
    make clean
    make allnoconfig 
    make
    qemu-system-x86_64 -kernel arch/x86/boot/bzImage

      

    成功了!

     

  • 相关阅读:
    python操作MySQL数据库
    fs 小计
    yii xss模型安全
    freeswitch 音 视频 支持的编码
    MYSQL手工注入某日本网站
    Linux 系统 pptpd+radius+mysql 安装攻略
    mysql主从复制之mysql-proxy实现读写分离
    nginx-1.2.7+tcp_proxy_module负载均衡配置
    nginx-1.2.7 + tcp_proxy_module手动编译安装
    关于弹框的那些事~
  • 原文地址:https://www.cnblogs.com/smyhrps/p/12875390.html
Copyright © 2020-2023  润新知