zoukankan      html  css  js  c++  java
  • Linux内核分析作业三

    构造一个简单的Linux系统MenuOS

    复习

    计算机三大法宝

    存储程序计算机
    函数调用堆栈
    中断
    

    操作系统两把宝剑

    中断上下文的切换
    进程上下文的切换
    

    一、Linux内核源代码简介

    函数目录

    Linux-3.18.6/arch/x86

    Linux-3.18.6/init:内核启动的相关代码基本都存在该目录下

       start_kernel函数相当于普通C程序的main函数
    

    Linux-3.18.6/kernel:Linux内核的核心代码在该目录下

    fs:file system文件系统

    ipc:进程间通信

    二、构造一个简单的Linux系统

    实验楼环境

    cd Linuxkernel/

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

    qemu:启动一个虚拟机平台
    -kernel:给一个内核,操作系统
    -initrd:驱动所需的硬盘
    rootfs.img:放一个可执行文件由menuOS源代码编译成的init
    

    进入menu系统,支持三个命令 help version quit

    自己搭建

    1、下载内核源代码编译内核(下载,解压,编译)

    2、制作根文件系统(创建目录存放文件系统)

    3、启动menuOS

    三、实验gdb跟踪调试Linux内核的方法

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

     -S freeze CPU at startup (use ’c’ to start execution)指在CPU初始化之前(刚启动的时候)将其冻结
     -s shorthand for -gdb tcp::1234 指在1234这个端口上创建的gdb server,若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项  
    

    打开另一个shell窗口

    (gdb)file linux-3.18.6/vmlinux:在gdb界面中targe remote之前加载符号表

    (gdb)target remote:1234:建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

    (gdb)break start_kernel:断点的设置可以在target remote之前,也可以在之后

    设置完断点后,输入c命令继续执行,函数会停在断点处。输入list指令可以查看断点处的代码

    四、简单分析start_kernel

    init_tast:手工创建的pcb,0号进程即最终的idle进程。当系统没有进程需要执行时就调度到idle进程

    trap_init:硬件中断,初始化一些中断向量,系统调用

    sched_init:进程调度模块初始化

    rest_init:创建1号进程

    第一个用户态进程:init_process,1号进程,找默认路径下的程序作为1号进程
    kthreadd:内核线程,用来管理系统资源
    

    mm_init:内存管理模块初始化

    总结

    道生一,一生二,二生三,三生万物

  • 相关阅读:
    hadoop集群部署入门(传智Hadoop学习)
    遇到问题了!
    MD5和TreeView的学习
    今天晚上完成了一个登录功能
    第一次来到博客园!
    单元测试--测?
    单元测试-公司实习1
    Mariadb数据库小结
    [奋斗的人生] 学习,总结,感恩,回馈
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/javajy/p/5267984.html
Copyright © 2011-2022 走看看