OK6410A 开发板 (八) 119 linux-5.11 OK6410A arm-linux的栈

发布者:睿智之光最新更新时间:2022-08-09 来源: csdn关键字:OK6410A  开发板  11 手机看文章 扫描二维码
随时随地手机看文章

硬件上:

armv6 有 6个 R13

R13_usr 和 R13_sys 是同一个

还有 R13_svc R13_abt R13_und R13_irq R13_fiq


软件上

linux boot时有一个栈

linux 各种异常处理有栈(5个异常模式,1个system模式)

对应多少个栈?

svc mode 对应每个进程有一个栈?

irq mode 是固定的栈?

abort 呢? und 呢 ? fiq 呢?

system mode 呢?

linux 在 user mode 时 有栈 , (应用程序的栈,每个应用程序有一个栈,有N个应用程序)


boot的栈不管,没啥意思

从线程和异常来说事

1. 线程分类

2. 异常分类


每个线程有两个栈,一个内核(svc)栈,一个用户栈。

异常时,有临时栈(12字节)(irq und abt fiq),然后有长期栈(svc,即用户的内核栈)


临时栈

临时栈的地址及大小

地址 : 位于 全局变量 static struct stack stacks[NR_CPUS]; 中

大小 :12 字节


BOOT过程

boot时的栈

boot栈的地址及大小

地址 : init_stack  - init_stack+0x1000

大小 : 4KB


从stext到start_kernel , 没用栈???

从start_kernel 开始, 走在 svc mode???,

start_kernel 运行时的栈, 是 链接出来的(和init_stack 有关),4KB大小

https://blog.csdn.net/u011011827/article/details/116056620


线程分类

idle 内核线程的一个内核栈

内核栈的地址及大小


栈位置: X - X+0x2000 // "slab task_struct" 中的 stack成员的值为X

栈大小: 8KB


idle 进程的 TCB 分成了 两块

struct task_struct init_task

void                *stack; // 用于存放 对应的 thread_info 的 地址

struct thread_info init_thread_info

.task       = &init_task // 对于存放 对应的 task_struct  的地址


栈位置: slab task_struct 中的 stack成员的值为栈顶X(X->X+STACK_SIZE为整个栈)

栈大小: 由 arch/arm/include/asm/thread_info.h 中的 THREAD_SIZE 决定 // 8KB 或者16KB

// CONFIG_KASAN=n : 8KB

// CONFIG_KASAN=y : 16KB


init 内核线程的一个内核栈及init用户线程的一个用户栈和内核栈

内核栈的地址及大小

栈位置: X - X+0x2000 // "slab task_struct" 中的 stack成员的值为X

栈大小: 8KB


用户栈的地址及大小

栈位置: 0xBE80 0000 - 0xBF00 0000

栈大小: 8MB


用户栈的伸缩对于应用程序来说是透明的,应用程序不需要自己去管理栈,这是操作系统提供的功能。


应用程序在刚刚启动的时候(由fork()系统调用复制出新的进程),新的进程其实并不占有任何栈的空间。


当应用程序中调用了函数需要压栈时,会触发一个page fault,内核在处理这个异常里会发现进程需要新的栈空间,于是建立新的VMA并映射内存给用户栈


https://www.tiehichi.site/2020/10/22/Linux%E8%BF%9B%E7%A8%8B%E6%A0%88%E7%A9%BA%E9%97%B4%E5%A4%A7%E5%B0%8F/

栈位置: 0xC0000000-0x01000000 ( 最高处)

load_elf_binary

retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP), executable_stack);


#define CONFIG_PAGE_OFFSET 0xC0000000

#define SZ_16M              0x01000000

#define TASK_SIZE       (UL(CONFIG_PAGE_OFFSET) - UL(SZ_16M))

#define TASK_SIZE_26        (UL(1) << 26)

#define STACK_TOP   ((current->personality & ADDR_LIMIT_32BIT) ? TASK_SIZE : TASK_SIZE_26)



栈位置: 0xC0000000-0x01000000 ( 最高处)


栈大小: 8MB

ulimit -a看到系统对当前进程的栈size进行了限制,大部分是8M的限制

ulimit -s来修改栈的大小,可以扩充到100M的大小

init_task->signal->rlim

[RLIMIT_STACK]      = {       _STK_LIM,  RLIM_INFINITY },

_STK_LIM即为当前系统中,进程用户栈的虚拟地址空间上限

#define _STK_LIM    (8*1024*1024)


异常分类

异常有7个

