zoukankan      html  css  js  c++  java
  • 20199314 Linux内核原理与分析 第四周作业

    MenuOS的构造

    一、Linux内核源代码简介

    Linux内核源码的目录结构如图

    其中包含了很多子目录,存放了不同类型的代码。

    1. arch: 这个为目录是架构相关,里面存放了许多CPU架构,比如arm,x86,MIPS,PPC等。本次学习主要基于X86系统,故重点关注X86目录。

    2. block: 在linux中block表示块设备(以块(多个字节组成的整体,类似于扇区)为单位来整体访问),譬如说SD卡、iNand、Nand、硬盘等都是块设备。你几乎可以认为块设备就是存储设备。block目录下放的是一些linux存储体系中关于块设备管理的代码。

    3. crypto: 英文意思是加密。这个目录下放了一些各种常见的加密算法的C语言代码实现。譬如crc32、md5、sha1等。

    4. Documentation: 里面放了一些文档。

    5. drivers: 驱动目录,里面分门别类的列出了linux内核支持的所有硬件设备的驱动源代码。就是需要重点学习的部分。

    6. firmware: 固件。什么是固件?固件其实是软件,不过这个软件是固话到IC里面运行的叫固件:就像S5PV210里的iROM代码。

    7. fs: fs就是file system,文件系统,里面列出了linux支持的各种文件系统的实现。

    8. include: 头文件目录,公共的(各种CPU架构共用的)头文件都在这里。每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下。

    9. init: init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码。

    二、 Linux内核启动的起点问题

    众所周知,高级语言和汇编语言中,阅读首先要从main.c函数开始,通过其中main函数启动、切换进程。但是Linux内核中虽然有main.c函数,然而其是先通过start_kernel函数启动。

    三、构造一个简单的内核--MenuOS(实验楼环境下)

    步骤: 将Linux系统和一个简单的文件系统运行起来。
    先用qemu仿真kernel,bzImage是vmLinux经过gzip压缩后的文件,是压缩的内核映像。bImage和zImage分别代表大小内核。根文件系统initrd用rootfs.img代替。
    代码如下:

    	$ cd ~/LinuxKernel/
        $ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
    

    由于在自己电脑上构建Linux内核的过程,网速太慢,下载不成功就没下载。

    四、利用gdb跟踪调试内核

    跟踪gbd调试内核的过程,需要执行如下代码:

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

    其中-s代表在gpu初始化前冻结起来,-s代表默认使用1234端口上创建一个gdb-server。

    在gdb界面中targe remote之前加载符号表,并用1234这个端口进行连接,代码如下:
    
     (gdb)file linux-3.18.6/vmlinux 
       target remote:1234
    

    五、总结

    进程创建中主要的三个进程为init_task()、kernel_init()、kthreadd()。分别为0、1、2号进程。其中init_task()初始进程衍生出kernel_init()、kthreadd()两者,而前者运行用户进程,后者运行内核守护进程。

  • 相关阅读:
    ubuntu系统安装初始化脚本
    21_多线程
    20_IO
    19_异常
    18_集合
    17_内部类和常用类
    16_接口
    15_abstract,static,final
    14_面向对象
    13_数组
  • 原文地址:https://www.cnblogs.com/morvalhe/p/11618596.html
Copyright © 2011-2022 走看看