include/asm-generic/vmlinux.lds.h
376 #define INIT_TASK_DATA(align)
377 . = ALIGN(align);
378 __start_init_task = .;
379 init_thread_union = .;
380 init_stack = .;
381 KEEP(*(.data..init_task))
382 KEEP(*(.data..init_thread_info))
383 . = __start_init_task + THREAD_SIZE;
384 __end_init_task = .;
include/asm-generic/vmlinux.lds.h
/*
* Writeable data.
* All sections are combined in a single .data section.
* The sections following CONSTRUCTORS are arranged so their
* typical alignment matches.
* A cacheline is typical/always less than a PAGE_SIZE so
* the sections that has this restriction (or similar)
* is located before the ones requiring PAGE_SIZE alignment.
* NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
* matches the requirement of PAGE_ALIGNED_DATA.
*
* use 0 as page_align if page_aligned data is not used */
#define RW_DATA(cacheline, pagealigned, inittask)
. = ALIGN(PAGE_SIZE);
.data : AT(ADDR(.data) - LOAD_OFFSET) {
INIT_TASK_DATA(inittask)
NOSAVE_DATA
PAGE_ALIGNED_DATA(pagealigned)
CACHELINE_ALIGNED_DATA(cacheline)
READ_MOSTLY_DATA(cacheline)
DATA_DATA
CONSTRUCTORS
}
BUG_TABLE
arch/arm/kernel/vmlinux.lds.S
145 _sdata = .;
146 RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
147 _edata = .;
arch/arm/kernel/vmlinux.lds
_sdata = .;
. = ALIGN((1 << 12));
.data :
AT(ADDR(.data) - 0)
{
. = ALIGN(((1 << 12) << 1));
// 栈的底
__start_init_task = .;
init_thread_union = .;
init_stack = .;
KEEP(*(.data..init_task)) // KEEP 相当于告诉编译器,这部分不要被垃圾回收
KEEP(*(.data..init_thread_info))
. = __start_init_task + ((1 << 12) << 1);
// start_kernel 运行时的栈, 是 链接出来的,4KB大小
// #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
// ((1 << 12) << 1)
__end_init_task = .; // 栈顶
// 栈的顶
. = ALIGN((1 << 12));
__nosave_begin = .;
*(.data..nosave)
. = ALIGN((1 << 12));
__nosave_end = .;
. = ALIGN((1 << 12));
*(.data..page_aligned)
. = ALIGN((1 << 12));
. = ALIGN((1 << 6));
*(.data..cacheline_aligned)
. = ALIGN((1 << 6));
*(.data..read_mostly)
. = ALIGN((1 << 6));
*(.xiptext)
*(.data)
*(.ref.data)
*(.data..shared_aligned)
*(.data.unlikely)
__start_once = .;
*(.data.once)
__end_once = .;
. = ALIGN(32);
*(__tracepoints)
. = ALIGN(8);
__start___dyndbg = .;
KEEP(*(__dyndbg)) __stop___dyndbg = .;
CONSTRUCTORS
}
. = ALIGN(8);
__bug_table :
AT(ADDR(__bug_table) - 0)
{
__start___bug_table = .;
KEEP(*(__bug_table))
__stop___bug_table = .;
}
_edata = .;
在 linux 链接时
将 init_thread_union 及 init_thread_union + THREAD_START_SP 这一段 放到了 数据段 // init_thread_union 只是链接脚本中的一个地址,被 extern 到了 一个变量union thread_union init_thread_union 中
在 linux 运行时
将 init_thread_union + THREAD_START_SP 放到了 sp 中, // C0801FF8
并 b start_kernel
init/main.c,start_kernel,line = 851,addr of the fist variable(command_line):c0801fc4
arm 是满减栈 // 压栈的时候,先sp-4,再存值
地址从 C0801FF8 - C0800000
如果 往下一直增长,会首先覆盖 init_thread_info // 此情况就是 栈溢出
其他
1 C0801FFC - C0801FC8 存了什么(14个值)?
TOP
0e:c0801ffc:0
0d:c0801ff8:0
0c:c0801ff4:0
0b:c0801ff0:0
0a:c0801fec:c5387d // 变量 cr_alignment 的值 // 即 cp15 Register 1: Control register
09:c0801fe8:410fb766 // processor_id 的值
上一篇:OK6410A 开发板 (八) 9 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 概览
下一篇:OK6410A 开发板 (八) 8 linux-5.11 OK6410A System.map 解析
推荐阅读最新更新时间:2024-11-12 08:55
设计资源 培训 开发板 精华推荐
- 【立创开发板】小小游戏机
- 使用 TB6818FG 功率因数校正控制 CCM 的(自 VCC 电源)典型应用
- 15V随声听
- 可充电多功能小夜灯
- 使用具有 B 类 EMI 滤波(双输出)的 RP10-2415DA DC/DC 转换器的典型应用
- EVAL-AD7476ACB,使用 AD7476A、12 位、1 MSPS 高速、低功耗模数转换器的评估板
- 具有浪涌电流限制的低待机损耗功率前端
- 使用 Broadcom Inc 的 HCPL-7851#100 的参考设计
- LTC2945HMS 宽范围双电源监视器的典型应用
- LTC4050EMS-4.1 演示板,具有 NTC 的锂离子电池充电器,Vin = 4.5V-6V,Vbat = 4.1V,Ibat = 700mA