linux kernel initiate steps
来源:互联网 发布:xrd分析软件下载 编辑:程序博客网 时间:2024/04/30 05:08
vmlinux被load到内存地址0,首先从地址0x8000开始执行,这段最开始的代码在arch/arm/kernel/head.S的ENTRY(stext)中。用arm-none-linux-gnueabi-objdump-d vmlinux后,可看到代码从0xc0008000开始,第一行代码正是ENTRY(stext)后的msr CPSR_c,#211。为什么是0xc0008000而不是0x8000呢,这和内存映射(memorymap)有关,稍后会详述。从地址0x8000开始的汇编代码做了以下几件事情:
这里用gdb调试的时候,pc(代码)在0x8000开始的内存
这里用gdb调试的时候,pc(代码)在0x8000开始的内存
第一阶段: 启动-> start_kernel() [汇编语言]
1. 读取processor id, machine type
2. __vet_atags(??)
3. 创建页表( __create_page_tables)
4. 配置arm926的MMU,包括(I-Cache, D-Cache, TLB)(__arm926_setup(),arch/arm/mm/proc-arm926.S中)
5. Enable MMU(__enable_mmu)
enable MMU之后,Kernel代码就被映射到0xc0008000,后面所有pc都在0xc0008000开始内存中。
1. 读取processor id, machine type
2. __vet_atags(??)
3. 创建页表( __create_page_tables)
4. 配置arm926的MMU,包括(I-Cache, D-Cache, TLB)(__arm926_setup(),arch/arm/mm/proc-arm926.S中)
5. Enable MMU(__enable_mmu)
enable MMU之后,Kernel代码就被映射到0xc0008000,后面所有pc都在0xc0008000开始内存中。
在__turn_mmu_on中的以下汇编语句会设定cp15:
此处r0的值在__arm926_setup()中设定,其中会开启MMU。在gdb中用breakpoint可以看到r0=0x93177。这句执行之后,原来在0开始的PC地址就被映射到0xC0008000开始的地方,之后的一句movpc, sp就从0xC0008164开始执行了。
6. __mmap_switched
7. start_kernel (开始引导kernel, init/main.c中)
6. __mmap_switched
7. start_kernel (开始引导kernel, init/main.c中)
第二阶段:start_kernel()中:irq disable阶段,做了以下几件事:
1. tick init: 注册clock event的notifier
2. boot cpu init: 初始化boot cpu
3. setup arch: 对cpu architecture特有的feature进行配置。在ARM上即对ARMCPU,TCM等进行配置。
work_pending:
tst r1, #_TIF_NEED_RESCHED
bne work_resched
tst r1,#_TIF_SIGPENDING|_TIF_NOTIFY_RESUME
beq no_work_pending
mov r0,sp @'regs'
mov r2,why @'syscall'
bl do_notify_resume
b ret_slow_syscall @Check work again
在do_notify_resume->.....->setup_return()中会将PC设成Signalhandler,LR设成Signal regturn handler,这样在restore_user_regs时就会去执行Signalhandler,执行完后再执行Signal return handler。Signal returnhandler实际做了什么呢?看一下entry_trap_init()中copy的sigreturn_codes,它实际上就是一组预先编码好的Arm指令,这些执行的效果就是条用sys_sigreturn()这个systemcall,从signal handler中返回。
0 0
- linux kernel initiate steps
- Linux kernel compilation steps
- Linux kernel upgrade steps
- opencore Linux kernel 2.6 porting steps ----- 1. 简介
- KGDB-Serial setup steps : kgdb-2.4patches,Linux- 2.6.16 kernel
- linux kernel
- Linux Kernel
- Linux kernel
- Linux kernel
- linux kernel
- linux kernel
- Linux Kernel
- Linux Kernel
- Steps
- Steps
- Steps
- Steps
- Steps
- cas 入门之十六:ticket 存储方案之ehcache ticket存储
- 黑马程序员_字符串理解
- 反序一个无符号整数x 不占用额外的空间 采用异或操作
- 2.读取TXT文本内容,显示至图形界面中
- linux/ubuntu下free查看内存占用大的解释
- linux kernel initiate steps
- cas 入门之十七:ticket 存储方案-memcached ticket 存储
- How To Be an Effective Team Leader
- C语言 while(feof(fp)){}多循环一次解决方案
- ZOJ 3795 Grouping(强联通缩点,记忆化搜索)
- 两个栈实现队列 (面试题 7)
- spoj 220. Relevant Phrases of Annihilation( 后缀数组 每个字符串至少出现两次且不重叠的最长子串)
- 春花无实
- 继承—Swift学习笔记(十六)