在Makefile中找到的重要信息:

(1)连接脚本

  通过连接脚本,知道的信息:

   (1)入口符号 stext

   (2)入口连接地址 0xC0000000 + 0x00008000

根据入口符号,可以找到head.S为第一个文件

head.S

#define KERNEL_RAM_VADDR        (PAGE_OFFSET + TEXT_OFFSET)
#define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)

从这里可以知道虚拟地址和物理地址,就可以知道之后加载时的地址。

stext

|--------__lookup_processor_type 从cp15中获得当前cpu,比较当前cpu是否能识别,不能就死循环

|--------__lookup_machine_type 比较当前arch是否能识别,不能就死循环

|------- __vet_atags   确定 uboot 传来的 tags 格式正确(地址对齐,第一个tag 为 ATAG_CORE)

|--------__create_page_tables 创建粗页表

|----------设置栈

|----------开启MMU

|--------__switch_data

    |--------------------__mmap_switched

            |-----------------------复制data段,清bss

            |-----------------------用uboot传来参数,定义__machine_arch_type, __atags_pointer,

            |        自己从cp15中获得信息定义 processor_id,

            |------------------------start_kernel

start_kernel

|--------------打印 version等信息

|--------------setup_arch

|      |----------------根据配置设置的 arch_type 找到 对应的struct machine_desc 对象

|      |--------------如果定义了 __atags_pointer,即uboot传参了,tags就用 uboot传来的

|      |--------------如果uboot没有传参,tags 就用自带的 boot_params

|      |-------------- 获得 tags 中内存相关信息,并进行内存设置

|      

|--------------打印 Kernel command line ,即 boot_params

|--------------parse_early_param  检查 commad line  格式是否正确,command 是否能识别,并将command的值存到对应变量

|-------------各种初始化 如 调度,VFS,中断,控制台,内存分配器。。。

|------------- 根文件系统挂载

|--------------rest_init

|      |--------------创建线程 kernel_init

|      |      |---------------------打开控制台

|      |      |---------------------使用文件系统,找到 init 程序

|      |      |----------------------init_post

|      |      |        |--------------------run_init_process

|      |      |        |        |--------------------kernel_execve 运行 init bin文件。

|      |                                                 之后就进入用户态了,作为init进程运行。

|      |-------------- 创建线程 ktrheadd,kthreadd是死循环,

|            kthreadd 时 kernel 区的 线程管理 线程,用于维护kthread_create_list(记录当前内核线程的链表),

|            kthreadd还会管理内核中线程的调度。

|

|----------------cpu_idle 本线程作为 idle 线程,进入死循环。

总结:

  kernel 并没有使用 uboot 传来的 arch_num,而是自己直接从cp15中获得arch_num进行检验,相反 是 uboot 使用了 kernel 的 magic_num 进行检验。

  uboot传来的tags 决定了启动是否能成功。

  kernel 启动完成后就是生出了一个init进程,init进程之后进行fork,又有了 login 和 控制台 进程,由于init进程打开了控制台,有了3个文件描述符,所以之后所有的子进程都会继承这个特点。

  init进程启动的关键是rootfs挂载成功,能找到init程序的inode

  kernel 自己成了两个线程,一个用来管理自己的线程,一个作为调度进程的idle进程。

kernel——Makefile, head.S ...的更多相关文章

  1. Linux ARM kernel Makefile and Kconfig

    kernel build:顶层Makefile:-->1. include build/main.mk    -->2. include build/kernel.mk         k ...

  2. Linux kernel Makefile for ctags

    /********************************************************************** * Linux kernel Makefile for ...

  3. kernel Makefile Kconfig说明

    实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...

  4. kernel定制,编译内核

    定制kernel,就需要手动编译内核 一,准备开发环境 1,包组:Development Tools,Server Platform Development 2,包:ncurses和ncurses-d ...

  5. Makefile,如何传递宏定义DEBUG【转】

    转自:http://blog.csdn.net/linuxheik/article/details/8051598 版权声明:本文为博主原创文章,未经博主允许不得转载. Makefile,如何传递宏定 ...

  6. PASCAL的优越性:官方的说法(不需要Makefile,节约大量的时间)

    也许你认为为什么我选择pascal代替其他的语言,像C.或者您会拿FreePascal和其他的pascal编译器作比较,那么好,这里您看看FreePascal为什么好: 1.pascal是一个非常简洁 ...

  7. 转载一篇makefile,说的很详细

    March 3, 2015 8:19 PM 原文见:https://www.cnblogs.com/OpenShiFt/p/4313351.html Makefile 文件的编写 学习前的准备 需要准 ...

  8. kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

    kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

  9. 万能Makefile,前戏做足项目做起来才顺畅。

    # 获取要编译的源码 SRC :=$(wildcard *.cpp) OBJ :=$(patsubst %.cpp,%.o,$(SRC)) # 编译参数 CC :=g++ STD :=-std=c++ ...

随机推荐

  1. HTTP 【一文看清所有概念】

    HTTP 标头 HTTP 1.1 的标头主要分为四种,通用标头.实体标头.请求标头.响应标头,现在我们来对这几种标头进行介绍 通用标头 HTTP 通用标头之所以这样命名,是因为与其他三个类别不同,它们 ...

  2. 学习go语言并完成第一个作品

    之前有使用C#写一个Windows下的发送邮件的命令行工具,方便一些脚本出现异常时向我的邮箱发送邮件提醒.但这并没有被我频繁使用,因为我的有些脚本还是在linux下面运行,因此我又有一篇文章用linu ...

  3. python 登陆三次错误退出

    登陆出现三次错误,退出程序 1 #登陆 2 def Login(): 3 a = input() 4 if a == 'Kate': 5 b = input() 6 if b == '666666': ...

  4. 联赛模拟测试17 A. 简单的区间 启发式合并

    题目描述 分析 我们要找的是一段区间的和减去该区间的最大值能否被 \(k\) 整除 那么对于一段区间,我们可以先找出区间中的最大值 然后枚举最大值左边的后缀与最大值右边的前缀之和是否能被 \(k\) ...

  5. C#Socket通讯(1)

    前言 因为自己需要开发一款自己的游戏,因为设计网络方面,所以我找了很多的资料,再加上考虑到Unity游戏客户端直接连接数据库很容易导致数据库泄露,再加上网上很多的服务端都是用控制台做的,所以我就想做个 ...

  6. JavaWeb中的域对象

    域对象:可以在不同Servlet之间传递数据的对象,就是域对象,它们内置了map集合,都有setAttribute和getAttribute方法: Java Web有ServletContext.Se ...

  7. oracle oracle sqldeveloper 12505 创建连接失败

    ref:http://blog.csdn.net/yangwenxue_admin/article/details/45062557

  8. jsp 记录1 bs/cs

    1.jsp = html + js + css + jsp语法 + Java片段: 2.jsp是基于Java语言的,具有跨平台性: 3.jsp编译后的class文件会常驻内存中,运行速度快,对服务器的 ...

  9. ubuntu18.04下的off-by-null:hitcon_2018_children_tcache

    又没做出来,先说说自己的思路 因为是off-by-null,所以准备构造重叠的chunk,但是发现程序里有memset,给构造prev size造成重大问题 所以来详细记录一下做题过程 先逆向,IDA ...

  10. Hibernate注解实体类

    Hibernate注解1.@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2.@Table(name="",cat ...