5+1(rst)+1(swi)

5:

vector_stub 中使用临时栈,然后切换到 swi mode , 使用 swi的栈

1(rst):

直接swi err0

1(swi):

直接使用 swi 的栈


arch/arm/kernel/setup.c


 136 /*                                                                               

 137  * Cached cpu_architecture() result for use by assembler code.                   

 138  * C code should use the cpu_architecture() function instead of accessing this   

 139  * variable directly.                                                            

 140  */                                                                              

 141 int __cpu_architecture __read_mostly = CPU_ARCH_UNKNOWN;                         

 142                                                                                  

 143 struct stack {                                                                   

 144     u32 irq[3];                                                                  

 145     u32 abt[3];       //对应 dabt 和 pabt 异常                                                           

 146     u32 und[3];                                                                  

 147     u32 fiq[3];                                                                  

 148 } ____cacheline_aligned;     // 对应5个异常及其对应的 vector_stub , vector_stub  中 这12个字节 用于 临时 stack .                                              

 149                                                                                  

 150 #ifndef CONFIG_CPU_V7M                                                           

 151 static struct stack stacks[NR_CPUS];                                             

 152 #endif



start_kernel

setup_arch

setup_processor

cpu_init

setup stacks for re-entrant exception handlers

struct stack *stk = &stacks[cpu];

