些知识对于写一个操作系统来说是远远不够的。从现在的开始,我们将从无到有,一
步一步一个功能一个功能的写出操作系统。
我们就先了解一下写操作系统所需要的知识,会涉及到一些汇编语言及芯片的内部
结构,如果你没有这方面相关的基础的话,看起来可能会枯涩难懂一些,如果是这种情况的
话,建议粗略看一下就可以了,不要过分追求细节。
我们首先将在 ARM7 芯片上编写操作系统,因此本章将对 ARM7 芯片的内部结构做一
些介绍,并会介绍一下相关的汇编语言,以及 C 语言与汇编语言之间的关系,最后再介绍
一下 Wanlix 操作系统的文件组织结构及开发环境。
楼主 | 回复于 2018-08-06 沙发
的片上资源及外设被分配到不同的地址空间,不同数据结构的指针固定为 4 字节长度,这相
对 51 芯片来说方便很多也清晰很多,从用户编程的角度来看入手比较简单,因此本手册首
先选用 ARM7 芯片来作为开发操作系统的硬件平台。选用的 ARM7 芯片,是 ADI 公司的一
款芯片——Aduc7024。
Aduc7024 具有片上 AD、DA、GPIO、UART、I2C、SPI、TIMER、WDT、PWM 等外
设,具有 62KBytes 的内部 FLASH 程序空间和 8KBytes 的内部 RAM 空间,无需外挂 ROM
和 RAM,芯片的具体细节可以查阅附录中的参考文档 1。在我们的开发过程中,我们主要
使用了芯片的 UART,也就是串口,作为打印数据的端口,输出到 PC 上来观察操作系统的
运行。
当我们完成了操作系统的一些基本功能后,我们会将 Wanlix 和 Mindows 移植到另外一
款 ARM 芯片上——Cortex 内核的 ARM 芯片,并在此芯片上继续完善 Mindows 的功能。这
么做,第一是让读者了解 wanlix 和 Mindows 的移植过程,第二是让读者在移植过程中体会
操作系统与用户代码无关的重要性,第三,Cortex 内核芯片功能更强、资源更丰富,可以在
此芯片上实现更多的功能。Cortex 内核是 ARM 公司新推出的一种内核,其功能强大,性价
比高,后面章节我们再详细讨论,我们首先来了解 ARM7 芯片。
ARM7 支持 7 种处理器模式,分别是 USR 模式、SYS 模式、SVC 模式、ABT 模式 、
UND 模式、IRQ 模式和 FIQ 模式,虽然有这么多种模式但可以归纳为 2 大类:正常工作模
式和中断工作模式。
正常工作模式包括 USR 模式和 SYS 模式,USR 模式没有任何特性,是芯片最常用的模
式,芯片一般都是在 USR 模式下运行的。SYS 模式与 USR 模式也没什么区别,仅比 USR
模式权限大些,能访问到芯片的特殊寄存器,适合操作系统使用(但我不知道怎么使用,本
文没有使用该模式)。
楼主 | 回复于 2018-08-06 2#
入异常中断模式,芯片进入异常中断模式后软件就无法再继续提供原有功能了,异常中断模
式仅是为定位问题而提供的。异常中断模式包括 ABT 模式和 UND 模式,指令或数据出错
时就会进入 ABT 模式,例如,ARM 模式下的一条指令是需要访问 4 字节对齐的地址,如果
实际访问的地址不是 4 字节对齐的话,这时芯片就会进入 ABT 模式,程序 PC 指针就会跳
转到 ABT 的异常中断向量,执行 ABT 的中断服务程序。如果用户为 ABT 模式编写了定位
信息程序并挂到 ABT 异常中断上,那么就可以利用这些代码输出产生 ABT 异常的原因了 。
UND 模式与 ABT 模式的工作原理是一样的,只不过 UND 模式是在遇到没有定义的指令时
才会进入。
正常中断模式是为用户实现系统功能而设计的中断模式,它是预先设计好的,是系统运
行所必须的。正常中断模式又分为 IRQ 模式、FIQ 模式和 SVC 模式。IRQ 模式就是普通的
中断模式,当芯片产生中断时就会进入 IRQ 模式,等同于其它芯片的中断。FIQ 是快速中
断模式,它比 IRQ 中断优先级高,备份、还原中断现场时间更少些,也就是说能更优先更
快速的产生中断,除此之外它与 RIQ 中断没什么区别。SVC 是软中断模式,由软件触发,
常用于操作系统中,软中断在本文中将会有非常重要的应用。
楼主 | 回复于 2018-08-06 3#
断计算数据的过程,在这个计算过程中需要使用寄存器来存放指令和数据。寄存器与芯片内
核直接相连,因此芯片操作它们的速度要远快于操作内存的速度。但寄存器的数量较少,因
此指令和数据平时是存放在 FLASH 或者 RAM 中的,只有当使用时才会放入寄存器进行运
算。
每种芯片内部都会有寄存器,不同芯片的寄存器种类、数量各不相同,但都会有下面这
3 种:
一、PC(Program Counter)寄存器,PC 寄存器中存放的是当前执行的指令所在的地
址,芯片是通过 PC 寄存器找到其需要执行的指令的,更改 PC 寄存器就会发生指令跳转,
当我们在 C 语言里调用函数或者产生分支跳转时,实际上就是通过改变 PC 寄存器的值实现
的。
二、状态寄存器,状态寄存器里都会有 N、Z、C、V 这 4 个状态标志,N 用来表示数
据是有符号数还是无符号数,Z 用来表示 0 还是非 0,C 是进位标志,当产生进、借位时影
响的就是这个标志,V 是溢出标志,数据运算过程中产生数据溢出了就会更改此标志。
三 、
通用寄存器,这些通用寄存器用来临时存放数据,供芯片运算时使用,某些通用寄存器也可
能会有其它专有的功能,各个芯片的定义不一样。
楼主 | 回复于 2018-08-06 4#
其中 R15 寄存器又可以称之为 PC 寄存器,CPSR 是状态寄存器,其余的可以认为是通用寄
存器,在这些通用寄存器里,R13 和 R14 是比较特殊的,R13 寄存器又可以称之为 SP(Stack
pointer)寄存器,用来指示当前堆栈的位置,R14 寄存器又可以称之为 LR(Link register)
寄存器,当使用某些跳转指令时,硬件会自动将跳转前的指令存入 LR 寄存器中,以供返回
时使用。
前面说了 ARM7 芯片有 7 种工作模式,有些寄存器是这 7 种模式共用的,但 ARM7 芯
片也为每种不同的工作模式提供了专有的寄存器,进入不同模式便可以使用不同模式下的专
有寄存器,如下图所示,ARM7 芯片共有 37 个寄存器,但每种模式仅有 17 个寄存器可以使
用。
楼主 | 回复于 2018-08-06 5#
将 R0 置为 0,然后在 IRQ 模式下将 R0 加 1,最后 R0 的值为 1。而 R13 是可备份寄存器 ,
在 USR 模式下先将 USR 模式下的 R13 置为 0,进入 IRQ 模式后将 IRQ 模式下的 R13 加 1 ,
最后 USR 模式下的 R13 的值仍为 0,而 IRQ 模式下的 R13 值在它原有的基础上加了 1。在
上述操作中,虽然软件使用的都是 R13 这同一个名字,但芯片会根据不同模式而对不同模
式下的 R13 寄存器进行操作,上述对 R13 的操作就是对不同的 2 个 R13 寄存器进行的操作。
FIQ 的可备份寄存器是 R8~R14,其它模式的可备份寄存器是 R13~R14,包括 IRQ 模式 ,
因此切换到 FIQ 模式时需要备份的寄存器少一些,因此 FIQ 要比 IRQ 快一些。
楼主 | 回复于 2018-08-06 6#
CPSR 与 R 寄存器不同,所有模式下均是使用同一个 CPSP 寄存器,在模式切换时硬件 会自动将切换前模式的 CPSR 寄存器保存到切换后模式的 SPSR 寄存器中,然后切换后的模 式会继续使用 CPSR 寄存器作为自己的状态寄存器,当需要切换回原有模式时,硬件会自动 将 CPSR 从当前模式的 SPSR 寄存器恢复过来。 ARM7 芯片软件的运行完全是由上述的这些寄存器决定的,只要能合理的修改这些寄存 器就能控制软件的运行,操作系统就是通过备份、还原、更改这些寄存器来控制程序执行流 程的,进而实现任务之间的切换。由于 C 语言无法访问到这些寄存器,因此必须使用汇编 语言才能对这些寄存器进行操作,下节我们将了解一些 ARM7 的汇编语言,以便理解操作 系统的任务切换过程。 |
楼主 | 回复于 2018-08-06 9#
CPSR 与 R 寄存器不同,所有模式下均是使用同一个 CPSP 寄存器,在模式切换时硬件 会自动将切换前模式的 CPSR 寄存器保存到切换后模式的 SPSR 寄存器中,然后切换后的模 式会继续使用 CPSR 寄存器作为自己的状态寄存器,当需要切换回原有模式时,硬件会自动 将 CPSR 从当前模式的 SPSR 寄存器恢复过来。 ARM7 芯片软件的运行完全是由上述的这些寄存器决定的,只要能合理的修改这些寄存 器就能控制软件的运行,操作系统就是通过备份、还原、更改这些寄存器来控制程序执行流 程的,进而实现任务之间的切换。由于 C 语言无法访问到这些寄存器,因此必须使用汇编 语言才能对这些寄存器进行操作,下节我们将了解一些 ARM7 的汇编语言,以便理解操作 系统的任务切换过程。 |
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