内核初始化的过程

news2024/11/18 1:33:01

内核的启动从入口函数 start_kernel() 开始。在 init/main.c 文件中,start_kernel 相当于内核的 main 函数。打开这个函数,你会发现,里面是各种各样初始化函数 XXXX_init。

在操作系统里面,先要有个创始进程,有一行指令 set_task_stack_end_magic(&init_task)。这里面有一个参数 init_task,它的定义是 struct task_struct init_task = INIT_TASK(init_task)。它是系统创建的第一个进程,我们称为 0 号进程。这是唯一一个没有通过 fork 或者 kernel_thread 产生的进程,是进程列表的第一个。

第二个要初始化的就是办事大厅。有了办事大厅,我们就可以响应客户的需求。

这里面对应的函数是 trap_init(),里面设置了很多中断门(Interrupt Gate),用于处理各种中断。其中有一个 set_system_intr_gate(IA32_SYSCALL_VECTOR, entry_INT80_32),这是系统调用的中断门。系统调用也是通过发送中断的方式进行的。

接下来要初始化的是咱们的会议室管理系统。对应的,mm_init() 就是用来初始化内存管理模块。

项目需要项目管理进行调度,需要执行一定的调度策略。sched_init() 就是用于初始化调度模块。

vfs_caches_init() 会用来初始化基于内存的文件系统 rootfs。在这个函数里面,会调用 mnt_init()->init_rootfs()。这里面有一行代码,register_filesystem(&rootfs_fs_type)。在 VFS 虚拟文件系统里面注册了一种类型,我们定义为 struct file_system_type rootfs_fs_type。

文件系统是我们的项目资料库,为了兼容各种各样的文件系统,我们需要将文件的相关数据结构和操作抽象出来,形成一个抽象层对上提供统一的接口,这个抽象层就是 VFS(Virtual File System),虚拟文件系统。

最后,start_kernel() 调用的是 rest_init(),用来做其他方面的初始化,这里面做了好多的工作。

rest_init 的第一大工作是,用 kernel_thread(kernel_init, NULL, CLONE_FS) 创建第二个进程,这个是 1 号进程。

1 号进程对于操作系统来讲,有“划时代”的意义。因为它将运行一个用户进程,x86 提供了分层的权限机制,把区域分成了四个 Ring,越往里权限越高,越往外权限越低。

操作系统很好地利用了这个机制,将能够访问关键资源的代码放在 Ring0,我们称为内核态(Kernel Mode);将普通的程序代码放在 Ring3,我们称为用户态(User Mode)。

当一个用户态的程序运行到一半,要访问一个核心资源,例如访问网卡发一个网络包,就需要暂停当前的运行,调用系统调用,接下来就轮到内核中的代码运行了。

首先,内核将从系统调用传过来的包,在网卡上排队,轮到的时候就发送。发送完了,系统调用就结束了,返回用户态,让暂停运行的程序接着运行。

这个过程就是这样的:用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态,然后接着运行。

内存访问是不需要驱动的,这个就是 ramdisk。这个时候,ramdisk 是根文件系统。

然后,我们开始运行 ramdisk 上的 /init。等它运行完了就已经在用户态了。/init 这个程序会先根据存储系统的类型加载驱动,有了驱动就可以设置真正的根文件系统了。有了真正的根文件系统,ramdisk 上的 /init 会启动文件系统上的 init。

接下来就是各种系统的初始化。启动系统的服务,启动控制台,用户就可以登录进来了。

此文章为10月Day20学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Quartus调用FIFO-IP核verilog,DE1开发板,代码和视频

名称:Quartus调用FIFO-IP核,完成数据的求和 软件:Quartus 语言:Verilog 代码功能: 题目:FIFO-IP核的调用 主要内容:调用两个FIFO-IP核,完成2行数据的求和 技术参数&#xff1a…

前言:自动化框架的设计模式

1、UI自动化框架的设计模式 自动化测试框架有很多种,常见的自动化框架分类如下: 在使用上面的自动化框架时,通常会结合使用分层思想,也就是一些自动化框架设计模式,今天重点分享一下UI自动化框架设计使用比较多的一种…

基于yolov5的目标检测和双目测距

目录 一.简介 1.双目视觉 2 YOLOv5 二.双目准备 1双目矫正 2.测距部分代码和函数 三.yolov5部分代码代码展示 效果展示 一.简介 1.双目视觉 双目视觉是通过两个摄像机同时拍摄同一场景,通过计算两幅图像的差异来获取深度信息的一种计算机视觉技术。在双目视…

文心一言 VS 讯飞星火 VS chatgpt (117)-- 算法导论10.3 2题

二、用go语言,对一组同构对象用单数组表示法实现,写出过程ALLOCATE-OBJECT和FREE-OBJECT。 文心一言: 在Go语言中,我们通常使用指针和结构体来表示和操作复杂的数据结构。对于一组同构对象,我们可以使用一个数组来存…