556     __asm__ (                                                                    

557     "msr    cpsr_c, %1nt"                                                      

558     "add    r14, %0, %2nt"                                                     

559     "mov    sp, r14nt"                                                         

560     "msr    cpsr_c, %3nt"                                                      

561     "add    r14, %0, %4nt"                                                     

562     "mov    sp, r14nt"                                                         

563     "msr    cpsr_c, %5nt"                                                      

564     "add    r14, %0, %6nt"                                                     

565     "mov    sp, r14nt"                                                         

566     "msr    cpsr_c, %7nt"                                                      

567     "add    r14, %0, %8nt"                                                     

568     "mov    sp, r14nt"                                                         

[1] [2]
关键字:OK6410A  开发板  11 引用地址:OK6410A 开发板 (八) 119 linux-5.11 OK6410A arm-linux的栈

上一篇:OK6410A 开发板 (八) 120 linux-5.11 OK6410A cache 配置
下一篇:OK6410A 开发板 (八) 118 linux-5.11 OK6410A arm异常原因及linux应用场景及结果

推荐阅读最新更新时间:2024-11-08 22:30

基于ARM微处理器TCP/IP协议LwlP实现
0 引 言 随着嵌入式系统与网络的日益结合,越来越多的嵌入式设备需要实现Internet网络化,支持嵌入式设备接入网络,已成为嵌入式领域重要的研究方向。而目前嵌入式系统中大量应用低速处理器,受内存和速度限制,实现完整的TCP/IP协议较为困难,LwIP作为较为成熟的嵌入式TCP/IP协议栈受到了广泛的应用。 1 硬件平台 本通信系统的硬件平台由以下几个部分组成:S3C2410主CPU芯片控制嵌入式外围设备的存储、通信、保护、调试、显示等操作;DSP和FPGA负责信号数据的采集和处理;CS8900A负责网络数据的收发;其他部分还包括串口RS232的通信、LCD的数据显示、数据存储FLASH和SDRAM以及其他硬件控制等。本硬
[单片机]
基于ARM微处理器TCP/IP协议<font color='red'>栈</font>LwlP实现
高通宣布年度峰会日期:骁龙898有望11月30日发布 性能提升
高通官网更新宣布,今年的骁龙技术峰会(Snapdragon Tech Summit)将于11月30日到12月2日举办。   从过去几届的惯例来看,新一代骁龙旗舰SoC有望发布。   目前的爆料指向骁龙新一代移动平台名为骁龙898,部件号SM8450,三星4nm工艺制造,CPU部分采用三丛集,即Cortex-X2超大核(3.0GHz)、Cortex-A710大核(2.5GHz)以及Cortex-A510小核(1.79GHz),GPU集成Adreno 730和X65基带(下行10Gbps)。   性能方面,据称骁龙898比骁龙888提升了20%左右。   通常,手机厂商门也会通过骁龙峰会的契机公布对第一波骁龙898进行预热,
[手机便携]
802.11ac第二波标准蓄势待发
    前几个月,我们的采购大特辑接续介绍了入门级10GbE网路交换器、12Gb SAS储存设备,都是偏向资料中心等级的应用,这次换换口味,让我们来探讨企业级Wi-Fi无线网路设备的相关应用。 在这次的云端无线网路管理方案采购大特辑中,我们要求厂商送测都是支援802.11ac标准的无线基地台,提供Gb等级的网路传输能力,而且架构上是搭配置于云端服务的控制器软体,而不是沿用传统的作法──同时配备实体的无线网路控制器来协助部署与管理。 其实,云端管理式(Cloud Managed)的无线网路环境建置与管理方案,早在几年前就出现在市面上,但厂牌并不多,而我们也期待有一天这类产品能持续发展,替有意采购的企业用户提供更多选择的机会。
[手机便携]
华为2011年净利润领先爱立信
     4月23日消息,中国电信设备和方案提供商华为今天下午发布财报,这也意味着爱立信、诺基亚西门子、阿尔卡特朗讯、中兴通讯,以及华为等五大传统电信设备商2011年度财报尽数发布。 爱立信和华为财报对比   根据华为财报数据,华为2011年度全球销售收入为323.96亿美元,超过此前路透社预测的317亿美元数据,和爱立信年度财报的332.2亿美元(2269亿瑞典克朗)全球收入仅一步之遥。虽然尚未实现历史性跨越,仍处于行业第二名水准,但华为追赶第一名的脚步已经临近,超越爱立信成为行业领头羊仅咫尺之遥。   与此同时,尽管华为在全球销售收入上仍略逊于爱立信,但在净利润上,则稍领先于爱立信,如果按照此条件对比,华为则已经超越爱立信。
[手机便携]
MIUI 13测试版曝光:小米11、K40全系首批尝鲜
前不久,小米公布了MIUI 12.5增强版第三批稳定版发版计划,顺利情况下会在12月下旬完成全量推送。   同时,小米集团合伙人、Redmi品牌总经理卢伟冰还发文称:“MIUI 12.5来了,MIUI 1x还会远吗?”   这也被普遍认为是在暗示MIUI 13即将登场,这将是一款针对性修复了诸多问题的全新系统。   据最新消息显示,爆料者xiaomiui也发现了MIUI 13测试版的版本号,证实了MIUI 13即将到来的传闻。   从他晒出的图中可以看到,一款全球版机型的MIUI版本号为V13.0.0.44.RLDMIXM,这其中“R”代表该ROM是基于安卓11。   此外,xiaomiui还拿到了几款老机型的MIU
[手机便携]
MIUI 13测试版曝光:小米<font color='red'>11</font>、K40全系首批尝鲜
机器人行业11月大事记
转眼间11月就已结束,再过一个月也将迎来崭新的2018年,相信各位朋友已经做好迎新年的准备了。在这过去的一个月里,机器人行业又发生了哪些值得关注的新闻呢,小编为各位整理了机器人行业11月大事记,一起来回顾下。 新品来袭 百度发布首款人工智能硬件 开启“AI家庭机器人”时代 11月16日,2017百度世界大会在北京举行,发布了手机百度10.0和全新人工智能硬件“ravenH”等多款软硬件产品。这一会议吸引了众多开发者和生态合作伙伴到场。 百度发布的首款智能硬件ravenH,从功能上来看,搭载DuerOS2.0的ravenH可以直接被唤醒,通过语音操作控制各类家居。本次百度还公布了“twomorething”:ravenR、ra
[机器人]
lpc1114通用定时器
LPC1114内部一共有4个定时器,2个32位定时器,2个16位定时器,使用方式都一样,只是要注意使用16位定时器时,寄存器的值不要超出65535。 给它们分别取名称为CT16B0、CT16B1、CT32B0、CT32B1。 特征: 1. 可编程预分频器 我们知道,普通51单片机定时器每递增一下,用时1微秒,固定不变的。而LPC1114的定时器有可编程预分频器,这样就可以控制定时器的时间间隔为任意值了,譬如2微秒,10微秒,0.5微秒等,最小可以为0.02微秒。这个功能在测试测量方面相当有用。 2. 可以工作在定时和计数两种模式 3. 每个定时器都有一个捕获引脚 捕获引脚可以用来感觉它上面的电平变化,实质上和中断引脚的功能类似。主
[单片机]
万利正私网一比一占成加盟13063471153
99贵宾会,维多利亚, 欧博13063471153,亚星,万利,UG环球,太平洋,环球360,AG,正网卖分/私网一比一占成加盟合作总代理,真诚待人与您合作共赢长期稳定,超越梦想飞向未来,以诚信求发展服务,应有尽有,物美价廉。13063471153
[新能源]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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