内核的初始化大体上是要重新建立GDT,然后建立IDT表,加载好TSS选择子。此时就可以用c语言写代码了,跳到初始化程序,开始进程的初始化了。

GDT表格最初在loader里面临时建立了一个,但是此时换了执行环境,内核还是用在自己地址空间的数据比较好。作者是在cstart函数中重新建立GDT,顺带初始化了IDT表。

重建GDT

用sgdt将原有gdtr寄存器的值保存到全局变量里面,然后将dgt表的内容复制到新的gdt数组中去,将gdtr中的关于新的GDT表基址和大小重新设置一番在用lgdt指令加载一下就可以了。

建立IDT表,对于idtr的初始化和gdtr类似,都是填入表格的基址和大小再重新加载一下便可。不过IDT表中的内容不像GDT一样可以直接复制过来,还需要一条条添加。无非也就是一些中断和异常的处理函数。作者对于intel规定的前十多个异常都是直接按照这个异常有无错误码,分别压栈调用自己写的一个打印函数,将错误打印出来。然后再对8259A占用的中断号都绑上对应的处理程序,这也是系统响应外界的接口。IDT表中的描述符指定的段选择子都是内核代码段,4G空间。

作者还顺带在这里初始化了TSS描述符和每个进程结构体里的LDT选择子,这个选择子将来要被用来加载进ldtr中,指向GDT表中的该进程对应的一项,被相应的任务用来寻址。在前面说过,当CS的TI位为1的时候指明要在LDT中寻址。这也是自己之前一直没能将LDT和实际运行的某一个任务切实联系起来的地方。虽然嘴上一直念叨着CS作为选择子在GDT或者LDT中索引相应段的描述符,但是一到实际代码中,还是犯嘀咕,怎么就从一个任务的LDT中切到另一个任务的LDT中了。还是CS的作用的没有搞明白,如果TI为1,那么CPU自动从ldtr寄存器中取出该任务所要LDT在GDT中的下标,然后转到LDT中用CS再索引任务需要的段。

初始化完成后,加载TSS段选择子,然后就跳到kernel_main函数里面去了。Kernel_main函数就是对进程的初始化了,或者说在本次实验中是对任务的初始化。

哎呀,这么一看,内核做的事情还真没有多少呢。确实,用的是微内核,很多东西都提出到内核外部作为一个操作系统模块实现的。

内核初始化kernel.asm相关推荐

  1. Linux 内存管理篇(2)内核初始化与内存管理启用

    前言 继内存寻址之后, 本篇开始介绍Linux内核地址空间初始化过程. 通过内存寻址篇我们知道, Linux 系统运行过程中位于保护模式,系统必须要是用MMU来完成地址寻址, 这就依赖于段表跟页表. ...

  2. Linux内核初始化阶段内存管理的几种阶段

    本系列旨在讲述从引导到完全建立内存管理体系过程中,内核对内存管理所经历的几种状态.阅读本系列前,建议先阅读memblock的相关文章. 一些讲在前面的话 在很久很久以前,linux内核还是支持直接从磁 ...

  3. linux内核ufs设备树,Linux内核初始化流程笔记

    Linux内核初始化流程笔记 分类: LINUX 作者:gfree.wind@http://www.doczj.com/doc/fc580419c1c708a1294a4409.html 博客:htt ...

  4. kali2020.3 vm版本内核是多少_Zircon Fuchsia 内核分析 启动(内核初始化)

    相关阅读: Zircon - Fuchsia 内核分析 - 启动(平台初始化) 简介 前面已经介绍了 Zircon 内核启动的汇编代码部分,主要是一些 CPU 的初始化. 现在 prime CPU 已 ...

  5. linux源码分析之cpu初始化 kernel/head.s,linux源码分析之cpu初始化

    linux源码分析之cpu初始化 kernel/head.s 收藏 来自:http://blog.csdn.net/BoySKung/archive/2008/12/09/3486026.aspx l ...

  6. linux初始化内存盘卡住,分析内核初始化时根内存盘的加载过程(init/main.c)-嵌入式系统-与非网...

    作者:opera 概述 ==== 1)当内核配置了内存盘时, 内核在初始化时可以将软盘加载到内存盘中作为根盘. 当同时配置了初始化内存盘(Initail RAM Disk)时, 内核在初始化时可以在安 ...

  7. Linux系统基础——内核初始化

    内核初始化 特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料,本文大部分内容和所有图片来源于这个专栏. 1 背景知识 BootLoader阶段后,cpu从实模式转换成保护模式.有了更强的寻 ...

  8. linux内核cpu初始化,浅谈操作系统启动与内核初始化

    迷茫的时候,就朝着热情的方向走. BIOS 的引导 当按下开机键,你的主板开始加电,在刚加电的时候电脑会做一些初始化寄存器的工作,比如将 CS代码段寄存器 设置为 0xFFFF ,将 IP指令寄存器 ...

  9. linux内核初始化卡死,armlinux内核启动--内存初始化管理

    linux版本:2.6.36 相关数据结构 arch/arm/include/asm/setup.h #ifdef CONFIG_ARCH_LH7A40X # define NR_BANKS 16 # ...

最新文章

  1. \r与\n有何差别,编码的时候应该怎样使用
  2. 为什么不能在init和dealloc函数中使用accessor方法
  3. JAVA WEB部分易混淆问题总结
  4. java网络编程(六)
  5. vue循环如何传参数 php,vue循环列表动态数据的处理方法(代码)
  6. react动画库_React 2020动画库
  7. Eureka 与Zookeeper 的区别,Eureka相较于Zookeeper好在哪?
  8. java 对象protected,Java对象类protected void finalize throws Throwable方法示例
  9. Windows连接Linux的常用工具
  10. String.Format用法
  11. 最全 VxLAN 知识详解
  12. 地图距离算法_基于权重的地图匹配技术
  13. C# Windows API介绍与调用
  14. java框架的作用_java三大框架的作用介绍
  15. CSS相对定位,固定定位,绝对定位
  16. Java学习笔记(六):Java泛型
  17. 微信小程序图片组件,ios不显示,安卓正常
  18. 2022山东国际青少年眼睛健康产业展览会,护眼健康展9月开展
  19. 计算机网络的三种交换方式
  20. LoadRunner性能测试实战教程

热门文章

  1. LA3644简单并查集判环
  2. hdu4771 水搜索(状态压缩+bfs)
  3. 【Android Gradle 插件】settings.gradle 配置文件 ( 配置基本作用 | include 函数用法 | 目录层级配置 | 修改 Module 模块构建脚本名称 )
  4. 【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
  5. Spring @CrossOrigin 通配符 解决跨域问题
  6. 使用Mybatis Generator自动生成代码
  7. 前方高能 | 容器化应用操作原来可以这样简单
  8. 子数组和最接近零问题
  9. PYTHON调用JENKINS的API来进行CI
  10. Codeforces Round #309 (Div. 2) A. Kyoya and Photobooks 字符串水题