Linux内核——多任务内核程序head.s 源码详解
Linux内核完全注释:基于0.11内核(修正版V3.0) 的第四章,最后一节的实验,多任务内核程序head.s 源码详解# 多任务内核程序 [32] 位的启动代码# 包含32位模式下的初始化设置代码,时钟中断代码,系统调用中断代码和两个任务代码LATCH=11930SCRN_SEL=0x18# 屏幕显示内存段选择符。# 问:以下这些选择符是怎么定的值?根据段选择符的定义:位bit[15-3]为段索引,位bit[2]为0表示GDT,1表示LDT,bit[1-0]表示RPL。所以0x18二进制为[00011 0 00]表示GDT表中的第三个描述符。TSS0_SEL=0X20# 任务0的TSS段选择符。 0x20二进制为[00100 0 00],表示选择GDT表中的第四个描述符LDT0_SEL=0X28# 任务0的LDT段选择符。 0x28二进制为[00101 0 00],表示选择GDT表中的第五个描述符TSS1_SEL=0X30# 任务1的TSS段选择符。 0x30二进制为[00110 0 00],表示选择GDT表中的第六个描述符LDT1_SEL=0X38# 任务1的LDT段选择符。 0x38二进制为[00111 0 00],表示选择GDT表中的第七个描述符.global startup_32 .text# 表示可执行代码段(问:实际在编译时有什么影响吗?.text,.data,.bss,用于分别定义当前代码段,数据段和未初始化数据段,# 在链接多个目标模块时,链接程序会根据它们的类别把各个目标模块中的相应段分别组合在一起。)startup_32:# 首先加载 数据段寄存器DS、堆栈段寄存器SS和堆栈指针ESP。所有段的线性基地址都是0.movl$0x10, %eax# 段选择子 0x10 = 00010 0 00 根据段选择符的定义(从左向右分析:00010 表示段索引,0 表示在GDT表查找, 00 表示后三位表示RPL(Ring0-3),在GDT表中查找 第00010个的段描述符 ) # ???上面的赋值,感觉没啥卵用, 当然 0x10, 在下面的 gdt定义里面有, 是 可读写的数据段???mov %ax, %ds# 将eax的低16位(ax)赋给ds寄存器。当指令中没有指定所操作数据的段时,那么DS将是数据段寄存器lss init_stack, %esp# init_stack地址值的低16位传入esp,高16位传入ss.# ???lss mem, reg = mem的低字-reg, mem的高位-段,这里是 ss# 并且, 所以这里是加载了 16+32个字节一共, lss是把前4个字节加载到esp, 后2个字节加载到ss = 0x10 , 堆栈段必须可读写,所以这里用了内核空间的数据段0x10,???# esp-init_stack的地址, 它的上面有 128 * 4 字节的零值,作为栈空间来使用.call setup_idt# 设置中断向量表call setup_gdt# 设置全局描述符表movl$0x10, %eax# 重新设置GDT表后,虽然段选择符没变,但是实际的描述表位置已经改变 (感觉boot.s里的idt和gdt没啥用啊)# (setup_gdt子程序中用lgdt指令更新了GDTR寄存器中gdt表的位置和长度),所以要重新加载段寄存器mov %ax, %ds mov %ax, %es mov %ax, %fs mov %ax, %gs# 上面所有的段寄存器, 存的都是 内核数据段选择子 0x10; (当然除了CS,这个不能直接设置的)lss init_stack, %esp# 重新加载ss esp# ################################## 设置 时钟芯片 10ms 一次中断信号 ############################# 设置8253定时芯片。把计数器通道0,设置成每隔10毫秒向中断控制器发送一个中断信息号# 下面介绍一下8253定时芯片:# 计数器的工作原理是这样的:它有一个输入频率,在PC上是1193180HZ , 所以把 1193180 /100 = 11931.8 ≈ 11930 赋值给计数器, 收到11931.8 次信号,记作一个周期。也就是周期 0.01s = 10ms# 8253具有3个独立的计数通道,采用减1计数方式。在门控信号有效时,每输入1个计数脉冲,通道做1次计数操作。当计数脉冲是已知周期的时钟信号时,计数就成为定时。# 方式3为:方波发生器,最适合计算机。movb$0x36, %al# 控制字:设置通道0工作在方式3、计数器初值采用二进制。movl$0x43, %edx# 8253芯片控制字寄存器写端口。outb %al, %dx# 向I/O端口写入一个字节,这里是向端口0x43写入0x36movl$LATCH, %eax# 初始计数值设置为LATCH(1193180/100),即频率100HZmovl$0x40, %edx# 通道0的端口。outb %al, %dx# 分两次把初始计数值写入通道0.movb %ah, %al outb %al, %dx# 上面的这个, 了解下就可以,就是为了设置 8253的工作方式而已# ###### 在IDT表第8和第128(0x80)项处分别设置定时中断门描述符和系统调用陷阱门描述符。# ##### 设置定时中断门描述符 ###### 为IDT表(中断描述符表)的第8项,设置中断门描述符(目的是发生该中断,可以调用到设置好的处理程序# 这里先解释一下int $0x80:# int $0x80是一条ATT语法的中断指令,用于Linux的系统调用。# Linux系统下的汇编语言用ATT的语法,如果翻译成Intel的语法就是int 80h,就像我们在Intel的语法下的DOS汇编中经常用的int 21h调用DOS中断,同样如果换成ATT语法就是int $0x80。# 不过无论使用那一种语法,int $0x80或者int 80h都是针对Linux的,在DOS或者Windows下不起相应作用。反之亦然。movl$0x00080000, %eax# eax的值将被用于设置到门描述符的低32位。根据门描述符的格式,0x0008 对应的是段选择符。# 根据 段选择符的格式,0x0008 = 0b1 0 00, 表示gdt表中第二个描述符, 内核的代码段movw$timer_interrupt, %ax# 设置eax的低16位,也就是设置 定时中断门描述符的段中偏移值,取定时中断处理程序地址。movw$0x8e00, %dx# edx的值将被用于设置到门描述符的高32位。edx 被设置为0x0000 8e00。

