- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
平台:Xilinx Zynq SoC 上的 ARM Cortex A9 上的 Linux。
我问了一个问题:Why is kernel boot starting too late
基本上,我试图理解并尽量减少这两个事件之间的延迟:
[Sat Apr 12 19:33:50.692 2014] Starting kernel ...
[Sat Apr 12 19:33:50.692 2014]
[Sat Apr 12 19:33:51.298 2014] Booting Linux on physical CPU 0x0
第一行告诉我们现在控制权交给了内核,而第二行告诉我们控制权现在和内核在一起并由CPU执行。
这种从 u-boot 到内核的切换对我们的应用程序来说花费了太多时间。
为了理解这两个事件之间发生了什么,我在以下位置插入了 printf 语句:
1- bootm.c
我将以下行放在函数 static void boot_jump_linux(bootm_headers_t *images, int flag)
}
if (!fake)
{printf("above kernel_entry in boot_jump_linux in bootm.c\n");
kernel_entry(0, machid, r2);
printf("below kernel_entry boot_jump_linux in bootm.c\n");
}
}
2- main.c
我将这样的语句放在 start_kernel
函数中:
asmlinkage void __init start_kernel(void)
{
printk("I am the first statement in start_kernel in main.c" );
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
然后我编译了 u-boot 和内核,新的日志消息有以下几行:
[Sat Apr 12 19:33:50.692 2014] Starting kernel ...
[Sat Apr 12 19:33:50.692 2014] above kernel_entry in boot_jump_linux in bootm.c
[Sat Apr 12 19:33:51.298 2014] I am the first statement in start_kernel in main.c
[Sat Apr 12 19:33:51.298 2014] Booting Linux on physical CPU 0x0
(事实上,我在很多地方放置了 printf 语句,但所有这些语句要么在“正在启动内核...”之上,要么在“在物理 CPU 0x0 上引导 Linux”之下,所以我在本次讨论中忽略了它。我还使用了ftrace 查看热点,但它不报告 u-boot 功能)。
我观察到“below kernel_entry in boot_jump_linux in bootm.c”从未在日志消息的任何地方打印。这说明在function kernel_entry(0, machid, r2);之后控制不会返回;被调用是因为 linux 现在拥有控制权并且正在执行。
所以我的目标是知道在这两个事件期间正在执行哪个函数。
现在要了解发生了什么(即使在插入我的 printf/printk 消息后还不清楚)我问了以下问题:
1- In u-boot, kernel_entry points to which function?
2- Trying to understand the usage of function pointer
根据那里的答案,我怀疑我的热点(即花费大量时间的代码)位于以下文件之一中:
1- https://github.com/Xilinx/linux-xlnx/blob/master/arch/arm/kernel/head.S
2- https://github.com/Xilinx/linux-xlnx/blob/master/arch/arm/kernel/head-common.S
3- https://github.com/Xilinx/linux-xlnx/blob/master/arch/arm/boot/compressed/head.S
我的问题:
1- 我的理解是否正确,我应该关注上述文件?
2- 调用kernel_entry(0, machid, r2);
后,控制转到上面的哪一行代码?
我怀疑文件 https://github.com/Xilinx/linux-xlnx/blob/master/arch/arm/boot/compressed/head.S 对我没有用,因为这是解压所必需的,但我的内核已经解压了,因为在 u-boot 日志中很早就可以看到以下行:
[Sat Apr 12 19:33:50.596 2014] Uncompressing Kernel Image ... OK
完整的日志是here .
有人可以在这方面启发我吗?
非常感谢!!
最佳答案
My aim is to have the handoff as fast as possible.
Do you think using early printk I can boot faster as the handoff will be early?
您的问题和计算“快速”或“延迟”的方法基于有缺陷的数据。
您认为的 0.5 秒“延迟”实际上是 U-Boot “正在启动内核...” 实时 ,而内核缓冲区和推迟输出它的“Booting Linux”直到系统和控制台被初始化。这是将苹果与橙子进行比较。
至少,您必须通过启用early printk 让内核在实时(就像 U-Boot)中输出。然后您的时间戳将更好地指示实际耗时。
摘自 chapter 18 of the Linux Kernel Map (重点是我加的):
A chink in the armor of printk()'s robustness does exist. It is unusable before a certain point in the kernel boot process, prior to console initialization. Indeed, if the console is not initialized, where is the output supposed to go?
This is normally not an issue, unless you are debugging issues very early in the boot process (for example, in setup_arch(), which performs architecture-specific initialization). Such debugging is a challenge to begin with, and the absence of any sort of print method only compounds the problem.
There is some hope, but not a lot. Hardcore architecture hackers use the hardware that does work (say, a serial port) to communicate with the outside world. Trust me this is not fun for most people. Some supported architectures do implement a sane solution, however and others (i386 included) have patches available that also save the day.
The solution is a printk() variant that can output to the console very early in the boot process: early_printk(). The behavior is the same as printk(), only the name and its capability to work earlier are changed. This is not a portable solution, however, because not all supported architectures have such a method implemented. It might become your best friend, though, if it does.
参见 this answer到相同的问题(你的双胞胎?)以获取有关启用 early printk 的详细信息。
所以不,使用早期 printk 不会改善“切换”或整体启动时间。
但它应该有助于防止您寻找幻影阻塞。
关于c - 如何优化 U-boot 到内核的切换代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24431266/
有人可以解释一下 spring-boot-parent 和 spring-boot-starter-parent 之间的区别吗,正如我在下面附加的 GIT HUB 代码链接之一中看到的,他们为 spr
我有与 jersey 框架集成的 Spring Boot 应用程序。 现在,当我尝试运行该应用程序时,它只是停留在 Spring 启动徽标上,之后没有任何 react 。 我也尝试添加 -X ,但徽标
我指的是 Spring Boot 关于 的文档自动配置 和 执行器 模块: 自动配置: Spring Boot AutoConfiguration attempts to automatically
我正在尝试将 apache log4j 集成到我的 Spring boot 应用程序中。这是我的 build.gradle 文件: build.gradle buildscript { rep
使用 Spring Boot Maven 插件的以下命令在生产中启动 Spring Boot 应用程序是否是一个好主意或实践? mvn spring-boot:run 最佳答案 不,这是个坏主意。 您
据我所知,spring boot 和 spring session 为我们提供了一站式自动配置,但是当我的应用程序使用 session redis 和应用程序缓存 redis 时,不是同一个 redi
我希望使用Spring Boot创建一个新的Web应用程序。不幸的是,我的服务器在技术堆栈方面相当有限。它安装了Java 5。 谁能告诉我spring boot是否可以在Java 1.5上运行以及什么
我有3个实体 CarWash(设置Wash) Wash(car_wash_id FK到CarWash) WashComment(wash_id FK到Wash) 有什么办法可以写这个查询 @Qu
我一直在关注this文章。 我正在尝试在Spring-boot应用程序中优雅地处理gRPC错误,的主要目标是能够在gRPC客户端中获取错误状态。 在上面的文章之后,我坚持为异常添加拦截器。如何在Spr
我有一个要使用的自定义log4j布局插件。在IntelliJ中运行或与./gradlew bootRun一起运行时,插件可以正常工作。不使用./gradlew bootJar构建启动jar。 启用-D
我想在给定范围 (5001-5100) 的随机端口上启动 Spring Cloud 应用程序(Spring Boot 1.5.14,Spring Cloud Edgware.SR4)。我知道我们可以使
任何人都可以向我展示或指出不使用 spring boot gradle 插件的 spring boot gradle 项目。 我正在寻找类似不使用 gradle 插件的 spring boot sta
我当时尝试包含上述依赖项之一,但找不到任何区别: spring boot starter web:我可以看到 Flux 和 Mono 类并制作一个响应式(Reactive)休息 Controller
我们一直在为我们的应用程序使用 Springboot 1.X。 现在准备开始一些新的应用程序,想知道我们是应该使用 SpringBoot2.0 还是坚持使用 SpringBoot 1.X? 对一种方式
我希望记录应用程序正在加载 application-profile.propeties 或 application.yml。怎么做。在哪种方法中,我可以听取它并检测它是成功加载还是失败。 最佳答案 您
当我在 pom.xml 中添加简单的 spring-boot-starter-data-jpa 依赖项时,在 pom.xml 文件中出现错误。如果我删除该依赖项,则不会再有错误。我不确定为什么会发生这
我希望记录应用程序正在加载 application-profile.propeties 或 application.yml。怎么做。在哪种方法中,我可以听取它并检测它是成功加载还是失败。 最佳答案 您
我在网上看了很多关于 spring-boot-devtools 的文章和问题,但仍然无法弄清楚为什么它对我不起作用。每次运行我的应用程序时,我都会得到以下信息: 17:54:28.057 [main]
我正在尝试将现有的 Spring 应用程序移植到 Spring Boot。我不使用 spring-boot-starter-data-solr 启动器,但是我的类路径上有 apache solrj (
(这主要是一个历史问题。Pivotal 建议所有论坛讨论都在 StackOverflow 上进行,这就是我在这里问它的原因。) Spring Boot 项目用来证明将应用程序的类和依赖项从可执行 ja
我是一名优秀的程序员,十分优秀!