【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(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可…...
顶级白帽黑客必备的十大黑客技术
1.熟悉Linux系统和命令行操作: Linux是黑客的基石,几乎所有黑客工具和技术都是在Linux平台上运行的,熟悉Linux系统和命令行操作是必须的。 2.掌握网络协议和TCP/IP模型: 了解TCP/IP模型、网络协议和通信流程是黑客攻击的基础&a…...
【关于认证鉴权一些概念梳理】
关于认证鉴权一些概念梳理 记录一些灵感瞬间聊聊Session,Cookie和Token三剑客的特性前后端分离登录中的springsecurity与不分离的异同三更up关于springSecurity的讲解B站知乎上关于springSecurity的讲解掘金大佬SpringSecurityJWT认证流程解析一个权限对应一个资源&…...
16.网络爬虫—字体反爬(实战演示)
网络爬虫—字体反爬 一字体反爬原理二字体反爬模块FonttoolsTTF文件 三FontCreator 14.0.0.2790FontCreatorPortable下载与安装 四实战演示五后记 前言: 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域…...
BOM概述
目录 什么是BOM 浏览器对象模型(Browser Object Model (BOM)) Window对象 一些常用方法 JavaScript Window Screen Window Screen Window Screen 高度 Window Screen 可用宽度 Window Screen 可用高度 Window Screen 色深 Window Screen 像素深…...
3.Docker实用技术
Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…...
群体无人机:协同作战的未来
摘要:本文将探讨群体无人机技术的发展及其在多个领域的应用,特别是在军事作战、救援任务和物流方面的潜力。我们将分析群体无人机在协同作战中的优势,以及如何通过协同控制和通信技术实现更高效的任务完成。 内容: 引言 简要介绍…...
如何在Windows AD域中驻留ACL后门
前言 当拿下域控权限时,为了维持权限,常常需要驻留一些后门,从而达到长期控制的目的。Windows AD域后门五花八门,除了常规的的添加隐藏用户、启动项、计划任务、抓取登录时的密码,还有一些基于ACL的后门。 ACL介绍 …...
LVGL移植——stm32f4
LVGL移植说明 移植LVGL版本:8.3.6 主控:STM32F407ZGT6 github链接:https://github.com/lvgl/lvgl.git 文章目录 LVGL移植说明STM32移植LVGL①需要的依赖文件②移植显示驱动文件③将文件加入工程当中④配置心跳④修改栈堆的空间⑤编译链接 STM…...
ASEMI代理ADP5054ACPZ-R7原装ADI车规级ADP5054ACPZ-R7
编辑:ll ASEMI代理ADP5054ACPZ-R7原装ADI车规级ADP5054ACPZ-R7 型号:ADP5054ACPZ-R7 品牌:ADI/亚德诺 封装:LFCSP-48 批号:2023 引脚数量:48 工作温度:-40C~125C 安装类型:表…...
TCP/IP相关面试题
1. 什么是TCP/IP协议?它的作用是什么? TCP/IP(Transmission Control Protocol/Internet Protocol)互联网中最常用的协议,是计算机网络通信的基础。由TCP协议和IP协议两部分组成。IP协议负责数据的传输和路由选择&#…...
建设农村信息网站/哪家公司做seo
Python随机边缘填充:让你的图像变得更完美 在处理图像时,很多时候需要对图像进行边缘填充。那么问题来了,如何才能让图像的边缘填充看起来更自然、更完美呢?Python中有很多方法可以实现这个目的,本文将介绍一种让你的图像边缘填充看起来更自然的方法。 通常情况下,我们…...
武汉市官方网站/推广引流渠道有哪些
http://www.cnblogs.com/mecity/archive/2011/06/11/2078527.html http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/转载于:https://www.cnblogs.com/faxian/p/4352816.html...
成都住房和城乡建设局网站/百度统计数据分析
ecshop2.7的版权耍了一下花样,不能按以前的方式清除了,不过只要是源码就有可以清除的办法。其实也很简单,方法如下:themes\default\library\page_footer.lbi 文件(default是你的模板文件夹),找到下面一行 {foreach f…...
腾讯企点客户通/成都网站seo服务
手机语音信箱能够实现全天24小时的服务时间,设置手机语音信箱,能够使用户不过任何一个电话。如果语音信箱出现了留言的话,用户的手机会接收到消息,手机信箱特别的方便,那么应该如何设置语音信箱呢!接下来小编就具体为大…...
做做网站/企业网站优化方案案例
我们把黎曼积分推广一下.黎曼积分里要求对区间$[a,b]$进行任意的有限分割.我们看看对区间$[a,b]$进行任意的分割(有限或无限的分割)会发生什么事.更具体地叙述如下: 设$f$是闭区间$[a,b]$上的有界函数(之所以规定有界,是因为$[a,b]$上的无界函数不是黎曼…...
做门户网站赚广告费/口碑seo推广公司
以前在学校自己没好好学习过C#,除了在上机课动手练习,课余时间都没有练习过。不知道方法如何写,不明白类到底是干什么用的,不清楚什么是面向对象。不明白的地方也不问老师,问题越积越多,就以为自己不适合做…...