Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
鸿蒙内核源码分析
注释鸿蒙内核源码
提交
68e75446
注释鸿蒙内核源码
项目概览
鸿蒙内核源码分析
/
注释鸿蒙内核源码
通知
270
Star
29
Fork
11
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
106
Wiki
分析
仓库
DevOps
项目成员
Pages
注释鸿蒙内核源码
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
106
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
68e75446
编写于
2月 25, 2021
作者:
鸿蒙内核源码分析
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
开机的第一条汇编指令在哪里? 注解开机汇编代码部分
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://weharmony.gitee.io
上级
f5946584
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
66 addition
and
66 deletion
+66
-66
arch/arm/arm/src/los_hw_exc.S
arch/arm/arm/src/los_hw_exc.S
+1
-1
arch/arm/arm/src/startup/reset_vector_mp.S
arch/arm/arm/src/startup/reset_vector_mp.S
+64
-64
zzz/git/push.sh
zzz/git/push.sh
+1
-1
未找到文件。
arch/arm/arm/src/los_hw_exc.S
浏览文件 @
68e75446
...
...
@@ -194,7 +194,7 @@ _osExceptSwiHdl: @软中断异常处理
MOV
FP
,
#
0
@
Init
frame
pointer
CPSIE
I
@
开中断
,
表明在系统调用期间可响应中断
BLX
OsArmA32SyscallHandle
/*
处理系统调用
*/
BLX
OsArmA32SyscallHandle
/*
交给
C
语言
处理系统调用
*/
CPSID
I
@
执行后续指令前必须先关中断
POP_FPU_REGS
R1
@
弹出
FP
值给
R1
...
...
arch/arm/arm/src/startup/reset_vector_mp.S
浏览文件 @
68e75446
...
...
@@ -69,8 +69,8 @@
.
arm
/*
param0
is
stack
bottom
,
param1
is
stack
size
,
r12
hold
cpu
id
*/
.
macro
EXC_SP_SET
param0
,
param1
ldr
r1
,
=
\
param0
.
macro
EXC_SP_SET
param0
,
param1
@
设置各工作模式栈
,
r12
保存了
CPU
ID
ldr
r1
,
=
\
param0
mov
r0
,
\
param1
bl
sp_set
.
endm
...
...
@@ -100,42 +100,42 @@ __exception_handlers:
*
Assumption
:
ROM
code
has
these
vectors
at
the
hardware
reset
address
.
*
A
simple
jump
removes
any
address
-
space
dependencies
[
i
.
e
.
safer
]
*///一个简单的跳转将删除任何地址空间依赖关系
b
reset_vector
b
_osExceptUndefInstrHdl
b
_osExceptSwiHdl
b
_osExceptPrefetchAbortHdl
b
_osExceptDataAbortHdl
b
_osExceptAddrAbortHdl
b
OsIrqHandler
b
_osExceptFiqHdl
b
reset_vector
@
所有的异常中断入口组成了
reset
vector
b
_osExceptUndefInstrHdl
@
异常处理之
CPU
碰到不认识的指令
b
_osExceptSwiHdl
@
异常处理之:软中断
b
_osExceptPrefetchAbortHdl
@
异常处理之:取指异常
b
_osExceptDataAbortHdl
@
异常处理之:数据异常
b
_osExceptAddrAbortHdl
@
异常处理之:地址异常
b
OsIrqHandler
@
异常处理之:硬中断
b
_osExceptFiqHdl
@
异常处理之:快中断
@使机器进入管理模式的启动代码
/
*
Startup
code
which
will
get
the
machine
into
supervisor
mode
*/
.
global
reset_vector
.
type
reset_vector
,
function
reset_vector
:
/
*
clear
register
TPIDRPRW
*/
mov
r0
,
#
0
mcr
p15
,
0
,
r0
,
c13
,
c0
,
4
/
*
do
some
early
cpu
setup
:
i
/
d
cache
disable
,
mmu
disabled
*/
mrc
p15
,
0
,
r0
,
c1
,
c0
,
0
bic
r0
,
#(
1
<<
12
)
bic
r0
,
#(
1
<<
2
|
1
<<
0
)
mcr
p15
,
0
,
r0
,
c1
,
c0
,
0
/
*
r11
:
delta
of
physical
address
and
virtual
address
*/
adr
r11
,
pa_va_offset
ldr
r0
,
[
r11
]
sub
r11
,
r11
,
r0
mrc
p15
,
0
,
r12
,
c0
,
c0
,
5
/*
r12
:
get
cpuid
*/
and
r12
,
r12
,
#
MPIDR_CPUID_MASK
cmp
r12
,
#
0
bne
secondary_cpu_init
mov
r0
,
#
0
@
r0
=
0
mcr
p15
,
0
,
r0
,
c13
,
c0
,
4
@
c0
,
c13
=
0
,
C13
为进程标识符
含义见
ARM720T
.
PDF
第
64
页
/
*
do
some
early
cpu
setup
:
i
/
d
cache
disable
,
mmu
disabled
*/
@
禁用
MMU
,
i
/
d
缓存
mrc
p15
,
0
,
r0
,
c1
,
c0
,
0
@
r0
=
c1
,
c1
寄存器详细解释见第
64
页
bic
r0
,
#(
1
<<
12
)
@
位清除指令
,
清除
r0
的第
11
位
bic
r0
,
#(
1
<<
2
|
1
<<
0
)
@
清除第
0
和
2
位
,
禁止
MMU
和缓存
0
位:
MMU
enable
/
disable
2
位:
Cache
enable
/
disable
mcr
p15
,
0
,
r0
,
c1
,
c0
,
0
@
c1
=
r0
/
*
r11
:
delta
of
physical
address
and
virtual
address
*/
@
物理地址和虚拟地址的增量
adr
r11
,
pa_va_offset
@
将基于
PC
相对偏移的地址
pa_va_offset
值读取到寄存器
R11
中
ldr
r0
,
[
r11
]
@
将
R11
的值给
r0
sub
r11
,
r11
,
r0
@
r11
=
r11
-
r0
mrc
p15
,
0
,
r12
,
c0
,
c0
,
5
/*
r12
:
get
cpuid
*/
@
获取
CPUID
and
r12
,
r12
,
#
MPIDR_CPUID_MASK
@
r12
经过掩码过滤
cmp
r12
,
#
0
@
当前是否为
0
号
CPU
bne
secondary_cpu_init
@
不是
0
号主
CPU
则调用
secondary_cpu_init
/
*
if
we
need
to
relocate
to
proper
location
or
not
*/
adr
r4
,
__exception_handlers
/*
r4
:
base
of
load
address
*/
ldr
r5
,
=
SYS_MEM_BASE
/*
r5
:
base
of
physical
address
*/
subs
r12
,
r4
,
r5
/*
r12
:
delta
of
load
address
and
physical
address
*/
adr
r4
,
__exception_handlers
/*
r4
:
base
of
load
address
*/
@
r4
获得加载基地址
ldr
r5
,
=
SYS_MEM_BASE
/*
r5
:
base
of
physical
address
*/
@
r5
获得物理基地址
subs
r12
,
r4
,
r5
/*
r12
:
delta
of
load
address
and
physical
address
*/
@
r12
=
r4
-
r5
加载地址和物理地址的增量
beq
reloc_img_to_bottom_done
/*
if
we
load
image
at
the
bottom
of
physical
address
*/
/
*
we
need
to
relocate
image
at
the
bottom
of
physical
address
*/
...
...
@@ -154,10 +154,10 @@ reloc_img_to_bottom_loop:
sub
r11
,
r11
,
r12
/*
r11
:
eventual
address
offset
*/
reloc_img_to_bottom_done
:
ldr
r4
,
=
g_firstPageTable
/*
r4
:
physical
address
of
translation
table
and
clear
it
*/
add
r4
,
r4
,
r11
bl
page_table_clear
ldr
r4
,
=
g_firstPageTable
/*
r4
:
physical
address
of
translation
table
and
clear
it
*/
@
获取页面地址
add
r4
,
r4
,
r11
@
r4
=
r4
+
r11
bl
page_table_clear
@
清除页表
@设置页表
PAGE_TABLE_SET
SYS_MEM_BASE
,
KERNEL_VMM_BASE
,
KERNEL_VMM_SIZE
,
MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
PAGE_TABLE_SET
SYS_MEM_BASE
,
UNCACHED_VMM_BASE
,
UNCACHED_VMM_SIZE
,
MMU_INITIAL_MAP_STRONGLY_ORDERED
PAGE_TABLE_SET
PERIPH_PMM_BASE
,
PERIPH_DEVICE_BASE
,
PERIPH_DEVICE_SIZE
,
MMU_INITIAL_MAP_DEVICE
...
...
@@ -169,7 +169,7 @@ reloc_img_to_bottom_done:
add
r4
,
r4
,
r11
ldr
r4
,
[
r4
]
add
r4
,
r4
,
r11
/*
r4
:
jump
pagetable
paddr
*/
bl
page_table_clear
bl
page_table_clear
/*
执行清除操作
*/
/
*
build
1
M
section
mapping
,
in
order
to
jump
va
during
turing
on
mmu
:
pa
==
pa
,
va
==
pa
*/
mov
r6
,
pc
...
...
@@ -184,23 +184,23 @@ reloc_img_to_bottom_done:
bl
_bootaddr_setup
bl
mmu_setup
/*
set
up
the
mmu
*/
/
*
清除中断和异常堆栈,并设置
magic
num
来检查溢出
*/
/
*
clear
out
the
interrupt
and
exception
stack
and
set
magic
num
to
check
the
overflow
*/
ldr
r0
,
=
__undef_stack
ldr
r1
,
=
__exc_stack_top
bl
stack_init
STACK_MAGIC_SET
__undef_stack
,
#
OS_EXC_UNDEF_STACK_SIZE
,
OS_STACK_MAGIC_WORD
bl
stack_init
@
初始化栈
@设置栈顶魔法数字
STACK_MAGIC_SET
__undef_stack
,
#
OS_EXC_UNDEF_STACK_SIZE
,
OS_STACK_MAGIC_WORD
STACK_MAGIC_SET
__abt_stack
,
#
OS_EXC_ABT_STACK_SIZE
,
OS_STACK_MAGIC_WORD
STACK_MAGIC_SET
__irq_stack
,
#
OS_EXC_IRQ_STACK_SIZE
,
OS_STACK_MAGIC_WORD
STACK_MAGIC_SET
__fiq_stack
,
#
OS_EXC_FIQ_STACK_SIZE
,
OS_STACK_MAGIC_WORD
STACK_MAGIC_SET
__svc_stack
,
#
OS_EXC_SVC_STACK_SIZE
,
OS_STACK_MAGIC_WORD
STACK_MAGIC_SET
__exc_stack
,
#
OS_EXC_STACK_SIZE
,
OS_STACK_MAGIC_WORD
warm_reset
:
warm_reset
:
@初始化
CPU
各异常工作模式环境
/
*
initialize
interrupt
/
exception
environments
*/
mov
r0
,
#(
CPSR_IRQ_DISABLE
|CPSR_FIQ_DISABLE|CPSR_IRQ_MODE
)
msr
cpsr
,
r0
msr
cpsr
,
r0
@
先切到
IRQ
模式
EXC_SP_SET
__irq_stack_top
,
#
OS_EXC_IRQ_STACK_SIZE
mov
r0
,
#(
CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_UNDEF_MODE
)
...
...
@@ -212,7 +212,7 @@ warm_reset:
EXC_SP_SET
__abt_stack_top
,
#
OS_EXC_ABT_STACK_SIZE
mov
r0
,
#(
CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_FIQ_MODE
)
msr
cpsr
,
r0
msr
cpsr
,
r0
EXC_SP_SET
__fiq_stack_top
,
#
OS_EXC_FIQ_STACK_SIZE
/
*
initialize
CPSR
(
machine
state
register
)
*/
...
...
@@ -223,19 +223,19 @@ warm_reset:
msr
spsr
,
r0
/
*
get
cpuid
and
keep
it
in
r12
*/
mrc
p15
,
0
,
r12
,
c0
,
c0
,
5
and
r12
,
r12
,
#
MPIDR_CPUID_MASK
mrc
p15
,
0
,
r12
,
c0
,
c0
,
5
@
从
C0
获取
CPUID
给
R12
and
r12
,
r12
,
#
MPIDR_CPUID_MASK
@
掩码操作
/
*
set
svc
stack
,
every
cpu
has
OS_EXC_SVC_STACK_SIZE
stack
*/
ldr
r0
,
=
__svc_stack_top
mov
r2
,
#
OS_EXC_SVC_STACK_SIZE
mul
r2
,
r2
,
r12
sub
r0
,
r0
,
r2
mov
sp
,
r0
/
*
set
svc
stack
,
every
cpu
has
OS_EXC_SVC_STACK_SIZE
stack
*/
/*
设置每一个
SVC
栈
,
每个
CPU
都有独立的
SVC
栈
*/
ldr
r0
,
=
__svc_stack_top
@
栈底位置
,
注意这里虽然使用了
top
,
但实际是栈底
mov
r2
,
#
OS_EXC_SVC_STACK_SIZE
@
栈大小
mul
r2
,
r2
,
r12
@
定位到栈位置
,
CPU
SVC
栈是连在一块的
sub
r0
,
r0
,
r2
@
计算栈顶位置
,
使用
sub
也说明了栈底大于栈顶
mov
sp
,
r0
@
栈顶位置
/
*
enable
fpu
+
neon
*/
#ifndef LOSCFG_TEE_ENABLE
MRC
p15
,
0
,
r0
,
c1
,
c1
,
2
MRC
p15
,
0
,
r0
,
c1
,
c1
,
2
ORR
r0
,
r0
,
#
0xC00
BIC
r0
,
r0
,
#
0xC000
MCR
p15
,
0
,
r0
,
c1
,
c1
,
2
...
...
@@ -248,10 +248,10 @@ warm_reset:
VMSR
FPEXC
,
r3
LDR
r0
,
=
__exception_handlers
MCR
p15
,
0
,
r0
,
c12
,
c0
,
0
MCR
p15
,
0
,
r0
,
c12
,
c0
,
0
@
c12
=
r0
cmp
r12
,
#
0
bne
cpu_start
cmp
r12
,
#
0
@
是否为主
CPU
bne
cpu_start
@
跳转到
cpu_start
运行
clear_bss
:
ldr
r1
,
=
__bss_start
...
...
@@ -280,8 +280,8 @@ bss_loop:
_start_hang
:
b
_start_hang
mmu_setup
:
mov
r12
,
#
0
mmu_setup
:
@启动
MMU
mov
r12
,
#
0
mcr
p15
,
0
,
r12
,
c8
,
c7
,
0
/*
Set
c8
to
control
the
TLB
and
set
the
mapping
to
invalid
*/
isb
mcr
p15
,
0
,
r12
,
c2
,
c0
,
2
/*
Initialize
the
c2
register
*/
...
...
@@ -413,15 +413,15 @@ page_table_build_loop:
bx
lr
/*
*
init
stack
to
initial
value
*
init
stack
to
initial
value
初始化栈
,
前置条件:
r0
和
r1
分别为栈顶和栈底
*
r0
is
stack
mem
start
,
r1
is
stack
mem
end
*/
stack_init
:
ldr
r2
,
=
OS_STACK_INIT
ldr
r3
,
=
OS_STACK_INIT
ldr
r2
,
=
OS_STACK_INIT
@
魔法数字
ldr
r3
,
=
OS_STACK_INIT
@
魔法数字
/
*
Main
loop
sets
32
bytes
at
a
time
.
*/
stack_init_loop
:
.
irp
offset
,
#
0
,
#
8
,
#
16
,
#
24
.
irp
offset
,
#
0
,
#
8
,
#
16
,
#
24
@
等价于
strd
r2
,
r3
,
[
r0
,
0
],
...
,
strd
r2
,
r3
,
[
r0
,
24
]
strd
r2
,
r3
,
[
r0
,
\
offset
]
.
endr
add
r0
,
#
32
...
...
@@ -479,9 +479,9 @@ init_flag:
*/
.
section
".int_stack"
,
"wa"
,
%
nobits
.
align
3
@申请对应的内存空间
__undef_stack
:
.
space
OS_EXC_UNDEF_STACK_SIZE
*
CORE_NUM
.
space
OS_EXC_UNDEF_STACK_SIZE
*
CORE_NUM
__undef_stack_top
:
__abt_stack
:
...
...
@@ -489,7 +489,7 @@ __abt_stack:
__abt_stack_top
:
__irq_stack
:
.
space
OS_EXC_IRQ_STACK_SIZE
*
CORE_NUM
.
space
OS_EXC_IRQ_STACK_SIZE
*
CORE_NUM
__irq_stack_top
:
__fiq_stack
:
...
...
zzz/git/push.sh
浏览文件 @
68e75446
git add
-A
git commit
-m
'
系统调用由软中断实现,对其汇编代码注解
git commit
-m
'
开机的第一条汇编指令在哪里? 注解开机汇编代码部分
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://weharmony.gitee.io
'
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录