【Linux0.11代码分析】04 之 head.s 启动流程
【Linux0.11代码分析】04 之 head.s 启动流程
- 一、boot/head.s
系列文章如下:
系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》
.
1.《【Linux0.11代码分析】01 之 代码目录分析》
2.《【Linux0.11代码分析】02 之 bootsect.s 启动流程》
3.《【Linux0.11代码分析】03 之 setup.s 启动流程》
4.《【Linux0.11代码分析】04 之 head.s 启动流程》
5.《【Linux0.11代码分析】05 之 kernel 初始化 init\main.c 代码分析》
6.《【Linux0.11代码分析】06 之 kernel 初始化 init 进程代码分析》
head.s
程序编译后会被连接成system
模块的最前面开始部分,它处于内存绝对地址 0x00000
处,
它主要功能为:
- 加载各个数据段寄存器,重新设置中断描述符表,共
256
项,并使各个表项均指向一个只报错误的哑中断程序。 - 然后重新设置全局描述符表。
- 使用物理地址
0
与1M
开始处的内容相比较的方法,检测A20
地址线是否真的开启
(如果没有开启,则在访问高于1Mb
物理内存地址时CPU
实际只会访问(IP MOD 1Mb
)地址处的内容),
如果检测下来发现没有开启则进入死循环。 - 然后测试
PC
机是否含有数学协处理器芯片,并在控制寄存器CR0
中置相应的标志位 - 设置分页处理机制,将页目录表放在绝对物理地址
0
开始处,紧随后面放置4
个页表(可寻址16MB
内存),并分别设置它们的表项 - 最后利用
ret
返回指令将预先放置在堆栈中/init/main.c
程序的地址弹出,去运行main()
程序,同时它可以刷新预取指令队列。
一、boot/head.s
/* head.s 含有 32 位启动代码* 注意!!! 32 位启动代码是从绝对地址 0x00000000 开始的,* 这里也同样是页目录将存在的地方,因此这里的启动代码将被页目录覆盖掉 */
.text
.globl idt,gdt,pg_dir,tmp_floppy_area
pg_dir: // 页目录标识符
.globl startup_32
startup_32:movl $0x10,%eax // 32位寄存器 eax = 0x00000010mov %ax,%ds // 将ds = es = fs = gs = 0x10mov %ax,%esmov %ax,%fsmov %ax,%gslss stack_start,%esp // 设置系统堆栈, _stack_start : ss:espcall setup_idt // 设置中断描述符表=================>+ setup_idt:+ lea ignore_int,%edx+ movl $0x00080000,%eax+ movw %dx,%ax /* selector = 0x0008 = cs */+ movw $0x8E00,%dx /* interrupt gate - dpl=0, present */+ + lea idt,%edi+ mov $256,%ecx+ rp_sidt:+ movl %eax,(%edi)+ movl %edx,4(%edi)+ addl $8,%edi+ dec %ecx+ jne rp_sidt+ lidt idt_descr+ ret<=================call setup_gdt // 设置全局描述符表=================>+ setup_gdt:+ lgdt gdt_descr+ ret<=================// 由于加载了 gdt,所以重部重装载所有的段寄存器movl $0x10,%eax # reload all the segment registersmov %ax,%ds # after changing gdt. CS was alreadymov %ax,%es # reloaded in 'setup_gdt'mov %ax,%fsmov %ax,%gslss stack_start,%esp // 设置系统堆栈, _stack_start : ss:espxorl %eax,%eax// 检查A20地址线是否已经开启,向内存地址0x000000处这与任意一个数值 ,然后看内存地址0x100000(1M)是否也是这个值,// 如果一直相同的话,说明A20地址线没有选通,结果内核不能使用1MB以上内存
1: incl %eax # check that A20 really IS enabledmovl %eax,0x000000 # loop forever if it isn'tcmpl %eax,0x100000je 1b// 于检查数学协处理器芯片是否存在修改控制寄存器 CR0,// 在假设存在协处理器的情况下执行一个协处理器指令,// 如果出错的话则说明协处理器芯片不存在,需要设置 CR0 中的协处理器仿真位 EM(位 2),并复位协处理器存在标志 MP(位 1)。movl %cr0,%eax # check math chipandl $0x80000011,%eax # Save PG,PE,ET
/* "orl $0x10020,%eax" here for 486 might be good */orl $2,%eax # set MPmovl %eax,%cr0call check_x87====================>+ // 下面 fninit 和 fstsw 是数学协处理器(80287/80387)的指令。+ // finit 向协处理器发出初始化命令,它会把协处理器置于一个未受以前操作影响的已知状态,设置+ // 其控制字为默认值、清除状态字和所有浮点栈式寄存器。非等待形式的这条指令(fninit)还会让+ // 协处理器终止执行当前正在执行的任何先前的算术操作。fstsw 指令取协处理器的状态字。如果系+ // 统中存在协处理器的话,那么在执行了 fninit 指令后其状态字低字节肯定为 0。+ check_x87:+ fninit // 向协处理器发出初始化命令+ fstsw %ax // 取协处理器状态字到 ax 寄存器中+ cmpb $0,%al // 初始化后状态字应该为 0,否则说明协处理器不存在+ je 1f /* no coprocessor: have to set bits */+ movl %cr0,%eax // 如果存在则向前跳转到标号 1 处,否则改写 cr0+ xorl $6,%eax /* reset MP, set EM */+ movl %eax,%cr0+ ret<====================jmp after_page_tables// 分别压栈: 0, 0, 0, L6的地址, main()的地址
after_page_tables:pushl $0 # These are the parameters to main :-)pushl $0pushl $0pushl $L6 # return address for main, if it decides to.pushl $mainjmp setup_paging
L6:jmp L6 # main should never return here, but# just in case, we know what happens./* Setup_paging通过设置控制寄存器cr0的标志(PG位31)来启动对内存的分页处理功能,* 并设置各个页表项的内容,以恒等映射前 16MB 的物理内存* 尽管所有的物理地址都应该由这个子程序进行恒等映射,但只有内核页面管理函数能直接使用>1Mb 的地址 * * 在内存物理地址 0x0 处开始存放 1 页页目录表和 4 页页表。页目录表是系统所有进程公用的,* 而这里的 4 页页表则属于内核专用,它们一一映射线性地址起始 16MB 空间范围到物理内存上。* 对于新的进程,系统会在主内存区为其申请页面存放页表。另外,1 页内存长度是 4096 字节。*/
.align 2 // 按 4 字节方式对齐内存地址边界
setup_paging: 首先对 5 页内存(1 页目录 + 4 页页表)清零movl $1024*5,%ecx /* 5 pages - pg_dir+4 page tables */xorl %eax,%eaxxorl %edi,%edi /* pg_dir is at 0x000 */cld;rep;stosl// 设置页目录表中的项,因为我们(内核)共有 4 个页表所以只需设置 4 项// 页目录项的结构与页表中项的结构一样,4 个字节为 1 项// 如"$pg0+7"表示:0x00001007,是页目录表中的第 1 项// 第 1 个页表的属性标志 = 0x00001007 & 0x00000fff = 0x07,表示该页存在、用户可读写。movl $pg0+7,pg_dir /* set present bit/user r/w */movl $pg1+7,pg_dir+4 /* --------- " " --------- */movl $pg2+7,pg_dir+8 /* --------- " " --------- */movl $pg3+7,pg_dir+12 /* --------- " " --------- */// 填写 4 个页表中所有项的内容,共有:4(页表)*1024(项/页表)=4096 项(0 - 0xfff),也即能映射物理内存 4096*4Kb = 16Mb// 每项的内容是:当前项所映射的物理内存地址 + 该页的标志(这里均为 7)// 使用的方法是从最后一个页表的最后一项开始按倒退顺序填写。// 一个页表的最后一项在页表中的位置是 1023*4 = 4092。因此最后一页的最后一项的位置就是$pg3+4092。movl $pg3+4092,%edimovl $0xfff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */std // 方向位置位,edi 值递减(4 字节)
1: stosl /* fill pages backwards - more efficient :-) */subl $0x1000,%eaxjge 1bxorl %eax,%eax /* pg_dir is at 0x0000 */ // 页目录表在 0x0000 处movl %eax,%cr3 /* cr3 - page directory start */ // 设置启动使用分页处理(cr0 的 PG 标志,位 31)movl %cr0,%eaxorl $0x80000000,%eax // 添上 PG 标志movl %eax,%cr0 /* set paging (PG) bit */// 在改变分页处理标志后要求使用转移指令刷新预取指令队列,这里用的是返回指令 ret。// 该返回指令的另一个作用是将堆栈中的 main 程序的地址弹出,并开始运行/init/main.c 程序。// 本程序到此真正结束了。 ret /* this also flushes prefetch-queue */.align 2
.word 0
idt_descr:.word 256*8-1 # idt contains 256 entries.long idt
.align 2
.word 0
gdt_descr:.word 256*8-1 # so does gdt (not that that's any.long gdt # magic number, but it works for me :^).align 8
idt: .fill 256,8,0 # idt is uninitializedgdt: .quad 0x0000000000000000 /* NULL descriptor */.quad 0x00c09a0000000fff /* 16Mb */.quad 0x00c0920000000fff /* 16Mb */.quad 0x0000000000000000 /* TEMPORARY - don't use */.fill 252,8,0 /* space for LDT's and TSS's etc */
相关文章:
【Linux0.11代码分析】04 之 head.s 启动流程
【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下: 系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…...

