linux栈的结构

本文详细介绍了Linux内核启动过程中的栈结构,从0号进程的创建到init进程的建立,分析了栈的使用和初始化,包括thread_info结构、mmu的启用以及栈的大小和保护。在0号进程的栈中,thread_info结构没有magic number,而从1号进程开始,栈包含了初始化的pt_regs和魔法数值。
摘要由CSDN通过智能技术生成

整体介绍

最近从linux源码,深入的理解一下linux栈的结构,先上图看一下整体结构

 Thread_info 在这里的存储方式是,从低地址到高地址存储的,thread_info 结构的最后一个成
员是存储在 stack_end_magic 前面的(地址从低向高来看)。这个结构不适用于 0 号进程,因为 0 号进程是系统启动的时候手动填充的,它没有 magic
number,没有顶端的 pt_regs。
 

0号进程的创建

 

arch/arm/kernel/head.S 文件中开始了 kernel 的旅程,也是第一个进程是如何来的。下面分析代码。
* This is normally called from the decompressor code. The requirements
* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
* r1 = machine nr, r2 = atags or dtb pointer.
从 ENTRY(stext)开始,kernel 开始为启动进行一系列准备工作,即 kernel 启动需要的条件。在创建完页表之后,将__mmap_switched 放到 R13 寄存器中,如下,这个函数(__mmap_switched)是以后创建第一个进程的地方。
.arm
__HEAD
....
bl __vet_atags
#ifdef CONFIG_SMP_ON_UP
bl __fixup_smp
#endif
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
bl __fixup_pv_table
#endif
bl __create_page_tables
/*
* The following calls CPU specific code in a position independent
* manner. See arch/arm/mm/proc-*.S for details. r10 = base of
* xxx_proc_info structure selected by __lookup_processor_type
* above. On return, the CPU will be ready for the MMU to be
* turned on, and r0 will hold the CPU control register value.
*/
ldr r13, =__mmap_switched @ address to jump to after
@ mmu has been enabled
adr lr, BSYM(1f) @ return (PIC) address
mov r8, r4 @ set TTBR1 to swapper_pg_dir
ARM( add pc, r10, #PROCINFO_INITFUNC )
THUMB( add r12, r10, #PROCINFO_INITFUNC )
THUMB( mov pc, r12 )
1: b __enable_mmu
ENDPROC(stext)
__mmap_switched 是在 mmu enable 之后才执行的。根据代码,它应该是由
__enable_mmu 调用执行的。__enable_mmu 执行完后会导致如下结果

/*
* Setup common bits before finally enabling the MMU. Essentially
* this is just loading the page table pointer and domain access

* registers.
*
* r0 = cp#15 control register
* r1 = machine ID
* r2 = atags or dtb pointer
* r4 = page table pointer
* r9 = processor ID
* r13 = *virtual* address to jump to upon completion
*/
__enable_mmu:
......
b __turn_mmu_on
ENDPROC(__enable_mmu)
在跳转到__turn_mmu_on 之前执行的都是对 r0,r1 等寄存器的加载。这个函数将真正的 enable
mmu。

/*
* Enable the MMU. This completely changes the structure of the visible
* memory space. You will not be able to trace execution throug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值