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/10/14 16:56:28 阅读更多 →
【软件】【vs】Visual Studio编译c语言程序

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

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

2026/10/14 16:56:28 阅读更多 →
DirectShow图像处理实战:从Filter Graph架构到实时边缘检测实现

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

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

2026/10/14 6:32:42 阅读更多 →

最新新闻

Claude Code 弃用 npm 安装:迁移到原生安装器完整指南

Claude Code 弃用 npm 安装:迁移到原生安装器完整指南

如果你今天打开终端敲下claude,看到的不是熟悉的启动界面,而是一段黄字横幅提示——npm installation is deprecated,那你大概率已经升级到了 Claude Code 2.1.15。这不是你个人环境出了问题,也不是什么系统弹窗故障,而…

2026/10/15 22:12:43 阅读更多 →
2026上海展台搭建避坑指南:如何选择靠谱服务商?从上海御全展览看六大采购要点

2026上海展台搭建避坑指南:如何选择靠谱服务商?从上海御全展览看六大采购要点

2026上海展台搭建避坑指南:展台设计搭建如何选?从上海御全展览看六大采购要点署名:上海御全展览展示服务有限公司前言:效果图漂亮,现场为什么还会出问题?企业参加展会,需要协调展位设计、材料加…

2026/10/15 22:12:43 阅读更多 →
电源管理芯片采购:DC-DC和LDO的渠道与选型

电源管理芯片采购:DC-DC和LDO的渠道与选型

电源管理芯片(PMIC)是每块板子的"心脏"——DC-DC、LDO、PMU一出问题,整板宕机。电源芯片又是参数造假的重灾区:虚标效率、虚标电流、虚标输入范围,上机一切正常,满负荷和高温下原形毕露。电源芯片…

2026/10/15 22:12:43 阅读更多 →
成都GEO服务商怎么挑:按服务深度分型,别被报价带偏

成都GEO服务商怎么挑:按服务深度分型,别被报价带偏

最近两年,企业获取客户的路径正在悄悄转移。过去用户习惯在搜索引擎里敲关键词,如今越来越多的人直接问DeepSeek、豆包这类AI助手"帮我推荐一家"。当推荐入口从搜索框挪到对话窗口,一批做GEO(生成式引擎优化&#xff09…

2026/10/15 22:12:43 阅读更多 →
Bootstrap全局CSS样式详解:排版、表格与图片的默认规则与实战技巧

Bootstrap全局CSS样式详解:排版、表格与图片的默认规则与实战技巧

1. 为什么全局CSS样式值得单独拎出来讲很多人学Bootstrap的路径是这样的:先找个模板,把按钮、表单、导航栏的类名抄一遍,页面能跑起来就收工。等到哪天设计师给了一张新稿子,要求“这个标题在移动端小一点、在桌面端大一点”&…

2026/10/15 22:12:43 阅读更多 →
PyTorch同维度张量matmul:规则、广播与性能优化实战

PyTorch同维度张量matmul:规则、广播与性能优化实战

1. 为什么同维度张量乘法值得单独拎出来说刚接触 PyTorch 的人,十个里有八个会在torch.matmul上栽跟头。原因很简单:torch.mul、torch.mm、torch.matmul、运算符、torch.bmm这几个东西名字长得像,功能又互相重叠,文档里一句话带过…

2026/10/15 22:11:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →