Linux内核——多任务内核程序head.s 源码详解
📅 2026/8/2 19:10:02
👁️ 次浏览
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是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的Servlet容器中运行…
📅 2026/8/2 19:10:02
1、创建新项目2、搜索c,选择“空项目”3、输入项目名称,和项目要存放的位置:4、VisualStudio资源管理器中的源文件右键选择:添加-->新建项-->c文件(.cpp),将文件命名成.c文件即可…
📅 2026/8/2 19:10:02
1. 项目概述:为什么DirectShow在图形图像处理中依然值得深挖? 如果你在Windows平台上用Visual C搞过音视频开发,或者处理过摄像头采集、视频播放、格式转换这些活儿,那“DirectShow”这个名字对你来说肯定不陌生。它是一套微软在…
📅 2026/8/2 19:10:02
MediaPipe Face Mesh:移动端实时468点3D面部捕捉的终极指南 【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
想要在普通智能手机上实现…
📅 2026/8/2 20:04:43
配置如下:location /InviteFriends {alias /app/web/InviteFriends;index index.html;# 除去index.html 的重定向到/InviteFriends/#/且保留参数if ($uri ~* /InviteFriends/(?!index\.html).\.html$) {return 301 /InviteFriends/#/$is_args$args;}try_files $uri…
📅 2026/8/2 20:04:43
Ruffle终极指南:5分钟掌握开源Flash模拟器的完整使用方案 【免费下载链接】ruffle A Flash Player emulator written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle
Ruffle是一个基于Rust语言开发的Adobe Flash Player模拟器,…
📅 2026/8/2 20:04:43
1. 逆向工程入门:为什么IDA是绕不开的“瑞士军刀”刚接触逆向工程的新手,面对一堆十六进制字节码和汇编指令,是不是经常感觉无从下手?我刚开始学的时候也一样,看着那些天书般的代码,感觉比学一门外语还难。…
📅 2026/8/2 20:04:43
1. 问题现场:当PowerShell的Invoke-RestMethod命令突然“罢工”如果你和我一样,日常重度依赖PowerShell来自动化处理各种任务,比如从内部API拉取数据、调用云服务接口,或者简单地下载一个脚本,那么你对Invoke-RestMeth…
📅 2026/8/2 20:04:43
更多请点击:
https://codechina.net
第一章:员工流失预测不再靠猜(2024企业级AI预警模型白皮书首发) 传统HR决策长期依赖经验判断与滞后性离职面谈,而2024年发布的《企业级AI预警模型白皮书》首次将实时行为信号、组织…
📅 2026/8/2 20:03:42
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/2 1:22:12
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/2 0:02:59
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/2 1:22:12