OK6410A 开发板 (八) 8 linux-5.11 OK6410A 详细解析 start_kernel运行时的 栈

发布者:炫酷骑士最新更新时间:2022-09-19 来源: csdn关键字:OK6410A  开发板  11 手机看文章 扫描二维码
随时随地手机看文章

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 的值

[1] [2]
关键字:OK6410A  开发板  11 引用地址:OK6410A 开发板 (八) 8 linux-5.11 OK6410A 详细解析 start_kernel运行时的 栈

上一篇:OK6410A 开发板 (八) 9 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 概览
下一篇:OK6410A 开发板 (八) 8 linux-5.11 OK6410A System.map 解析

推荐阅读最新更新时间:2024-11-12 08:55

HMD 发布了诺基亚手机 Android 11 更新时间表
HMD Global已发布诺基亚手机Android 11时间表,奇怪的是,该公司在发布时间表后迅速将时间表撤回了。外媒推测,也许有人过早启用了它,因为Android 11在本月初刚刚问世,而这个更新时间表仍在修改中。 通过表中可以看到,可以运行最新版本操作系统的首批机型是诺基亚8.3 5G、2.2、5.3和8.1。 据IT之家了解,在2021年1月至3月之间,诺基亚1.3、4.2、2.4、2.3和3.4也将升级至Android 11,而在明年上半年的某个时候,诺基亚3.2、7.2和6.2也可以升级。在明年第二季度(3月至6月),诺基亚1 Plus和诺基亚9 PureView升级至Android 11。
[手机便携]
HMD 发布了诺基亚手机 Android <font color='red'>11</font> 更新时间表
【STM32CubeMX】11,STM32之CAN回环测试,过滤器的匹配设置
1,因为自己目前只有一块板子有CAN模块,所以先做CAN的回环测试。 主要参考http://www.stm32cube.com/question/33 下面的代码测试可以使用 1-1,在CAN的编程中,主要是注意四大结构体,这几个都是自动生成的, 1、CAN_HandleTypeDef hcan1;// CAN handle Structure definition首先定义CAN的处理结构体,hcan1内部包括了 3、CanTxMsgTypeDef; 4、CanRxMsgTypeDef;的头地址 2、CAN_FilterConfTypeDef sFilterConfig;// CAN filter conf
[单片机]
【STM32CubeMX】<font color='red'>11</font>,STM32之CAN回环测试,过滤器的匹配设置
王者荣耀周年庆来袭 OPPO推R11王者荣耀周年限量版
《王者荣耀》作为目前手机游戏市场中最火爆的一款游戏,他的影响力已经不单单只是一款游戏这么简单了,在很多领域中我们都可以看到《王者荣耀》这款游戏所产生的影响。随着《王者荣耀》官方周年庆的到来,OPPO官方也宣布将推出R11王者荣耀周年庆限量版本。   作为《王者荣耀》关系密切的合作伙伴,OPPO在今年推出R11的时候就对于《王者荣耀》这款游戏进行了专门的优化, 增加了多线程分流和高帧率模式,可以让游戏的时候效能得到更好的控制,同时画面更加精细。   OPPO R11王者荣耀周年庆限量版将于9月29日正式亮相,而OPPO作为定制手机中的佼佼者,相信在这款特殊的定制版本上也有着与众不同的设计,且让我们等待9月29日的来临
[手机便携]
小米11 Ultra维修价格曝光:换主板2400元 比K40标准版都贵
小米11 Ultra定位是“安卓之光”,该机起售价5999元(8GB+256GB)。   作为年度旗舰,小米11 Ultra在屏幕、影像、充电、性能等各方面都达到了安卓阵营的第一梯队水准。那么这台手机的保外维修费用是多少呢?   4月8日消息,小米商城公布了小米11 Ultra保外维修价格表。   表格显示,小米11 Ultra最贵的元件是主板,保外维修指导价为2400元,这价格能买一台Redmi K40还有剩余(Redmi K40起售价1999元)。   其次是显示屏、后置摄像头,保外指导价分别是1650元、1370元,电池保外指导价为179元,电池盖为420元,前置摄像头为85元,副板为55元,人工费均为40元。   值
[手机便携]
小米<font color='red'>11</font> Ultra维修价格曝光:换主板2400元 比K40标准版都贵
云计算立功!阿里第四财季营收1143.14亿元,电商业务创历史新低
5月22日晚间,阿里巴巴集团公布了截至2020年3月31日的2020财年第四财季及2020财年全年的业绩。本财年,阿里巴巴集团收入为人民币5097.11亿元,同比增长35%,实现了财年初公布的指引;2020年1月1日至2020年3月31日的第四季度收入为人民币1143.14亿元,同比增长22%。财报显示,第四财季,该公司的云计算业务营收同比增长58%,至122.17亿元。 从营收来看,阿里云2020财年营收400亿元,对比历史数据,2015财年阿里云收入仅为12.71亿元,6年间增长31倍。阿里巴巴数字经济体的消费型商业业务GMV达人民币7.053万亿元,突破1万亿美元。财年内,阿里巴巴数字经济体全球年度活跃消费者达9.60亿,但
[机器人]
IC概念股本周涨跌幅排行:力芯微涨11.35%居首,飞凯材料垫底
本周A股走势继续分化,三大指数涨跌不一。截至本周五收盘,沪指本周涨1.31点,涨幅为0.04%,收报3522.57点;深证成指跌121.02点,跌幅为0.86%,收报14029.55点;创业板指则大跌84.73点,跌幅为2.72%,收报3034.68点。 受大盘影响,Wind半导体指数本周跌幅扩大,截至周五收盘,wind半导体指数跌155.75点,跌幅为2.26%,收报6735.81点。 集微网从电子元件、材料、设备、设计、制造、IDM、封测、分销等领域选取了142家半导体公司作了统计。本周半导体板块行情再度恶化,跌幅较此前再度放大。本周上涨的股票只有27家,较上周再度减少,另外有1家收平;而下跌的股票则扩大至114家,不难看出,
[手机便携]
IC概念股本周涨跌幅排行:力芯微涨<font color='red'>11</font>.35%居首,飞凯材料垫底
stm32固件库在stm3210e-eval开发板上的移植
  首先建立工程,我习惯性在工程文件夹下建立以下几个文件夹,分别放不同的文件,以区别不同文件的不同作用,方便寻找和移植。如下:      在PROJECT文件夹下建立工程项目,启动keil,开始建立工程。      注意建立在PROJECT文件夹下。      随便起个名字,我起的名字是MDK,建立后,会提示你选择器件型号         我的器件如上图,所以选择。确定后会询问你是否加入启动文件。我们用stm32的固件库,所以不用mdk的,选择否。      下面配置工程的选项option,右键点Target会看到Options。      以下是各个选项卡的配置内容。      
[单片机]
stm32固件库在stm3210e-eval<font color='red'>开发板</font>上的移植
京东方造出世界最大110英寸液晶电视屏
    正在举行的第53届德国柏林国际电子消费品展昨日传出了一条令国人期待的消息:吉尼斯世界纪录认证中心向京东方颁发了“世界最大的液晶电视”证书。获此殊荣的是有着“4K巨幕”之称的110英寸超高清ADSDS显示屏,产自京东方最先进的北京8.5代线。   “在显示尺寸方面,该产品可以完全替代4台55英寸的拼接效果,实现画面真人尺寸1:1的震撼再现。”京东方有关人士说。   京东方“4K巨幕”最高分辨率可达3840 2160(4K 2K标准),相当于全高清(1080P)的4倍,同时采用搭载京东方独有的ADSDS宽视角技术,拥有上、下、左、右均为178度的超宽广视角。显示屏亮度高达1000nits,在室外公共显示场所能够实现高品
[家用电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved