32位系统内存划分
4G ----------------------------------
内核空间
3G ----------------------------------
| 堆区 malloc/free 程序员手动分配/手动释放
|----------------------------
| 栈区 系统自动分配,自动释放
| 1. 局部变量
| 2. 函数的参数
| 3. const修饰的局部变量,可以通过指针进行修改
|----------------------------
用户 | | .bss 段 未初始化的全局变量
空间 | 静 | static修饰的未初始化的变量(全局变量/局部变量)
| |--------------------
| 态 | .data 段 初始化的全局变量
| | static修饰的初始化的变量(全局变量/局部变量)
| 区 |--------------------
| | .rodata 段 常量
| | 使用const修饰的全局变量
| |--------------------
| | .text 段 只读
0G ----------------------------------
map.lds文件中内容分析
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
./Objects/start.o(.text)
*(.text)
}
. = ALIGN(4);
.rodata :
{
*(.rodata)
}
. = ALIGN(4);
.data :
{
*(.data)
}
. = ALIGN(4);
__bss_start = .;
.bss :
{
*(.bss)
}
__bss_end__ = .;
}
start.s文件中内容的分析
.text @ 伪操作,给编译器使用,不占用代码段的空间
@ 告诉编译器,以下为程序的代码段
-------------------------------------------------------
.globl _start @ 伪操作,给编译器使用
@ 将_start声明为全局的,可以被外部的文件使用
-------------------------------------------------------------
_start: @ 标签,类似于C语言中的函数名
@ 标签可以用来表示函数的入口地址
--------------------------------------------------------------
mov r0, #0xFF
@ 汇编指令,编译器将其编译生成32位的机器码,占用代码段的空间
@ 功能:将0xFF赋值给R0寄存器
-----------------------------------------------------------------
stop: @ 标签
@ 轮询处理各种事件,比如led灯,蜂鸣器,风扇
------------------------------------------------------------------
b stop @ 汇编指令
@ 功能:跳转到stop标签下的第一条指令指向
@ 等价于while(1){}死循环
---------------------------------------------------------------
@ 在裸机开发中,必须有一个死循环,
@ 否则程序有可能会跑飞
.end @ 伪操作,给编译器使用,表示代码段结束
CPU的组成和作用
CPU,全称为中央处理器,是计算机的核心部件之一,
负责执行计算机指令和控制计算机的操作。
CPU的主要功能是解释计算机程序指令并执行这些指令,
它是计算机的“大脑”。
CPU的工作原理是将指令和数据从内存中读取到CPU内部的寄存器中,
然后对这些指令和数据进行处理,最终将结果写回内存或输出到外设。
CPU的性能主要由时钟频率、指令集、缓存等因素决定。
在实际应用中,为了提高计算机的效率,
CPU会采用中断、分时、多任务等技术来实现多个程序的并发执行。
CPU的主要组成部分包括运算器和控制器。
其中,运算器用于执行算术和逻辑运算,
而控制器则用于控制程序的执行和数据的传输。
除此之外,CPU还包括寄存器、缓存、时钟等部分。
寄存器用于暂时存储数据和指令,缓存则用于提高CPU的运行效率,
时钟则用于控制CPU的工作频率。
总的来说,CPU是一块超大规模的集成电路,
是一台计算机的运算核心和控制核心。