相关新闻

基于jenkins进行定制化开发

基于jenkins进行定制化开发

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的Servlet容器中运行…

2026/8/2 19:10:07 阅读更多 →
【软件】【vs】Visual Studio编译c语言程序

【软件】【vs】Visual Studio编译c语言程序

1、创建新项目2、搜索c,选择“空项目”3、输入项目名称,和项目要存放的位置:4、VisualStudio资源管理器中的源文件右键选择:添加-->新建项-->c文件(.cpp),将文件命名成.c文件即可&#xf…

2026/8/2 19:10:07 阅读更多 →
DirectShow图像处理实战:从Filter Graph架构到实时边缘检测实现

DirectShow图像处理实战:从Filter Graph架构到实时边缘检测实现

1. 项目概述:为什么DirectShow在图形图像处理中依然值得深挖? 如果你在Windows平台上用Visual C搞过音视频开发,或者处理过摄像头采集、视频播放、格式转换这些活儿,那“DirectShow”这个名字对你来说肯定不陌生。它是一套微软在…

2026/8/2 19:10:07 阅读更多 →

最新新闻

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号 【免费下载链接】coffeecatch CoffeeCatch, a tiny native POSIX signal catcher (especially useful for JNI code on Android/Dalvik) 项目地址: https://gitcode.com/gh_mirrors/co/coffeecatch …

2026/8/2 19:53:34 阅读更多 →
Cocos Creator项目创建与目录结构全解析:从入门到高效开发

Cocos Creator项目创建与目录结构全解析:从入门到高效开发

1. 项目概述:从零到一,理解你的第一个Cocos项目 刚接触Cocos Creator,很多朋友在成功安装编辑器后,面对那个简洁的启动界面,心里可能既兴奋又有点茫然:点击“新建项目”之后呢?这一大堆自动生成…

2026/8/2 19:53:34 阅读更多 →
Unity游戏Windows安装包制作指南:从构建到专业分发

Unity游戏Windows安装包制作指南:从构建到专业分发

1. 项目概述:从Unity构建到Windows安装包的最后一公里 如果你用Unity3D开发过PC游戏或者桌面应用,肯定经历过这个阶段:在Unity编辑器的Build Settings里满怀期待地点击“Build”,生成一个包含.exe和一堆数据文件的文件夹。然后&am…

2026/8/2 19:53:34 阅读更多 →
Unity粒子特效优化指南:风暴与暴风雪效果的性能调优实战

Unity粒子特效优化指南:风暴与暴风雪效果的性能调优实战

1. 项目概述:当粒子遇上风暴在Unity里做特效,尤其是像风暴、暴风雪这种大规模、高密度的自然现象,绝对是性能的“试金石”。很多开发者,包括我自己在早期项目里,都踩过这样的坑:场景里放一个看起来很酷的暴…

2026/8/2 19:53:34 阅读更多 →
终极完整指南:CMWTAT Digital Edition Windows数字权利激活工具深度解析

终极完整指南:CMWTAT Digital Edition Windows数字权利激活工具深度解析

终极完整指南:CMWTAT Digital Edition Windows数字权利激活工具深度解析 【免费下载链接】CMWTAT_Digital_Edition CloudMoe Windows 10/11 Activation Toolkit get digital license, the best open source Win 10/11 activator in GitHub. GitHub 上最棒的开源 Win…

2026/8/2 19:53:34 阅读更多 →
程序员究竟该干什么?技术向善,什么才叫做向善

程序员究竟该干什么?技术向善,什么才叫做向善

一、那架还在飞的战机 你见过那个画面吗?人类早就死光了,变成骷髅了,但天空里的战机还在按程序轰炸。无人机还在互相锁定、开火、投弹。地面上什么都没有了,连废墟都懒得炸了,但它们还在飞。因为程序没停。 这不是科幻…

2026/8/2 19:52:34 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →