kernel——Makefile, head.S ...
在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 ...的更多相关文章
- Linux ARM kernel Makefile and Kconfig
kernel build:顶层Makefile:-->1. include build/main.mk -->2. include build/kernel.mk k ...
- Linux kernel Makefile for ctags
/********************************************************************** * Linux kernel Makefile for ...
- kernel Makefile Kconfig说明
实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...
- kernel定制,编译内核
定制kernel,就需要手动编译内核 一,准备开发环境 1,包组:Development Tools,Server Platform Development 2,包:ncurses和ncurses-d ...
- Makefile,如何传递宏定义DEBUG【转】
转自:http://blog.csdn.net/linuxheik/article/details/8051598 版权声明:本文为博主原创文章,未经博主允许不得转载. Makefile,如何传递宏定 ...
- PASCAL的优越性:官方的说法(不需要Makefile,节约大量的时间)
也许你认为为什么我选择pascal代替其他的语言,像C.或者您会拿FreePascal和其他的pascal编译器作比较,那么好,这里您看看FreePascal为什么好: 1.pascal是一个非常简洁 ...
- 转载一篇makefile,说的很详细
March 3, 2015 8:19 PM 原文见:https://www.cnblogs.com/OpenShiFt/p/4313351.html Makefile 文件的编写 学习前的准备 需要准 ...
- kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下
kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下
- 万能Makefile,前戏做足项目做起来才顺畅。
# 获取要编译的源码 SRC :=$(wildcard *.cpp) OBJ :=$(patsubst %.cpp,%.o,$(SRC)) # 编译参数 CC :=g++ STD :=-std=c++ ...
随机推荐
- 游戏2048的核心算法c#版本的实现
接触游戏有一段时间了,也写了一些东西,效果还不错,今天没事,我就把2048 c# 版本的实现贴出来,代码已经测试过,可以正常.完美运行.当然了,在网上有很多有关2048的实现方法,但是没有提出到类里面 ...
- 正式班D9
2020.10.16星期五 正式班D9 一.vmware workstation的使用 虚拟机管理软件 定义 虚拟机(Virtual Machine)软件是一套特殊的软件,它可以作为操作系统独立运行, ...
- spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...
- [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构
[阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 目录 [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x0 ...
- Windows下显示已经连过的Wifi密码
Windows下显示已经连过的Wifi密码 1. 打开cmd 2. netsh 3. wlan show profile 可以得到所有已经连过的wifi 4. wlan show pr ...
- Serializable使用
android的另一个序列化Serializable比较简单,实现它的接口,然后生成所有成员变量的方法,再生成所有成员变量的getset方法,serializable可以存储对象,所以下面代码传递了一 ...
- Spark执行失败时的一个错误分析
错误分析 堆栈信息中有一个错误信息:Job aborted due to stage failure: Task 1 in stage 2.0 failed 4 times, most recent ...
- windows上visual studio 2019配置libtorch
参考链接: https://blog.csdn.net/clx55555/article/details/98172762 https://zhuanlan.zhihu.com/p/68901339 ...
- JavaScript动态显示时间
<body> <div></div> <script> var div = document.querySelector('div'); retNowT ...
- php反序列化漏洞入门
前言 这篇讲反序列化,可能不会很高深,我之前就被反序列化整懵逼了. 直到现在我对反序列化还是不够深入,今天就刚好可以研究研究. 0x01.反序列化漏洞介绍 序列化在内部没有漏洞,漏洞产生是应该程序在处 ...