Debian系统开机启动过程以及如何自定义开机自启动脚本

原创 2017年01月05日 11:54:41

前言:

写这篇blog之前一直在折腾怎么将自己写好的脚本开机自启动,因为之前遇见过类似的问题,但是按照同样的解决方案操作,然后这脚本死皮赖脸就是不启动,但最终还是解决了,顺带也复习一下bootloader以及Linux kernel的启动过程。


一、简介bootloader的启动过程

    Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的 BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。

由此可见,Bootloader 和 Linux 内核有着密不可分的联系,要想清楚的了解 Linux内核的启动过程,我们必须先得认识 Bootloader的执行过程,这样才能对嵌入式系统的整个启动过程有清晰的掌握Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。不同的处理器上电或复位后执行的第一条指令地址并不相同。通常把 Flash 等非易失性存储器映射到这个地址处,而 Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。

 (1)初始化 RAM

     因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等

  (2)初始化串口

    串口在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是 Bootloader 必须要完成的工作,但是通过串口输出信息是调试Bootloader 和Linux 内核的强有力的工具,所以一般的 Bootloader 都会在执行过程中初始化一个串口做为调试端口

  (3)检测处理器类型

    Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序

  (4)设置 Linux启动参数

    Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。目前传递启动参数主要采用两种方式:即通过 struct param_struct 和struct tag(标记列表,tagged list)两种结构传递。struct param_struct 是一种比较老的参数传递方式,在 2.4 版本以前的内核中使用较多。从 2.4 版本以后 Linux 内核基本上采用标记列表的方式。但为了保持和以前版本的兼容性,它仍支持 struct param_struct 参数传递方式,只不过在内核启动过程中它将被转换成标记列表方式。标记列表方式是种比较新的参数传递方式,它必须以 ATAG_CORE 开始,并以ATAG_NONE 结尾。中间可以根据需要加入其他列表。Linux内核在启动过程中会根据该启动参数进行相应的初始化工作

   (5)调用 Linux内核映像

    Bootloader完成的最后一项工作便是调用 Linux内核。如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。但由于在 Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将 Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行

   总体来讲是:1.建立异常向量表  2.关闭看门狗  3.关闭MMU 4.初始化时钟 5.初始化DDR 6.重定位  7.SP初始化 8.清除bss段空间 9.跳转到DDR中执行。


二、简介Linux kernel的启动过程

在Bootloader将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核:  

arch/arm/kernel/head-armv.S    包括内核入口ENTRY(stext)到start_kernel间的初始化代码,

  主要作用是检查CPU ID, Architecture Type,初始化BSS等操作,并跳到start_kernel函数。在执行前,处理器应满足以下状态: 

r0 - should be 0 
r1 - unique architecture number 
MMU - off 
I-cache - on or off 
D-cache – off 

内核映像文件vmlinuz:包含有linux内核的静态链接的可执行文件,传统上,vmlinux被称为可引导的内核镜像。vmlinuz是vmlinux的压缩文件。其构成如下:
    (1)第一个512字节(以前是在arch/i386/boot/bootsect.S);
    (2)第二个,一段代码,若干个不多于512字节的段(以前是在arch/i386/boot/setup.S);
    (3)保护模式下的内核代码(在arch/x86/boot/main.c)。
    bzImage文件:使用make bzImage命令编译内核源代码,可以得到采用zlib算法压缩的zImage文件,即big zImage文件。老的zImage解压缩内核到低端内存,bzImage则解压缩内核到高端内存(1M(0x100000)以上),在保护模式下执行。bzImage文件一般包含有vmlinuz、bootsect.o、setup.o、解压缩程序misc.o、以及其他一些相关文件(如piggy.o)。注意,在Linux 2.6内核中,bootsect.S和setup.S被整合为header.S。
    initramfs(或initrd)文件:initrd是initialized ram disk的意思。主要用于加载硬件驱动模块,辅助内核的启动,挂载真正的根文件系统。

三、如何添加自启动脚本

1.当程序不需要使用的图像界面的时候,可以将执行脚本(autostart.sh)的命令直接添加在/etc/rc.local文件或者~/.bashrc的最后一行(exit 0之前)

如: #!/bin/sh
sh /home/linaro/autostart.sh
exit 0

2.当程序需要使用到图像界面的时候,可以将执行脚本(autostart.sh)的 命令直接添加在~/.config/lxsession/Linaro/autostart的最后一行添加
如 :@ /home/linaro/autostart.sh

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux (debian) 设置开机自启动

linux (debian),设置开机自启动,两种方法,第二种方法一直未成功,希望大家可以提出一些建议。。...

Debian下设置Shell脚本开机自动启动

Debian下设置Shell脚本开机自动启动 1) 进入init.d初始化脚本目录 #切换到root用户 sudo -s cd /etc/init.d 2) 创建启动Shel...
  • ncafei
  • ncafei
  • 2017年04月26日 14:29
  • 1735

Linux(Debian)设置开机自启动脚本

在网上搜索了很多如何在Linux下设置开机自启动脚本,做了很多实验发现并没有用。网上一种最简单的方法是在/ect/rc.local文件中的exit 0语句之前之前添加运行脚本就行,于是我添加了一行“e...

linux基础--debian开机自启动脚本

1.debian没有rc.local这个文件的需要自建连接: touch /etc/rc.localchmod 755 /etc/rc.localcd /etc/rc2.d ln -s ../rc....

debian添加开机启动服务

Debian设置开机自动启动与关闭

Debian GNU Linux服务列表的获取、服务的关闭/开启、服务在启动时是否自动运行的生效/失效

debian系统启动脚本 debian GNU/Linux使用SysV模块作为系统初始脚本。与RH一样,debian使用一个扩展的SysV模块,而slackware主要是基于BSD的,并为了使用Sys...

debian系统添加开机启动服务

因客户需求,需要开机就能在浏览器中看到实时视频,而自己设计观看实时视频的方案是:使用ffmpeg直接解码rtsp流,将解码结果通过http发送到nodejs服务器,nodejs服务器使用Websock...

debian下设置开机自启动

http://may523.blog.51cto.com/4232517/1283347 在Linux系统下,一个Services的启动、停止以及重启通常是通过/etc/init.d...

Debian 添加自启动服务

1. 新建脚本文件 在 /etc/init.d 下加入脚本文件 sudo vi /etc/init.d/aria2c 输入内容: #!/bin/sh ### BEGIN INIT I...
  • ncafei
  • ncafei
  • 2017年04月26日 14:05
  • 856

Debian 8设置开机启动命令行界面及解除root用户登陆限制

CLI:command Line Interface,命令行界面,现在的Linux发行版默认登陆界面几乎都是默认为GUI界面,如果按照旧版本的修改inittab文件,在一些比较新的版本是没有这个文件的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Debian系统开机启动过程以及如何自定义开机自启动脚本
举报原因:
原因补充:

(最多只允许输入30个字)