关于miniOS的介绍
http://blog.csdn.net/mr_raptor/article/details/7338051
本试验源码包括三部分:
miniOS源码:miniOS_xxxx(开发板名)工程目录下。
miniOS应用程序跑马灯:miniOS_app_led工程目录下。
miniOS应用程序打印程序:miniOS_app_print工程目录下。
# miniOS源码:http://download.csdn.net/detail/mr_raptor/4179593
# 程序下载:http://download.csdn.net/detail/mr_raptor/4382941
操作过程:
(1)在ADS下编译miniOS_xxxx工程,挑选Norflash发动,然后经过H-Jtag将minios_org.bin烧写到Norflash中0地址处。
(2)编译应用程序miniOS_app_led和miniOS_app_print,挑选Norflash发动,经过H-Jtag将miniOS_app_print.bin烧写到0x10000地址处,将miniOS_app_led.bin烧写0x20000地址处。
(3)发动开发板,能够看到miniOS发动信息。miniOS最多一起支撑62个进程碑文(在2440开发板64M内存上),miniOS发动结束之后,默许只要体系内核进程在碑文,能够经过按K1键,新创立进程,最多创立62个,按K2键,随机杀死一个进程,按K6键能够发动跑马灯进程。
(4)假如读者想写一个程序,让miniOS发动它,则依据编写规矩,编写程序,假如需求体系调用,还要自己完成体系调用接口。
剖析miniOS代码分为下面章节:
1. miniOS内存散布
2. 重要头文件阐明
3. 发动代码剖析
4. MMU与内存保护的完成
5. 内核定时器与中止处理
6. CPU形式切换
7. 进程调度与上下文切换技能
8. 软件中止与体系调用
9. 体系调试、优化及可改善当地
下面来看下第1节:
miniOS V2.0内存散布图:
Linux内核中内核地址空间分为:
- 直接内存映射区(Direct Memory Region)即:低端物理内存
- 动态内存映射区(VMalloc Region)即:高端物理内存
- 其它映射区
miniOS里,虚拟地址空间分为两大部分:
- 用户程序空间:0x0 ~ 0x80000000
- 内核办理空间:0x80000000 ~ 0xC0000000
>>用户程序空间每个进程运用其间的32M虚拟地址空间,其空间地址和其PID有如下联系:
PID * 32M = PID的进程空间
其间,0~32M空间为0号进程空间,其实是当时正在运转的地址空间。
之所以这么规划,是因为ARM CPU在舱位了MMU之后,将低于32M的地址作为进程内空间,当地址高于32M时,MMU会将其进行地址转化,具体内容,请参阅:MMU与内存办理章节。
每个进程空间为32M,将来进行进程切换时,只需求依照上面界说的联系,线性偏移即可,削减进程切换时的复杂度。
每个进程的实践物理内存空间为1M,也便是说每个进程只要1M的物理地址空间,当用户程序超越1M时,程序不能运转(当然还没有超越1M的程序),它们的映射联系如下所示:
0x30000000 ~ 0x34000000 —-> 0x0 ~ 0x80000000
>>内核办理地址空间又能够细分为以下几个部分:
- 物理内存彻底映射区:0x80000000 ~ 0x84000000
- 外设寄存器地址映射区:0x98000000 ~ 0xB0000000
- 发动ROM映射区:0xC0100000 ~ 0xC0000000
>>物理内存彻底映射区,首要用于办理进程实践地址空间,它其实是0x30000000 ~ 0x80000000的一个线性偏移地址(0x50000000),当咱们需求在内核空间里操作用户空间时,运用该完好映射区,十分便利操作,比方:加载程序到进程空间时,只需经过简略的核算即可知道其虚拟地址。
例如:发动5号进程时,其物理地址放在0x30000000开端的第5M空间里,那么其虚拟地址为0x30000000 + 5M + 0x50000000(偏移地址)。
>> 外设寄存器地址映射区,用来操作外设寄存器,当运用到外设寄存器时,能够经过简略的加减运算能够得到其虚拟地址。
>> 发动ROM映射区,用来映射NOR FLASH。
物理内存空间结构:
由上图可知,0号进程物理空间里(0x30000000 ~ 0x30100000),其实除了寄存os代码外,还有其它的用处。
- 页表放到了内存地址0x30000000处
- OS代码放到了0x300F0000,该地址是成心而为之
最开端的1MB物理内存地址0x30000000~0x30100000为0号内核进程地址空间,其实便是OS代码区和内核栈区及页表区。
我们OS代码放到了物理内存0x300F0000处,其被映射到虚拟地址0x800F0000处,所以ADS里设置的OS代码的运转地址为0x800F0000