Thread.setDaemon详解

pcDuino3下支持mmc启动,官方的Uboot是采用SPL框架实现的,因为内部的SRAM空间达到32K,我们完全可以在这32K空间内编写一个完整可用小巧的bootloader来完成引导Linux kernel的目的。

我们首先介绍下SPL框架,可以先看下《GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法》《GNU
ARM汇编--(十九)u-boot-nand-spl启动过程分析》
,NAND_SPL也算是SPL框架下的一种模式。

当使用Nand flash或者MMC作为引导方式时,我们需要使用芯片内的ROM或者其它机制加载固件到SRAM中。

这种时候就需要SPL,因为SPL短小精悍,适用于4K甚至更小的SRAM的环境。这时候的引导过程就变成,SPL引导Uboot,而由Uboot引导系统内核。

其实作为pcDuino3的SPL,它是可以完成直接引导kernel功能的,如果不需要使用uboot提供的额外的强大功能的话。

这里介绍下写bootloader的思路:

使用mmc的read驱动函数将指定位置的kernel镜像读取到内存中,然后按照Linux的要求完成参数列表的传递,MMU和cache的配置等,就可以完成跳转动作了。

最后一个步骤的代码如下:

void boot_linux(void)
{
	uart_printf("boot linux\n");
	void (*kernel_entry)(int zero, int arch, uint params);
	unsigned long r2;
	unsigned long machid;

	setup_linux_param(0x40000000 + 0x100);

	cleanup_before_linux();
	kernel_entry = (void (*)(int, int, uint))0x48000000;

	machid = 4283;
	r2= 0x40000100;
	kernel_entry(0, machid, r2);

}

这个函数就完成了内核文档Documentation/arm/booting对booting ARM Linux的描述。

这样,一个仅仅有18K大小的bootloader就可以完成对kernel的引导了。

Thread.setDaemon详解,布布扣,bubuko.com

时间: 2024-11-14 01:33:43

Thread.setDaemon详解的相关文章

Thread 守护线程 Thread.setDaemon详解

java中线程分为两种类型:用户线程和守护线程.通过Thread.setDaemon(false)设置为用户线程:通过Thread.setDaemon(true)设置为守护线程.如果不设置次属性,默认为用户线程. 用户线程和守护线程的区别: 1. 主线程结束后用户线程还会继续运行,JVM存活:主线程结束后守护线程和JVM的状态又下面第2条确定. 2.如果没有用户线程,都是守护线程,那么JVM结束(随之而来的是所有的一切烟消云散,包括所有的守护线程). 补充说明: 定义:守护线程--也称“服务线程

Java知多少(58)线程Runnable接口和Thread类详解

大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明如下:    public void run( )

Thread类详解

java.lang 类 Thread java.lang.Object java.lang.Thread 所有已实现的接口: Runnable public class Threadextends Objectimplements Runnable 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的

使用Executor管理Thread对象详解

java SE5的java.util.concurrent包中的执行器(Executor)是管理Thread对象的优选方法.使用Executor管理Thread对象可以简化并发编程. Executor是在客户端和任务执行之间提供了一个间接层,与客户端直接执行任务不同,我们将使用Executor来执行任务.Executor允许你管理异步任务的执行,而无须显示地管理线程的生命周期. 线程对象知道如何运行具体的任务,它暴露了要执行的单一方法.ExecutorService(具有生命周期的Executo

.进程&线程(&java.lang.Thread)详解

一.进程与线程 进程 我们在进行操作电脑的时候,通常会打开浏览器,通讯工具等应用程序,这个时候CPU通过作业调度在内存中就会分配一些空间让它们处于宏观上的运行状态(处于可以被CPU执行的状态),而这部分空间资源就可以说是相应的进程占据的,很显然运行不同的程序需要不同的进程,在内存中也为它们分配独立,无共享的区域.静态描述进程的是PCB快(数据结构集),它是系统感知进程存在的唯一实体,通常包含进程名(或者标识符),用户名(或者用户标识号),家族关系. 进程的状态 就绪态:进程获得了除cpu以外的其

【转】Java Thread.join()详解

http://www.open-open.com/lib/view/open1371741636171.html 一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是

java 线程Thread.Sleep详解(转载)

我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒? 2.某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) .既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么? 我们先回顾一下操作系

Java Thread.join()详解--父线程等待子线程结束后再结束

目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 Thread t = new AThread(); t.start(); t.join(); 回到顶部 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需

Java Thread.join()详解

一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 Thread t = new AThread(); t.start(); t.join(); 回到顶部 二.为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处