自动化测试和selenium的使用
目录 自动化测试定义 为什么选择selenium来作为我们web自动化测试的工具? 自动化测试定位元素 使用cssSelector定位 使用XPath 定位 操作测试对象 模拟手动从键盘输入 点击对象 获取页面文本 清除对象输入的文本内容 添加等待(三种方式&#…...
Ubuntu常用终端操作
终端快捷键 打开 Ctrlaltt:打开终端(默认路径为家目录) Ctrlshiftn:打开终端(与当前终端处于同一路径下) Ctrlshiftt:打开终端(在大终端下面创建小终端) alt数字 关闭 exitCtrld 窗口切换 …...
Spring Security 6.x 系列【34】认证篇之前后端分离场景下的集成方案
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. 案例演示2.1 未认证2.2 认证成功2.3 认证失败2.4 权限不足2.5 注…...
Qt之QTextToSpeech 让你的应用程序说话
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言QTextToSpeech基础使用1.创建一个QTextToSpeech对象2.朗读文字3.朗读文件和状态信息4.设置QTTS(QTextToSpeech)属性5.输出支持区域的设置列表、语言6.实现小数点朗读QTextToSpeech项目(练习)…...
为什么程序员喜欢用Linux?
Linux哪些行业在运用? Linux系统运用极其广泛,不少用户只知道windows,是因为,Linux的运用主要是在企业端。现在科技极其发达,我们手机在手,就能干很多事情,只需点一点屏幕,轻松完成…...
leetcode 598. 范围求和 II
题目描述解题思路执行结果 leetcode 598. 范围求和 II 题目描述 范围求和 II 给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时, M[x][y] 应该…...
javaweb前置知识
1.CSS CSS的角色:页面显示的美观风格CSS的基础语法:标签样式;类样式;ID样式;组合样式;嵌入式样式表;内部样式表;外部样式表盒子模型:border、margin、padding定位和浮动…...

基于微信小程序的酒店预定管理系统设计与实现
第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…...
26. Service——深入学习
本章讲解知识点 Service 会话保持机制Service 的多端口设置Service 支持的网络协议Kubernetes 的服务发现机制Headless ServiceEndpoint Slices这一节我们来讲讲 Service 更多细节 1. Service 会话保持机制 Service 支持通过设置 sessionAffinity 实现基于客户端 IP 的会话保…...
【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
文章目录 Check If Word Is Valid After Substitutions 检查替换后的词是否有效问题描述:分析代码 Tag Check If Word Is Valid After Substitutions 检查替换后的词是否有效 问题描述: 给你一个字符串 s ,请你判断它是否 有效 。 字符串 s…...

基于jenkinsfile布置java工程
需求 通过jenkins发布java项目到服务器 预备环境 项目地址: https://gitee.com/asaland/sb-docker-appJenkins 2.387.3 通过Jenkinsfile实现方式 jenkins ui 配置pipeline 什么是pipeline? 直接看注释吧,简单点就是编排可以多个跨时间的构建代理…...
Spring JpaTransactionManager事务管理
首先,在做关于JpaTransactionManager之前,先对Jpa做一个简单的了解,他毕竟不如hibernate那么热门,其实二者很相识,只不过后期hibernate和JDO 版本都已经兼容了其Jpa,目前大家用的少了。 JPA全称Java Persi…...
全国职业院校技能大赛网络建设与运维赛项赛题(七)
全国职业院校技能大赛 网络建设与运维 赛题 (七)...

asp.net+sqlserver企业公司进销存管理系统
基于WEB的进销存管理系统主要企业内部提供服务,系统分为管理员,和员工2部分。 在本基于WEB的进销存管理系统中分为管理员,和普通用户2中模式,其中管理人员主要是对企业内商品类型。商品信息商品的出入库信息,以及员工…...

WxGL应用实例:绘制点云
WxGL附带了几个工具函数,其中read_pcfile用来解析.ply和.pcd格式的点云文件,该函数返回一个PointCloudData类实例,包含以下属性: PointCloudData.ok - 数据是否可用,布尔型PointCloudData.info - 数据可用性说明&…...

一个月内面了30家公司,薪资从18K变成28K,真行啊····
工作3年,换了好几份工作(行业流行性大),每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心,而且特别不喜欢请假面试,对自己负责也对公司负责。 但是这次没想到市场环境非常不好,…...

《计算机网络——自顶向下方法》精炼——1.4到1.7
三更灯火五更鸡,努力学习永不止。无惧困难与挑战,砥砺前行向成功。 文章目录 引言正文时延排队时延 吞吐量协议层次,服务模型(重点)封装(重点)网络安全(选看)恶意软件的分…...
消息队列 (Message Queue)
消息队列 What 消息队列 是消息的队列;是消息的临时缓冲;是发布/订阅模式的兄弟;在多个进程/线程间实现异步通讯模式。 Why 消息队列在多个进程/线程中实现了异步通讯模式。 这里我们先介绍下同步消息处理。对于同步消息处理࿰…...

JavaScript原型链污染学习记录
1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制,比较官方的定义: 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...