**《操作系统课程设计》**
**(2018/2019学年第一学期第17周)**
**班级:16计算机3班**
**姓名:康宇哲**
**操作系统课程设计**
**目 录**
[一、题目: 3](#_Toc187586616)
[二、设计目的和要求: 4](#_Toc187586617)
[三、设计思路和方法: 5](#_Toc187586618)
[四、实现的功能及说明: 19](#_Toc187586619)
[五、核心源程序代码和界面图: 31](#_Toc187586621)
[六、心得体会: 32](#_Toc187586622)
1. **题目**
> **1.** 基于树莓派的嵌入式linux操作系统设计
**二、设计目的和要求**
**1.设计目的**
> 树莓派
> OS需要有自己的调度程序。如果实现一个调度程序,还必须处理定时器中断。定时器中断意味着操作系统应该支持一些驱动程序并提供系统调用以将它们暴露给用户应用程序。在此基础上编写驱动程序使之在屏幕上写入内容并从键盘读取用户输入的指令。此外,操作系统需要能够加载和执行用户程序,因此需要支持某种文件系统并能够理解某种可执行文件格式。
> 树莓派搭载了一枚ARM架构64位4核心SOC(BCM2835)主频为700MHZ,SOC为片上操作系统支持精简指令集,并且板载了512MB
> DDR2内存。该单板机系统支持SD卡Boot启动。在BCM2835启动时会通过Boot目录启动。树莓派启动分为以下步骤
- **First stage bootloader**
> 树莓派上电后,SoC 中的 bootloader 首先被执行,其作用是挂载 SD 卡上的 FAT32
> 分区,从而加载下一阶段的 bootloader。这部分程序被固化在 SoC 的 ROM
> 中,用户无法修改。
- **Second stage bootloader (bootcode.bin)**
> 这个阶段的 bootloader 会从 SD 卡上检索 GPU 固件,将固件写入 GPU,随后启动
> GPU。
- **GPU firmware (start.elf)**
> 本阶段中,GPU
> 启动后会检索附加配置文件(config.txt、fixup.dat),根据其内容设置 CPU
> 运行参数及内存分配情况,随后将用户代码加载至内存,启动 CPU。
- **User code (kernel8.img)**
> 通常情况下,CPU 启动后便开始执行 kernel8.img
> 中的指令,初始化操作系统内核,在某些情况下,也可以被 U-BOOT 代替,由 U-BOOT
> 来加载内核。在树莓派 1 代中,User code 部分被保存在 kernel.img 文件中,2
> 代中,该文件更名为 kernel7.img,3 代中,该文件更名为
> kernel8.img,本课程设计的全部工作,都在该文件上完成。
> 综上所述,树莓派上电后的初始化工作大多是在 GPU 中完成的(GPU 内的一颗 RSIC
> 核心用于完成这些操作)。目前树莓派的 GPU bootloader
> 仍未开源,只以二进制形式发布,因此本课程设计使用了官
> 方提供的 [raspberrypi/firmware](https://github.com/raspberrypi/firmware) 官方仓库中的bootcode.bin
> 和 start.elf,直接复制到 SD 卡Boot目录。
> 树莓派刻录了官方镜像以后boot分区文件展示。我们自制的操作系统会编译成kernel.Img文件替代官方的kernel.img文件。
![](media/ee3d0bc92f6ea03fc377b681017b72d9.png)
树莓派系统启动流程示意图
![](media/8e92313d85a92516c1b7dd80b32eec04.png)
> **2.设计要求**
综上在参考了
1. 《30 天自制操作系统》
2. 《嵌入式实时操作系统 uc/os III》
3. 《linux 内核设计的艺术》
4. 《Linux 0.01 内核分析与操作系统设计》
> 这几本书以后综合自己的能力对该嵌入式树莓派操作系统提出了以下几个可以完成的功能。
1. 提供 GPIO 处理函数;
2. GUI 界面,有窗体 demo, 窗体可对鼠标操作做出相应;
3. 默认分辨率 1440×900;
4. 可显示 bmp 24 位色(true color)图片;
5. 支持鼠标键盘输入设备;
6. 多任务,默认最多 16 个任务;
7. 时间片轮转调度;
8. 任务间通信;
9. 任务阻塞,挂起;
10. 支持动态申请内存;
11. 系统最多支持 255 个 timer 定时器;
12. 支持 UART 通信。
**三、设计思路与方法**
**1.设计操作系统的基础依赖**
本课程设计要完成多进程与内存管理,需要系统时钟定时器和中断。故设计了定时器和中断函数并设置寄存器。
\#\#\#中断向量
\* 树莓派Zero搭载的是BCM2835的处理器。BMC2835 ARM1176
是ARMv6版本的。在默认条件下,处理器加电后会自动加载SD卡中的kernel.img到内存0x8000处。
\* ARM的中断向量是在地址0x00 - 0x20
\* 0x00 复位 reset
\* 0x04 未定义指令
\* 0x08 软终端 SWI
\* 0x0c 指令预取指
\* 0x10 数据访问中止
\* 0x14 保留
\* 0x18 IRQ
\* 0x1c FIQ
所以内核加载到内存做的第一件事应该是设置好中断向量。
**ARM外设中断表:**
![](media/f786cfd29da6353fbe3920af65b97459.png)
\#\#\#ARM处理器模式
ARM处理器共有7中模式,每种模式的寄存器会有些不同。OS
One默认运行在SUPERVISOR模式下,当IRQ中断发生时运行在IRQ模式。OS
One只使用了这两种模式。
CPSR中[4:0]表示处理器所处的模式
\* 0b10000 USER
\* 0b10001 FIQ
\* 0b10010 IRQ
\* 0B10011 SUPERVISOR
\* 0b10111 ABORT
\* 0b11011 UNDEFINEED
\* 0b11111 SYSTEM
设置中断向量和sp寄存器后,\`b \_cstartup\` 进入 startup.c中的\`_cstartup\`
函数。\`_cstartup\`最终会调用内核主函数 \`os_main()\`
\#\#\#中断
CPSR第7位是IRQ中断禁止位。两个相关函数\`_enable_interrupts\`和\`_enable_interrupts\`
这里定义两个头文件timer.h和interrupt.h用于计时器与中断。
中断函数参考剑桥大学树莓派操作系统设计项目和BCM2835 SOC技术手册
\#\#\#树莓派 interrupt
\#\#\#\#1.Introduction
\>\#\#\#\#\#ARM 共有两种中断源
\>\>1.来自GPU外设的中断
\>\>2.来自ARM控制外设
\>\#\#\#\#\#ARM有三种中断
\>\>1.来自ARM特殊外设
\>\>2.来自GPU外设的中断
\>\>3.特殊事件中断
\>\#\#\#\#\#ARM特殊事件中断:
\>\>1.一个定时器
\>\>2.一个邮箱(GPU)
\>\>3.两个门铃
\>\>4.两个GPU空闲中断
\>\>5.两个地址/访问错误中断
\>\#\#\#\#\#邮箱和门铃寄存器不是通用的
\>每一个中断源(GPU/ARM)都有一个使能位(R/W)和未决位(RO)
\>默认门铃中断0,1和邮箱0只可被GPU写,ARM读。门铃中断2,3和邮箱中断1相反。
\#\#\#\#2. Interrupt pending.
\>ARM有三个中断未决寄存器,一个basic pending register 两个 GPU pending
registers.
\>\#\#\#\#\#Basic pending register.
\>\>The basic pending register has interrupt pending bits for the ARM specific
interrupts .
\>\#\#\#\#\#GPU pending registers.
\>\>There are two GPU pending registers with one bit per GPU interrupt source.
\#\#\#\#3 Fast Interrupt (FIQ).
\>
The ARM also supports a Fast Interrupt (FIQ). One interrupt sources can be
selected to be connected
to the ARM FIQ input. There is also one FIQ enable. An interrupt which is
selected as FIQ should have
its normal interrupt enable bit cleared. Otherwise an normal and a FIQ interrupt
will be fired at the
same time. Not a good idea!
\#\#\#\#4 Interrupt priority.
\>
There is no priority for any interrupt. If one interrupt is much more important
then all others it can
be routed to the FIQ. Any remaining interrupts have to be processed by polling
the pending registers.
It is up to the ARM software to device a strategy. e.g. First start looking for
specific pending
bits or process them all shifting one bit at a time.
\#\#\#\#5 Registers 寄存器设置
\>The base address for the ARM interrupt register is 0x7E00B000.
\>
\>
Registers overview:
\>
0x200 IRQ basic pending
0x204 IRQ pending 1
0x208 IRQ pending 2
0x20C FIQ control
0x210 Enable IRQs 1
0x214 Enable IRQs 2
0x218 Enable Basic IRQs
0x21C Disable IRQs 1
0x220 Disable IRQs 2
0x224 Disable Basic IRQs
**中断寄存器地址表�
Yuki-^_^
- 粉丝: 3111
- 资源: 4587
最新资源
- comsol光学仿真 comsol光学仿真 Comsol静电场,电磁场,传热,等离子体ICP建模仿真 电路,模电辅导 任意偏振态BIC,利用扭转光子晶体实现远场偏振的调控
- 机械设计特制螺母点胶锁付step非常好的设计图纸100%好用.zip
- 一些机器学习算法的demo 普通最小二乘法,决策树(Iris鸢尾花数据集),KNN(mnist手写数字数据集),朴素贝叶斯分类西瓜数据集,trec06c数据集垃圾邮件分类(垃圾邮件),逻辑斯蒂.zip
- dsp 28377 锁相环代码
- 中国城市0123456.zip
- 机械设计微型开关组装半自动化设备sw17可编辑非常好的设计图纸100%好用.zip
- 中小型即时流数据分析集群.zip
- 基于VDLL的矢量型GPS信号跟踪算法MATLAB仿真,包括程序+word设计文档
- 中文NLP数据中心.zip
- 中文、英文NER、英汉机器翻译数据集 中英文实体识别数据集,中英文机器翻译数据集,中文分词数据集.zip
- 中文医疗对话数据 中文医疗对话数据集.zip
- 机械设计瓦力履带机器人sw18可编辑非常好的设计图纸100%好用.zip
- 中文数据集下SimCSE+ESimCSE的实现.zip
- VESC非线性磁链观测器+PLL (1)基于STM3F4源码:VESC的无感非线性观测器代码,并做了简单的调试,可以做到0速启动 代码注释非常详细,快速入门 (2)参考文献(英文+翻译):为VE
- 中文自然语言处理数据集,平时做实验的材料 欢迎补充提交合并 .zip
- 机械设计铜柱胶壳铁片组装机sw16可编辑非常好的设计图纸100%好用.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