| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 2021-2022-1 20212802《Linux内核原理与分析》第四周作业 -> 正文阅读 |
|
[系统运维]2021-2022-1 20212802《Linux内核原理与分析》第四周作业 |
一、跟踪分析内核的启动过程实验 :1.启动Menuos:qemu仿真kernel:
2.调试跟踪:
启动gdb,把内核加载进来,建立连接:?
在 start_kernel 处设置断点,继续执行,停在断点处: 在 rest_init 处设置断点,继续执行,停在断点处: 3.内核启动分析:(1)start_kernel() main.c 中没有 main 函数,start_kernel() 相当于是C中的main函数。start_kernel是一切的起点,在此函数被调用之前内核代码是用汇编语言写的,完成系统的初始化工作,为c代码的运行设置环境。由调试可得 start_kernel 在500行: (2)init_task() start_kernel() 函数几乎涉及到了内核的所有模块,如:trap_init()(中断向量的初始化)、mm_init()(内存管理的初始化)sched_init()(调度模块的初始化)等,首先是510行的init_task():
可以看出 init_task(0号进程)是 task_struct 类型,是进程描述符,使用宏INIT_TASK对其进行初始化。接下来就是对各种模块的初始化: (3)rest_init() 通过rest_init()新建kernel_init、kthreadd内核线程: 403行代码
由注释得调用 kernel_thread()创建1号内核线程(在 kernel_init 函数正式启动): 注:对比 init_task 和 kernel_thread() kernel_thread()是 fork 出了一个新进程来执行kernel_init 函数,而 init_task 是使用宏进行初始化的。也就是说0进程不是系统通过 kernel_thread 的方式(也就是 fork)创建的(init_task 是唯一一个没有通过 fork()产生的进程)。 405行代码
调用 kernel_thread()执行 kthreadd函数,创建 PID=2的内核线程: 此函数的任务是管理和调度其他内核线程 kernel_thread。for 循环中运行 kthread_create_list 全局链表中维护的 kthread, 在create_kthread()函数中,会调用 kernel_thread 来生成一个新的进程并被加入到此链表中,因此所有的内核线程都是直接或者间接的以 kthreadd 为父进程。 4.总结:(1)init_task()(PID=0)在创建了init进程后,调用 cpu_idle() 演变成了idle进程,执行一次调度后,init进程运行; (2)1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve执行 init 函数,演变成 init 进程(用户态1号进程),init 进程是内核启动的第一个用户级进程; (3)kthreadd(PID=2)进程由0号进程创建,始终运行在内核空间, 负责所有内核线程的调度和管理 。 二.教材内容总结??? 其实本科所学的操作系统这门课已经详解了进程调度的原理和手段,而且链表作为数据结构的一种,也早已实现过多次,所以这里我不再做过多陈述。只是总结一下,我认为的新的、或者原来没学的内容。 ??? Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类,它允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。每个调度器都有一个优先级,基础的调度器代码定义在kernel/sched.c文件中,它会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那一个程序。这里我觉得调度器只存在于Linux操作系统中,Windows系统中没有。 ??? 红黑树是一种自平衡的二叉树,与普通二叉树相比,它具有着色属性,或红色或黑色。它通过以下六个属性来维持半平衡二叉树: ??? 进程调度的主要入口点是函数schedule();其实在之前的《构建一个简单的Linux系统》实验中出现过,这个函数中嵌入汇编代码,实现进程的切换。 ??? 其实在进程切换和调度中,还有一个很重要的概念就是加锁机制。由于系统资源的有限,为避免产生死锁,必须对临界区资源加锁。想到这一概念我特意翻了一下课本,发现在内核同步那一章有讲。 三、小结:?本周学习中遇到了很多不明白的指令和术语,一边实践一边查阅资料,在阅读资料中又会由此引出新的问题(如在搜索init进程中看到先是内核线程又是用户进程,然后如果不理解二者区别,就没法弄明白1号进程的前世今生,只能继续搜索内核线程和用户进程的区别)过程辛苦,但好在问题大部分得以解决,还有小部分需要再强化理解。 ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 19:49:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |