第一部分 课本学习

  • 内核版本号:Linux内核自2013年12月起,就以A.B.C.D的方式命名。A和B变得无关紧要,C是内核的真实版本。每一个版本的变化都会带来新的特性,如内部API的变化等,改动的代码数量常常上万行。D是安全补丁和bug修复。
  • 几个关键的目录:

    Arch:与体系结构相关的子目录列表。

    Block:存放Linux存储体系中关于块设备管理的代码。

    Crypto:存放常见的加密算法的C语言代码。

    Documentation:存放一些文档。

    Drivers:驱动目录,里面分门别类地存放了Linux内核支持的所有硬件设备的驱动源代码。

    Firmware:固件。

    Fs:文件系统,里面列出了Linux支持的各种文件系统的实现。

    Include:头文件目录,存放公共的头文件。

    Init:init是初始化的意思,存放Linux内核启动时的初始化代码。

    Ipc:里面是Linux支持的IPC的代码实现。

    Kernel:存放内核本身需要的一些核心代码文件。其中有很多关键代码,包括pid--进程号等。

    Lib:公用的库文件,里面是一些公用的库函数。

    Mm:存放LInux的内存管理代码。

    Net:该目录下是网络相关的代码,譬如TCP/IP协议栈等。
  • 编译配置Linux内核的关键步骤:

    1、编译安装步骤

    安装开发组包>下载源码文件>.config: 准备配置文件>make menuconfig: 配置内核选项>make[-j#]>make modules_install: 安装模块>make install:安装内核相关文件>安装bzImage 为 /boot/vmlinuz-VERSION-RELEASE>生成initramfs>编辑grub的配置文件。

    2、编译配置选项

    (1)配置内核选项

    (2)支持“更新”模式进行配置:make help

    Make config:基于命令行以遍历的方式去配置内核中可配置的每个选项。

    Make menuconfig:基于命令行以遍历的方式去配置内核中可配置的每个选项。

    Make gconfig:基于GTK(GNOME)环境窗口界面。

    Make xconfig: 基于QT(KDE)环境的窗口界面。

    (3)支持“全新配置”模式进行配置

    Make defconfig:基于内核为目标平台提供的“默认”配置进行配置。

    Make allyesconfig:所有选项均回答为“yes”。

    Make allnoconfig:所有选项均回答为“no”。

    3.编译

    全编译:make[-j#]

第二部分 实验操作

  • 在实验楼环境下输入:
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

完成启动内核的操作,如下图:

  • 几个指令的含义:

    qemu :相当于打开一个虚拟机

    kernel:启动一个内核,位置由其后的文件名指定。

    bzImage是vmLinux经过gzip压缩后的文件,是压缩的内核映像。vmLinux是编译出来的最原始的内核ELF文件。

    initrd是“initial ramdisk”的简写,普通linux用户一般感受不到这个内存根文件系统的存在,内核启动先访问initrd文件系统,然后在切换到磁盘文件系统。
  • 使用gdb跟踪调试内核
(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之前,也可以在之后
  • 操作如下:

    加载符号表:



    链接gdbserver:



    设置一个断点



    查看start_kernel函数的上下文

第三部分 分析从start_kernel到init进程启动的过程

1、start_kernel()

代码如下:

  • main.c中没有main函数,start_kernel()相当于C语言中的main函数。Start_kernel是一切的起点,在此函数被调用之前,内核代码主要是用汇编语言写的,用于完成硬件系统的初始化工作,为C代码的运行设置环境。

2、init_task()

代码如下:

  • init_task(0号进程)是task_struct类型,是进程描述符,使用宏INIT_TASK对其进行初始化。接下来就是对各模块的初始化。

3.rest_init()

代码如下:

  • rest_init()这个函数调用系统函数 kernel_thread() 创建 1 号进程,即 init 进程,是用户态所有进程的祖先。然后,新建 kthreadd 进程,是内核态所有进程的祖先。最后,通过 cpu_startup_entry 函数启动 0 号进程。

    Init_task()(PID为0)在创建了init进程后,调用cpu_idle()演变成idle进程,执行一次调度后,init进程运行。1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve加载init程序,演变成init进程(用户态1号进程),init进程是内核启动的第一个用户态进程。Kthreadd(PID为2)进程由0号进程创建,始终运行在内核空间,负责所有内核线程的调度和管理。

2018-2019-1 20189203《Linux内核原理与分析》第四周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 20169219linux 内核原理与分析第四周作业

    系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. HTML 09 web 内容与攻击技术

    Servlet 改进 CGI 之前提及的 CGI, 由于每次接到请求, 程序都要跟着启动一次, 因此一旦访问量过大, web 服务器要承担低昂当大的负载, 而 servlet 运行在与 web 服务器 ...

  2. Mysql获取最大自增ID(auto_increment)的五种方式及其特点

    在关系型数据库的表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都有一个唯一标识. 而实际应用中,获取到最近最大的ID值是必修课之 ...

  3. R包的小技巧

    通常我们都是直接使用library(pkg_name)  的形式加载R包,在同一台机器上面,对于我们而言,这个包所在的路径一定是在.libPaths() 路面的,但是对于其他用户而言,这个路径可能不存 ...

  4. puppet(1)-简介

    puppet: 开源的.新一代的集中化的配置管理工具: 目标状态 配置语言 Luke Kanies,puppet labs bootstrap --> configuration --> ...

  5. LeetCode - Subarray sum equals k

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  6. CF 634A Island Puzzle

    A. Island Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. pandas 基础操作 更新

    创建一个Series,同时让pandas自动生成索引列 创建一个DataFrame数据框 查看数据 数据的简单统计 数据的排序 选择数据(类似于数据库中sql语句) 另外可以使用标签来选择 通过位置获 ...

  8. SQL语句利用日志写shell

    outfile被禁止,或者写入文件被拦截: 在数据库中操作如下:(必须是root权限) show variables like '%general%'; #查看配置 set global genera ...

  9. elk-插件(head、X-pack)(五)

    一.修改ES配置,允许REST跨源操作ES服务器,添加以下2个配置,并重启ES. http.cors.enabled: true #如果启用了 HTTP 端口,那么此属性会指定是否允许跨源 REST ...

  10. 怎么访问不在网站目录下文件(iis虚拟目录设置)

    很多时候,上传的文件多了,架设服务器当初设定的主目录所在盘空间往往就不够了,怎么办?这就需要设置虚拟目录.虚拟目录就是将其他目录以映射的方式虚拟到该FTP服务器的主目录下,这样,一个FTP服务器的主目 ...