在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. 游戏2048的核心算法c#版本的实现

    接触游戏有一段时间了,也写了一些东西,效果还不错,今天没事,我就把2048 c# 版本的实现贴出来,代码已经测试过,可以正常.完美运行.当然了,在网上有很多有关2048的实现方法,但是没有提出到类里面 ...

  2. 正式班D9

    2020.10.16星期五 正式班D9 一.vmware workstation的使用 虚拟机管理软件 定义 虚拟机(Virtual Machine)软件是一套特殊的软件,它可以作为操作系统独立运行, ...

  3. spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)

    一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...

  4. [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构

    [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 目录 [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x0 ...

  5. Windows下显示已经连过的Wifi密码

    Windows下显示已经连过的Wifi密码   1. 打开cmd   2. netsh   3. wlan show profile 可以得到所有已经连过的wifi   4. wlan show pr ...

  6. Serializable使用

    android的另一个序列化Serializable比较简单,实现它的接口,然后生成所有成员变量的方法,再生成所有成员变量的getset方法,serializable可以存储对象,所以下面代码传递了一 ...

  7. Spark执行失败时的一个错误分析

    错误分析 堆栈信息中有一个错误信息:Job aborted due to stage failure: Task 1 in stage 2.0 failed 4 times, most recent ...

  8. windows上visual studio 2019配置libtorch

    参考链接: https://blog.csdn.net/clx55555/article/details/98172762 https://zhuanlan.zhihu.com/p/68901339 ...

  9. JavaScript动态显示时间

    <body> <div></div> <script> var div = document.querySelector('div'); retNowT ...

  10. php反序列化漏洞入门

    前言 这篇讲反序列化,可能不会很高深,我之前就被反序列化整懵逼了. 直到现在我对反序列化还是不够深入,今天就刚好可以研究研究. 0x01.反序列化漏洞介绍 序列化在内部没有漏洞,漏洞产生是应该程序在处 ...