SQL INSERT INTO 语句(在表中插入)

SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新的数据行。 SQL INSERT INTO 语法 INSERT INTO 语句可以用两种形式编写。  第一个表单没有指定要插入数据的列的名称,只提供要插入的值,即可添加一行新的数据: INSERT INTO table_n…

【马蹄集】—— 概率论专题:排列组合

概率论专题:排列组合 目录 MT2226 抽奖概率MT2227 饿饿!饭饭!MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度:黄金    时间限制:1秒    占用内存:128M 题目描述 小码哥正在进行抽奖…

积极开拓北美市场,泡泡玛特在美国的首家直营门店正式开业

近几年,随着年轻人在消费市场的声量越来越大,潮玩便像一阵风似地席卷新消费空间,形成一种独特的流行趋势。作为中国领先的潮流文化娱乐公司,泡泡玛特除了深耕潮玩产品本身,也在不断拓展业务版图,推进国际化…

P1664 每日打卡心情好 题解

文章目录 题目背景题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示思路及部分实现完整代码文章小结 题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹。通过每天…

测试Android webview 加载本地html

最近开发一个需要未联网功能的App, 不熟悉使用Java原生开发界面,于是想使用本地H5做界面,本文测试了使用本地html加载远程数据。直接上代码: MainActivity.java package com.alex.webviewlocal;import androidx.appcompat.app.AppCompatAct…

2023年【汽车驾驶员(高级)】考试报名及汽车驾驶员(高级)考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 汽车驾驶员(高级)考试报名是安全生产模拟考试一点通总题库中生成的一套汽车驾驶员(高级)考试试卷,安全生产模拟考试一点通上汽车驾驶员(高级&…

博客后台模块续更(四)

八、博客后台模块-Excel表格 1. 接口分析 在分类管理中点击导出按钮可以把所有的分类导出到Excel文件 请求方式 请求地址 请求头 GET /content/category/export 需要token请求头 响应体: 直接导出一个Excel文件 失败的话响应体如下: {"c…

2023年全球顶尖科学家排行榜单公布(附TOP100名单)

近期,斯坦福大学和Elsevier共同发布了全球前2%顶尖科学家榜单(Worlds Top 2% Scientists)。这份榜单也备受博士后、访问学者及联合培养申请者关注,所以知识人网小编特整理TOP100名单。 2023年10月4日,斯坦福大学和全球最大学术出版商Elsevier…

jvm的jshell,学生的工具

jshell 在我眼里,只能作为学校教学的一个玩具,事实上官方也做了解释,以下是官方的解释: 在学习编程语言时,即时反馈很重要,并且 它的 API。学校引用远离Java的首要原因 教学语言是其他语言有一个“REPL”…

CSS 定位布局

定位布局共有4种方式 CSS定位使你可以将一个元素精确地放在页面上指定的地方。联合使用定位和浮动,能够创建多种高级而精确的布局。其中,定位布局共有4种方式。 固定定位(fixed)相对定位(relative)绝对定…

用Vue3.0 写过组件吗?如果想实现一个 Modal你会怎么设计?

一、组件设计 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式 现在有一个场景,点击新增与编辑都弹框出来进行填写,功能上大同小异,可能只是标题内容或者是显示的主体内容稍微不同 …

安卓逆向之抽象函数public abstract的hook定位处理

一、抽象类调用过程 1、定义接口 public abstract class AbsNetHelper{public abstract int X(int x,int y); }2、其他类调用 public class f extends AbsNetHelper {public abstract int X(int x,int y){ return xy;} }二、如何HOOK 想hook调用AbsNetHelper类的X抽…

攻防世界web篇-robots

打开网址后,发现是一个空白页面的网页 但是,这个题目是robots,所以就联想到robots.txt这个目录,于是我就试了一下 注意:这里有个php的文件,这个应该就是一个目录文件 当输入后,直接回车&#…

【C语言必知必会 | 子系列第四篇】深入剖析选择结构(2)

引言 C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】子系列第四篇,基于进行C语言选择结构的编程题专项练习,结合专题优质题目,带领读者从0开…

VMware Workstation里面安装ubuntu20.04的流程

文章目录 前言一、获取 desktop ubuntu20.04 安装镜像二、VMware Workstation下安装ubuntu20.041. VMware Workstation 创建一个新的虚拟机2. ubuntu20.04的安装过程3. 登录ubuntu20.044. 移除 ubuntu20.04 安装镜像总结参考资料前言 本文主要介绍如何在PC上的虚拟机(VMware W…

ESP32C3 LuatOS TM1650①驱动测试

合宙TM1650驱动资料 TM1650.lua源码 引脚连接 TM1650ESP32C3SCLGPIO5SDAGPIO4 下载TM1650.lua源码,并以文件形式保存在项目文件夹中 驱动测试源码 --注意:因使用了sys.wait()所有api需要在协程中使用 -- 用法实例 PROJECT "ESP32C3_TM1650" VERSION …