当前位置:文档之家› Linux启动脚本分析之functions

Linux启动脚本分析之functions

Linux启动脚本分析之functions
Linux启动脚本分析之functions

Linux启动脚本分析之functions

# -*-Shell-script-*-

#

# functions This file contains functions to be used by most or all # 注释:该脚本几乎被/etc/init.d/ 下的所有脚本所调用,因为它包含了大量的

# shell scripts in the /etc/init.d directory. # 的基础函数。同时也被/etc/rc.d/rc.sysinit ,例如success、action、failure 等函数

# Linux100中文网https://www.doczj.com/doc/9c14595877.html,/

TEXTDOMAIN=initscripts # 设置TEXTDOMAIN 变量

############################################################################### ###########################################################################

# Make sure umask is sane # 确保root 用户的umask 是正确的022 (也就是rwxr-xr-x)

umask 022

# Set up a default search path. # 设置默认的PATH 变量

PATH=“/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin” # 默认为/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin

export PATH # 导出为环境变量

# Get a sane screen width # 设置正确的屏幕宽度

[ -z “${COLUMNS:-}” ] && COLUMNS=80 # 如果COLUMNS 变量的值为空,则设置为80 (列)

[ -z “${CONSOLETYPE:-}” ] && CONSOLETYPE=“`/sbin/consoletype`” # 如果CONSOLETYPE 为空则设置CONSOLETYPE 为/sbin/consoletype 命令返回的值

# 一般是vt 或者pty 、serial

############################################################################### ###########################################################################

if [ -f /etc/sysconfig/i18n -a -z “${NOLOCALE:-}” ] ; then # 如果存在/etc/sysconfig/i18n 且NOLOCALE 变量的值为空,则

. /etc/sysconfig/i18n # 执行/etc/sysconfig/i18n 文件,取得LANG 变量的值

if [ “$CONSOLETYPE” != “pty” ]; then # 如果当前console 类型不是pty(远程登录),而是vt 或者serial ,则

case “${LANG:-}” in # 根据LANG 的值作出选择

ja_JP*|ko_KR*|zh_CN*|zh_TW*|bn_*|bd_*|pa_*|hi_*|ta_*|gu_*)

# 如果LANG 是日文、中文简体、中文繁体、韩文等,则

export LC_MESSAGES=en_US # 把LC_MESSAGES 设置为en_US

export LANG # 同时导出为环境变量

;;

*)

export LANG # 如果是其他类型的语言,则直接导出LANG

; ;

esac

else

# 如果当前consle 是pty

[ -n “$LC_MESSAGES” ] && export LC_MESSAGES # 且如果LC_MESSAGES 不为空,则直接导出LC_MESSAGES

export LANG

fi

fi

############################################################################### ###########################################################################

# 下面是设置success、failure、passed、warning 4种情况下的字体颜色的

# Read in our configuration

if [ -z “${BOOTUP:-}” ]; then # 首先如果BOOTUP 变量为空,则

if [ -f /etc/sysconfig/init ]; then # 如果存在/etc/sysconfig/init 文件,执行/etc/sysconfig/init 文件

. /etc/sysconfig/init

else

# 否则我们就手工设置

# This all seem confusing? Look in /etc/sysconfig/init,

# or in /usr/doc/initscripts-*/sysconfig.txt

BOOTUP=color

# 第一设置BOOTUP 变量,默认就是color

RES_COL=60

# 第二设置设置在屏幕的第几列输出后面的“[ xxx ]” ,默认是第60列

MOVE_TO_COL=“echo -en

[url=file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/CyberArticle/033%5B$%7BRES_CO L%7DG/]\\033[${RES_COL}G[/url]

“ # MOVE_TO_COL 是用于打印“OK” 或者“FAILED” ,或者“PASSED” ,或者“W ARNING” 之前的部分,不含“[“

SETCOLOR_SUCCESS=“echo -en

[url=file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/CyberArticle/033%5B1;32m/]\\033[1; 32m[/url]

“ # SETCOLOR_SUCCESS 设置后面的字体都为绿色

SETCOLOR_FAILURE=“echo -en

[url=file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/CyberArticle/033%5B1;31m/]\\033[1; 31m[/url]

“ # SETCOLOR_FAILURE 设置后面将要输出的字体都为红色

SETCOLOR_W ARNING=“echo -en

[url=file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/CyberArticle/033%5B1;33m/]\\033[1; 33m[/url]

“ # SETCOLOR_W ARNING 设置后面将要输出的字体都为黄色

SETCOLOR_NORMAL=“echo -en

[url=file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/CyberArticle/033%5B0;39m/]\\033[0; 39m[/url]

“ # SET COLOR_NORMAL 设置后面输出的字体都为白

色(默认)

LOGLEVEL=1

fi

if [ “$CONSOLETYPE” = “serial” ]; then # 如果是通过串口登录的,则全部取消彩色输出

BOOTUP=serial

MOVE_TO_COL=

SETCOLOR_SUCCESS=

SETCOLOR_FAILURE=

SETCOLOR_WARNING=

SETCOLOR_NORMAL=

fi

fi

############################################################################### ###########################################################################

if [ “${BOOTU P:-}” != “verbose” ]; then # 如果BOOTUP 变量的值不为verbose ,则

INITLOG_ARGS=“-q” # 把INITLOG_ARGS 的值设置为-q (安静模式)

else # 否则

INITLOG_ARGS= # 把INITLOG_ARGS 的值请空

fi

############################################################################### ###########################################################################

# Check if $pid (could be plural) are running # 下面定义一个函数checkpid (),目的是检查/proc 下是否存在指定的目录(例如/proc/1/)

checkpid() { # 如果有任意一个存在,则返回0;

local i

for i in $* ; do

[ -d “/proc/$i” ] && return 0

done

return 1 # 如果给出的参数全部不存在对应的目录,则返回1

}

############################################################################### ###########################################################################

# A function to start a program. # 下面定义最重要的一个函数,daemon 函数,它的作用是启动某项服务。/etc/init.d/ 下的脚本的start 部分都会用到它

daemon() {

# Test syntax.

local gotbase= force=

local base= user= nice= bg= pid=

nicelevel=0

while [ “$1” != “${1##[-+]}” ]; do # daemon

函数本身可以指定多个选项,例如--check ,--check= ,

case $1 in

‘‘) echo $”$0: Usage: daemon [+/-nicelevel] {program}”# 也可以指定nice 值return 1;;

--check)

base=$2

gotbase=“yes”

shift 2

;;

--check=?*)

base=${1#--check=}

gotbase=“yes”

shift

;;

--user)

# 也可以指定要以什么用户身份运行(--user , --user=)

user=$2

shift 2

;;

--user=?*)

user=${1#--user=}

shift

;;

--force)

force=“force”

# --force 表示强制运行

shift

;;

[-+][0-9]*)

nice=“nice -n $1” # 如果daemon 的第一个参数是数字,则认为是nice 值

shift

;;

*) echo $”$0: Usage: daemon [+/-nicelevel] {program}”

return 1;;

esac

done

# Save basename. # basename 就是从服务器的二进制程序的full path 中取出最后的部分

[ -z “$gotbase” ] && base=${1##*/}

# See if it’s already running. Look *only* at the pid file. # 检查该服务是否已经在运行。不过daemon 函数只查看pid 文件而已

if [ -f /var/run/${base}.pid ]; then # 如果/var/run 下存在该服务的pid 文件,则

local line p

read line

# make sure it doesn’t core dump anywhere unless requested # 下面对该服务使用的资源作一些设置

ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0} >/dev/null 2>&1 # ulimit 是控制由该shell 启动的进程能够使用的资源,-S 是soft control 的意思,-c 是指最大的core

# dump 文件大小,如果DEAMON_COREFILE_LIMIT 为空,则默认为0

# if they set NICELEVEL in /etc/sysconfig/foo, honor it # 如果存在/etc/sysconfi/foo 文件,且其中有NICELEVEL 变量则用它代替daemon 后面的那个nice 值

[ -n “$NICELEVEL” ] && nice=“nice -n $NICELEVEL” # 注意,这里的nice 赋值是用nice -n 的格式,因为nice 本身可以启动命令,用这个格式较方便

# Echo daemon # 如果BOOTUP 的值为verbose ,则打印一个服务名

[ “${BOOTUP:-}” = “verbose” -a -z “$LSB” ] && echo -n “ $base”

# And start it up. # 下面是开始启动它了

if [ -z “$user” ]; then # 如果user 变量为空,则默认使用root 启动它

$nice initlog $INITLOG_ARGS -c “$*” # 执行nice -n initlog -q -c “$*”

else

# 如果指定了用户,则

$nice initlog $INITLOG_ARGS -c “runuser -s /bin/bash - $user -c

\”$*\”“ # 执行nice -n initlog -q -c “runuser -s /bin/bash - -c “$*”

fi

[ “$?” -eq 0 ] && success $”$base startup” || failure $”$base startup” # 如果上面的命令成功,则显示一个绿色的[ OK ] ,否则显示[ FAILURE ]

}

############################################################################### ###########################################################################

# A function to stop a program. # 下面定义另外一个很重要的函数killproc ,/etc/init.d/ 下面的脚本的stop 部分都会用到它

killproc() {

RC=0 # RC 是最终返回的值,初始化为0

# Test syntax.

if [ “$#” -eq 0 ]; then # killproc 函数的语法格式是killproc [] ,例如killproc sm-client 9

echo $”Usage: killproc {program} [signal]”

return 1

fi

notset=0 # noset 是用于检查用户是否指定了kill 要使用的信号

# check for second arg to be kill level

if [ -n “$2” ]; then # 如果$2 不为空,则表示用户有设定信号,则

killlevel=$2 # 把$2 的值赋予killlevel 变量

else # 否则

notset=1 # notset 变量的值为1,同时killlevel 为‘-9’ (KILL 信号)

killlevel=“-9”

fi

# 补充:注意,并不是说用户没有指定信号地停止某项服务时,就会立即用kill -9 这样的方式强制杀死,而是先用TERM 信号,然后再用KILL

# Save basename.

base=${1##*/} # basename 就是得出服务的名称

# Find pid.

pid= # 把pid 变量的值清空。注意,不是指pid 变量的值等于下面脚本的执行结果,要看清楚

if [ -f /var/run/${base}.pid ]; then # 下面和上面的daemon 函数一样找出pid

local line p

read line

# Kill it.

if [ -n “${pid:-}” ] ; then # 如果pid 的值最

终不为空,则

[ “$BOOTUP” = “verbose” -a -z “$LSB” ] && echo -n “$base “ # 且BOOTUP 的值为verbose ,且LSB 变量不为空,则打印一个服务名

if [ “$notset” -eq “1” ] ; then # 如果notset 变量不为1,表示用户没有指定信号,则

if checkpid $pid 2>&1; then # 调用checkpid $pid 检查是否在/proc/ 下存在进程目录,如果有

# TERM first, then KILL if not dead # 先尝试用TERM 信息,不行再用KILL 信号

kill -TERM $pid >/dev/null 2>&1 # 执行kill -TERM $pid

usleep 100000 # usleep 和sleep 一样,不过单位是百万分之1秒。这里休眠1秒

if checkpid $pid && sleep 1 && # 如果checkpid $pid 还是查到有/proc// 目录存在,则表示还没有杀死,继续等待1秒

checkpid $pid && sleep 3 && # 如果1秒后用checkpid 检查还是有,则再等待3秒;

checkpid $pid ; then # 如果还是没有杀死,则用KILL 信号

kill -KILL $pid >/dev/null 2>&1 # 执行kill -KILL 杀死它

usleep 100000 # 等待1秒种

fi

fi

checkpid $pid # 再次检查pid 目录

RC=$?

# 并把结果返回给RC ,这就算是killproc 的最后状态了

[ “$RC” -eq 0 ] && failure $”$base shutdown” || success $”$base shutdown” # 如果RC 的值为0,则表示kill -9 没有杀死了进程,则调用failure 函数,否则调用success

RC=$((! $RC))

# use specified level only # 上面都是在没有指定信号的情况的,下面是用户指定了信号的。例如restart)或者reload)部分

else # 这个else 是针对if [ “$notset” -eq “1” ] 的

if checkpid $pid; then # 如果检查到进程存在,则

kill $killlevel $pid >/dev/null 2>&1 # 执行kill 命令,但使用指定的信号$killlevel

RC=$?

# 并把状态值返回给变量RC

[ “$RC” -eq 0 ] && success $”$base $killlevel” || failure $”$base $killlevel” # 如果RC 为0则表示成功,调用success;否则调用failure 函数

fi

fi

else # 这个else 是针对if [ -n “${p id:-}” ] 的,也就是说没有pid 文件,pidof 命令也没有找到pid ,则

failure $”$base shutdown” # 调用failure 函数,表示停止服务失败

RC=1 # 同时RC 的值为1

fi

# Remove pid file if any. # 根据具体情况可能需要删除pid 文件

if [ “$notset” = “1” ]; then # 如果notset 不为1 ,也就是用户没有指定信号的情况

rm -f /var/run/$base.pid # 自动删除/var/run 下的pid 文件

fi

return $RC # 并把RC 作为exit status 返回

}

# 补充:自所以删除pid 文件只针对notset 为1 的情况,是因为-HUP 信号(重读配置),并不杀死进程,所以不能删除它的pid 文件

# 例如下面:

[root@https://www.doczj.com/doc/9c14595877.html,/]# ps -ef |grep xinetd

root 2635 1 0 12:25 ? 00:00:00 xinetd -stayalive -pidfile /var/run/xinetd.pid

[root@https://www.doczj.com/doc/9c14595877.html,/]# ./xinetd reload

Reloading configuration: [ OK ]

[root@https://www.doczj.com/doc/9c14595877.html,/]# ps -ef |grep xinetd

root 2635 1 0 12:25 ? 00:00:00 xinetd -stayalive -pidfile /var/run/xinetd.pid

root 3927 3412 0 16:43 pts/0 00:00:00 grep xinetd

[root@https://www.doczj.com/doc/9c14595877.html,/]#

可以看到pid 在reload 后并没有变

############################################################################### ###########################################################################

# A function to find the pid of a program. Looks *only* at the pidfile # 下面的pidfileofproc 函数和checkpid 类似,但不执行pidof 命令,只查询pid 文件

pidfileofproc() {

local base=${1##*/}

# Test syntax.

if [ “$#” = 0 ] ; then

echo $”Usage: pidfileofproc {program}”

return 1

fi

# First try “/var/run/*.pid” files

if [ -f /var/run/$base.pid ] ; then

local line p pid=

read line

############################################################################### ###########################################################################

# A function to find the pid of a program. # 下面的pidofproc 函数和上面的pidfileofproc 函数类似,但多了一步pidof 命令

pidofproc() {

base=${1##*/}

# Test syntax.

if [ “$#” = 0 ]; then

echo $”Usage: pidofproc {program}”

return 1

fi

# First try “/var/run/*.pid” files

if [ -f /var/run/$base.pid ]; then

local line p pid=

read line

############################################################################### ###########################################################################

status() { # 注释:下面的status 函数是判断服务的状态,总共有4种

local base=${1##*/}

local pid

# Test syntax.

if [ “$#” = 0 ] ; then

echo $”Usage: status {program}”

return 1

fi

# First try “pidof” # 同样是查找pid 先。直接使用pidof 命令

pid=`pidof -o $$ -o $PPID -o %PPID -x $1 || \

pidof -o $$ -o $PPID -o %PPID -x ${base}`

if [ -n “$pid” ]; then # 如果pid 变量的值不为空,则表示找到进程,

echo $”${base} (pid $pid) is running...” # 则打印“xxx (pid nnn) is running “ ,

return 0 # 并返回0

fi

# Next try “/var/run/*.pid” files # 如果pidof 命令没有找到,则尝试从pid 文件找

if [ -f /var/run/${base}.pid ] ; then

read pid

############################################################################### ###########################################################################

# 注释:下面的echo_xxx 函数就是真正在屏幕上打印[ ok ] 、[ PASSED ]、[ FAILURE ]、[ WARNING ] 的部分了

echo_success()

{ # 下面是echo_success 部分

[ “$BOOTUP” = “color” ] && $MOVE_TO_COL # 首先是

打印“[” 之前的空格

echo -n “[ “ # 然后打印“[“

[ “$BOOTUP” = “color” ] && $SETCOLOR_SUCCESS # 设置字体为红色

echo -n $”OK” # 打印OK

[ “$BOOTUP” = “color” ] && $SETCOLOR_NORMAL # 返回字体为白色

echo -n “ ]” # 打印“]”

echo -ne “\r” # 换行。

return 0 # 返回0,其他一律返回1

echo_failure() {

[ “$BOOTUP” = “color” ] && $MOVE_TO_COL

echo -n “[“

[ “$BOOTUP” = “color” ] && $SETCOLOR_FAILURE

echo -n $”FAILED”

[ “$BOOTUP” = “color” ] && $SETCOLOR_NORMAL

echo -n “]”

echo -ne “\r”

}

echo_passed() {

[ “$BOOTUP” = “color” ] && $MOVE_TO_COL

echo -n “[“

[ “$BOOTUP” = “color” ] && $SETCOLOR_WARNING echo -n $”PASSED”

[ “$BOOTUP” = “color” ] && $SETCOLOR_NORMAL echo -n “]”

echo -ne “\r”

return 1

}

echo_warning() {

[ “$BOOTUP” = “color” ] && $MOVE_TO_COL

echo -n “[“

[ “$BOOTUP” = “color” ] && $SETCOLOR_WARNING echo -n $”W ARNING”

[ “$BOOTUP” = “color” ] && $SETCOLOR_NORMAL echo -n “]”

echo -ne “\r”

}

############################################################################### ###########################################################################

# Inform the graphical boot of our current state

update_boot_stage() {

if [ “$GRAPHICAL” = “yes” -a -x /usr/bin/rhgb-client ]; then

/usr/bin/rhgb-client --update=“$1”

fi

return 0

}

############################################################################### ###########################################################################

# Log that something succeeded

success()

{

# success 函数除了打印[ xxx ] 之外,还会使用initlog 记录信息

if [ -z “${IN_INITLOG:-}” ]; then

initlog $INITLOG_ARGS -n $0 -s “$1” -e 1 # -n 是--name 的意思,-s 是--string ,-e 是--event ,1 表示完全成功

else

# silly hack to avoid EPIPE killing rc.sysinit

tra p ““ SIGPIPE

echo “$INITLOG_ARGS -n $0 -s \”$1\” -e 1” >&21

trap - SIGPIPE

详解bootloader的执行流程与ARM Linux启动过程分析

详解bootloader的执行流程与ARM Linux启动过程分析 ARM Linux启动过程分析是本文要介绍的内容,嵌入式Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。 1、引言 Linux 最初是由瑞典赫尔辛基大学的学生Linus Torvalds在1991 年开发出来的,之后在GNU的支持下,Linux 获得了巨大的发展。虽然Linux 在桌面PC 机上的普及程度远不及微软的Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来Linux 在嵌入式领域的迅猛发展,更是给Linux 注入了新的活力。 一个嵌入式Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 其中bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核。 Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。 根文件系统是Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。 应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。 从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本

Linux开机启动程序详解

Linux开机启动程序详解 由于操作系统正在变得越来越复杂,所以开机引导和关机下电的过程也越来越智能化。从简单的DOS系统转移到Windows NT系统,人们已经亲身感受到了这些变化——这已不仅仅是核心操作系统的启动引导和关闭了,还包括必须要同时启动或者关闭相当数量的服务项目。类似于Windows NT,Linux系统启动过程需要打开的服务项目也是数量极大的。 这里,我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤。 加载内核 LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核。请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存。因此,内核就必须完整地加载到可用RAM的第一个兆字节之内。为了实现这个目的,内核是被压缩了的。这个文件的头部包含着必要的代码,先设置CPU进入安全模式(以此解除内存限制),再对内核的剩余部分进行解压缩。 执行内核 内核在内存中解压缩之后,就可以开始运行了。此时的内核只知道它本身内建的各种功能,也就是说被编译为模块的内核部分还不能使用。最基本的是,内核必须有足够的代码设置自己的虚拟内存子系统和根文件系统(通常就是ext2文件系统)。一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。内核挂装了根文件系统之后,将启动并运行一个叫做init的程序。 注意:在这里我们故意略去了Linux内核启动的许多细节,这些细节只有内核开发人员才感兴趣。如果你好奇的话,可以访问http://https://www.doczj.com/doc/9c14595877.html,:8080地址处的“Kernel Hackers Guide”。 init进程 init进程是非内核进程中第一个被启动运行的,因此它的进程编号PID的值总是1。init读它的配置文件/etc/inittab,决定需要启动的运行级别(Runlevel)。从根本上说,运行级别规定了整个系统的行为,每个级别(分别由0到6的整数表示)满足特定的目的。如果定义了initdefault级别,这个值就直接被选中,否则需要由用户输入一个代表运行级别的数值。 输入代表运行级别的数字之后,init根据/etc/inittab文件中的定义执行一个命令脚本程序。缺省的运行级别取决于安装阶段对登录程序的选择:是使用基于文本的,还是使用基于X-Window的登录程序。

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

Linux下添加脚本到开机自启动的方法

Linux下添加脚本到开机自启动的方法 Linux配置开机自启动执行脚本的方法有很多,这里分享两种方法,分别是修改/etc/rc.local方法和chkconfig管理设置的方法,均可实现Linux配置开机自启动执行脚本的功能! 设置test.sh为开机要启动的脚本 [root@oldboy scripts]# vim /server/scripts/test.sh [root@oldboy scripts]# cat /server/scripts/ test.sh #!/bin/bash /bin/echo $(/bin/date +%F_%T) >> /tmp/ test.log 方法一:修改/etc/rc.local [root@oldboy ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Mar 30 10:50 /etc/rc.local -> rc.d/rc.local 修改/etc/rc.local文件 [root@oldboy scripts]# tail -n 1 /etc/rc.local /bin/bash /server/scripts/test.sh >/dev/null 2>/dev/null 重启系统,查看结果 [root@oldboy ~]# cat /tmp/test.log 2018-03-30_12:00:10 方法二:chkconfig管理 删除掉方法一的配置

[root@oldboy ~]# vim /etc/init.d/test #!/bin/bash # chkconfig: 3 88 88 /bin/bash /server/scripts/test.sh >/dev/null 2>/dev/null [root@oldboy ~]# chmod +x /etc/init.d/test 添加到chkconfig,开机自启动 [root@oldboy ~]# chkconfig --add test [root@oldboy ~]# chkconfig --list test test 0:off 1:off 2:off 3:on 4:off 5:off 6:off 重启系统,查看结果 [root@oldboy ~]# cat /tmp/test.log 2018-03-30_12:00:10 2018-03-30_12:33:20 操作成功 关闭开机启动 [root@oldboy ~]# chkconfig test off [root@oldboy ~]# chkconfig --list test test 0:off 1:off 2:off 3:off 4:off 5:off 6:off 从chkconfig管理中删除test [root@oldboy ~]# chkconfig --list test test 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@oldboy ~]# chkconfig --del test

linux grub 引导启动过程详解

linux grub 引导启动过程详解 2008-01-08 17:18 这几天看了很多文档,算是对linux的启动过程有了比较细致的了解. 网上有很多文章谈到这方面的内容,但总觉得没有一篇完全的解析linux启动的 细节,下面是我小弟在学习的过程中总结出来的一些东东.这个是完整的linux启动过程, 不涉及内核,但是我觉得比较详细哦. (由于本人比较懒,这一段是从网上抄的) 机器加电启动后,BIOS开始检测系统参数,如内存的大小,日期和时间,磁盘 设备以及这些磁盘设备用来引导的顺序,通常情况下,BIOS都是被配置成首先检查 软驱或者光驱(或两者都检查),然后再尝试从硬盘引导。如果在这些可移动的设 备中,没有找到可引导的介质,那么BIOS通常是转向第一块硬盘最初的几个扇区, 寻找用于装载操作系统的指令。装载操作系统的这个程序就是boot loader. linux里面的boot loader通常是lilo或者grub,从Red Hat Linux 7.2起,GRUB( GRand Unified Bootloader)取代LILO成为了默认的启动装载程序。那么启动的时候grub是如何被载入的呢 grub有几个重要的文件,stage1,stage2,有的时候需要stage1.5.这些文件一般都 在/boot/grub文件夹下面.grub被载入通常包括以下几个步骤: 1. 装载基本的引导装载程序(stage1),stage1很小,网上说是512字节,但是在我的系统上用du -b /boot/grub/stage1 显示的是1024个字节,不知道是不是grub版本不同的缘故还是我理解有误.stage1通常位于主引导扇区里面,对于硬盘就是MBR了,stage1的主要功能就是装载第二引导程序(stage2).这主要是归结于在主引导扇区中没有足够的空间用于其他东西了,我用的是grub 0.93,stage2文件的大小是107520 bit. 2. 装载第二引导装载程序(stage2),这第二引导装载程序实际上是引出更高级的功能, 以允许用户装载入一个特定的操作系统。在GRUB中,这步是让用户显示一个菜单或是输入命令。由于stage2很大,所以它一般位于文件系统之中(通常是boot所在的根 分区). 上面还提到了stage1.5这个文件,它的作用是什么呢你到/boot/grub目录下看看, fat_stage_1.5 e2fs_stage_1.5 xfs_stage_1.5等等,很容易猜想stage1.5和文件系统 有关系.有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这 时候就需要stage1.5来连接stage1和stage2了.因此对于不同的文件系统就会有不同的stage1.5.但是对于grub 0.93好像stage1.5并不是很重要,因为我试过了,在没有stage1.5 的情况下, 我把stage1安装在软盘的引导扇区内,然后把stage2放在格式化成ext2或者fat格式的软盘内,启动的时候照常引导,并不需要e2fs_stage_1.5或者fat_stage_1.5. 下面是我的试验: #mkfs.ext2 /dev/fd0 #mount -t ext2 /dev/fd0 /mnt/floppy #cd /mnt/floppy #mkdir boot #cd boot #mkdir grub (以上三步可用mkdir -p boot/grub命令完成) #cd grub #cp /boot/grub/{stage1,stage2,grub.conf} ./ #cd; umount /mnt/floppy

设置Linux开机自动运行脚本

设置Linux开机自动运行脚本 参考资料 实现目标:在Linux启动时,自动运行位于普通用户test1根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志文件追加一条记录,源码如下: fromdatetime import datetime now=datetime.now() f=open('test.log','a') f.write('%s '%now) f.close() Linux在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以把启动任务放到该目录下,有两种办法: 方案一: 1、因为其中的rc.local是在完成所有初始化之后执行,因此我们可以把启动脚本写到里面 2、用root账号登陆Linux,vi /etc/rc.d/rc.local编辑文件,在最后加入两行需要执行的脚本程序: cd /home/test1 --该步不可少,否则会提示没有权限打开'test.log'文件 su test1 -c "python /home/test1/test.py" --把要执行的命令作为一个参数传递级su 方案二: 1、init.d目录下都为可执行程序,他们其实是服务脚本,按照一定格式编写,Linux 在启动时会自动执行,类似Windows下的服务 2、用root帐号登录,vi /etc/rc.d/init.d/mystart,追加如下内容: #!/bin/bash #chkconfig:2345 80 05 --指定在哪几个级别执行,0一般指关机, 6指的是重启,其他为正常启动。80为启动的优先级,05为关闭的优先机 #description:mystart service RETVAL=0 start(){ --启动服务的入口函数 echo -n "mystartserive ..." cd /home/test1 su test1 -c "python /home/test1/test.py" }

Linux启动全过程-由bootloader到fs

Linux启动过程 许多人对Linux的启动过程感到很神秘,因为所有的启动信息都在屏幕上一闪而过。其实Linux的启动过程并不象启动信息所显示的那样复杂,它主要分成两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init。装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动, 包括重要系统精灵程序和其它指定在启动时装入的软件。 下面以Red Hat为例简单介绍一下Linux的启动过程。 一、启动内核 首先介绍启动内核部分。电脑启动时,BIOS装载MBR,然后从当前活动分区启动,LILO获得引导过程的控制权后,会显示LILO提示符。此时如果用户不进行任何操作,LILO将在等待制定时间后自动引导默认的操作系统,而如果在此期间按下TAB键,则可以看到一个可引导的操作系统列表,选择相应的操作系统名称就能进入相应的操作系统。当用户选择启动LINUX操作系统时,LILO就会根据事先设置好的信息从ROOT文件系统所在的分区读取LINUX映象,然后装入内核映象并将控制权交给LINUX内核。LINUX内核获得控制权后,以如下步骤继续引导系统: 1. LINUX内核一般是压缩保存的,因此,它首先要进行自身的解压缩。内核映象前面的一些代码完成解压缩。 2. 如果系统中安装有可支持特殊文本模式的、且LINUX可识别的SVGA卡,LINUX会提示用户选择适当的文本显示模式。但如果在内核的编译过程中预先设置了文本模式,则不会提示选择显示模式。该显示模式可通过LILO或RDEV工具程序设置。 3. 内核接下来检测其他的硬件设备,例如硬盘、软盘和网卡等,并对相应的设备驱动程序进行配置。这时,显示器上出现内核运行输出的一些硬件信息。 4. 接下来,内核装载ROOT文件系统。ROOT文件系统的位置可在编译内核时指定,也可通过LILO 或RDEV指定。文件系统的类型可自动检测。如果由于某些原因装载失败,则内核启动失败,最终会终止系统。 二、执行init程序 其次介绍init程序,利用init程序可以方便地定制启动其间装入哪些程序。init的任务是启动新进程和退出时重新启动其它进程。例如,在大多数Linux系统中,启动时最初装入六个虚拟的控制台进程,退出控制台窗口时,进程死亡,然后init启动新的虚拟登录控制台,因而总是提供六个虚拟登陆控控制台进程。控制init程序操作的规则存放在文件/etc/inittab中。Red Hat Linux缺省的inittab文件如下:# #inittab This file describes how the INIT process should set up the system in a certain #run-level. # # #Default runlevel.The runlevels used by RHS are: #0-halt(Do NOT set initdefault to this) #1-Single user mode #2-Multiuser,without NFS(the same as 3,if you do not have networking) #3-Full multiuser mode #4-unused #5-X11 #6-reboot(Do NOT set initdefault to this)

启动过程以及各个脚本的作用

开机自检-----MBR引导-----GRUB菜单------加载内核-----允许init进程 -----读取inittab(该文件中有运行级别,初始化文件,某个运行级别所要读取的文件,然后就执行/etc/rc.d/rcn.d向对应的文件) ----/etc/rc.d/rc.sysinit(由init进程调用执行,完成设置网络主机名加载文件系统等初始化工作------/etc/rc.d/rc(由init进程调用执行,根据指定的运行级别加载或终止相应的系统服务)------/etc/rc.d/rc.nd(是个目录,目录中有级别关闭和开启的服务K S 后的数字表示启动或关闭服务的优先级,越小越好----执行/etc/rc.d/rc.local(由rc脚本执行调用,保存用户定义的所需开机后自动执行的命令,可以开启某些服务,但是却不能关闭服务,因为关机时不读取该脚本,是最后读取的文件) -----启动mingetty(启动一个虚拟终端) init进程和inittab引导指令 init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。 init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式: id:runlevel:action:process其中id为入口标识符,runlevel为运行级别,action为动作代号,process为具体的执行程序。 id一般要求4个字符以内,对于getty或其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。 runlevel是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留,0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。 在一般的系统实现中,都使用了2、3、4、5几个级别,在Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。7-9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。 initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault 项,init将在控制台上请求输入 runlevel。

Linux内核启动流程分析(一)

很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下。由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩, 带调试信息、符号表的最初的内核,大小约23MB; 命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group arch/arm/mach-s3c2410/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o drivers/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 2. 将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,Image的大小约 3.2MB; 命令:arm-linux-gnu-objcopy -O binary -S vmlinux arch/arm/boot/Image 3.将 arch/arm/boot/Image 用gzip -9 压缩生成arch/arm/boot/compressed/piggy.gz大小约 1.5MB;命令:gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz 4. 编译arch/arm/boot/compressed/piggy.S 生成arch/arm/boot/compressed/piggy.o大小约1.5MB,这里实 际上是将piggy.gz通过piggy.S编译进piggy.o文件中。而piggy.S文件仅有6行,只是包含了文件piggy.gz; 命令:arm-linux-gnu-gcc -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 5. 依据arch/arm/boot/compressed/vmlinux.lds 将arch/arm/boot/compressed/目录下的文件head.o 、piggy.o 、misc.o链接生成arch/arm/boot/compressed/vmlinux,这个vmlinux是经过压缩且含有自解压代码的内核, 大小约1.5MB; 命 令:arm-linux-gnu-ld zreladdr=0x30008000 params_phys=0x30000100 -T arch/arm/boot/compressed/vmlinux.lds a rch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm /boot/compressed/vmlinux

linux下通过脚本实现自动重启程序.doc

linux下通过脚本实现自动重启程序 linux下通过脚本实现自动重启程序 自动重启故障相信大家都遇到过,原因也有很多,跟系统,硬件或者外界因素都有关,但是在Linux中可没有那么简单。这里集中讨论linux实现自动重启程序的方法。下面一起看看! 自动重启脚本 假定需要实现重启的程序名为test ,我们这里通过判断进程数目来判断程序是否正常。 ps -ef | grep $1 | grep -v grep | wc l 是获取$1(本例中为test)的进程数,脚本根据进程数来决定下一步的操作。通过一个死循环,每隔1秒检查一次系统中的指定程序的进程数。 代码如下: 脚本check #!/bin/sh #-----------------------------------# 函数: CheckProcess# 功能: 检查一个进程是否存在# 参数: $1 --- 要检查的进程名称# 返回: 如果存在返回0, 否则返回1.#---------------------------------------CheckProcess(){ # 检查输入的

参数是否有效if [ $1 = ]; then return 1 fi #$PROCESS_NUM获取指定进程名的数目,为1返回0,表示正常,不为1返回1,表示有错误,需要重新启动PROCESS_NUM=`ps -ef | grep $1 | grep -v grep | wc -l` if [ $PROCESS_NUM -eq 1 ]; then return 0 else return 1 fi} # 检查test实例是否已经存在while [ 1 ] ; do CheckProcess test CheckQQ_RET=$? if [ $CheckQQ_RET -eq 1 ]; then# 杀死所有test进程,可换任意你需要执行的操作killall -9 test exec ./test fi sleep 1done 脚本start: 加入limit coredumpsize 102400,设置core file的大小,一旦程序Core Dump,有迹可寻。在该脚本中后台执行check脚本,可以省去很多麻烦, #!/bin/cshlimit coredumpsize 102400 ./check 补充:电脑总是自动重启怎么办 1、右击我的电脑,选择属性项。 2、在打开的系统属性窗口中选择高级系统设置项进入。

嵌入式linux系统地启动过程

一、分析嵌入式系统的启动过程 嵌入式系统的启动过程: 上电------->u-boot------->加载Linux内核------->挂载rootfs ---->执行应用程序 二、分析u-boot 1.什么是u-boot(是一个通用的bootloader) U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。 Universal ----------->通用的 Boot ----------------->启动,引导 Loader ----------------->加载 通用------->支持多种架构的CPU,除了支持ARM系列的处理器外,还能支持MIPS、x86、Power PC、NIOS等诸多常用系列的处理器 ------->支持多种厂家的开发板,如cortex-A8,cortex-A9,cortex-A53等不同厂 家的开发板 ------->支持多种嵌入式操作系统,U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持Net BSD, Vx Works, QNX, RTEMS, ARTOS, Lynx OS, android 嵌入式操作系统。 Boot -------->完成硬件的初始化,启动硬件平台。 Loader ------->当初始化硬件结束后,加载操作系统。 2.u-boot的作用 大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。 (1)Stage1:CPU(S5P6818-->Cortex-A53)的初始化,使用汇编语言编写。 如:初始化Cache、MMU、clock、中断、看门狗、DDR3、eMMC、... (2)Stage2:板级初始化,使用C语言编写。 如:uart、网卡、usb、LCD、.... (3)提供了一些工具,如进入uboot的命令行模式,使用u-boot命令 (4)加载操作系统 3.U-boot的工作模式 U-Boot的工作模式有启动加载模式和下载模式。

debian linux系统开机启动项管理

Debian linux系统开机启动项的管理 Table of Contents 1. 关于LINUX 的启动 (2) 1.1 LINUX的关键启动脚本 (2) 1.2 LINUX启动SHELL脚本的一般书写规则 (3) 1.3开机启动的其他方法 (4)

1. 关于linux 的启动 1.1 linux的关键启动脚本 Linux的第一个进程是0号进程,一般认为0号进程创建了1号进程,1号进程建了所有的kernel进程,1号进程是所有进程的祖先。1号进程又称init进程,init进程是所有进程之父。 init读取/etc/inittab,以下是debian系统的inittab,init就是读取这个文件获取的第一个脚本,请注意里面的粗体字,会对您理解linux的运行有一定的帮助。 # /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. 默认的运行等级2 是多用户形式,这个数字也可以是1获其他的数字,关于运行等级,请见下文。在终端下,直接执行runlevel看到当前系统的默认运行等级。 id:2:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. 下面的命令是第一个执行的,除非是在紧急模式下启动。 可以看到,第一个运行的程序是/etc/init.d/rcS,也就是说rcS就是我们系统的初始化脚本。rcS是系统的初始化脚本,而在rcS文件中,直接执行了rc程序,在rc程序中,会执行当前系统默认运行等级下的所有要运行的脚本,这些脚本存放在rc?.d文件夹中(“?”是一个数字,运行等级是2的话就是rc2.d文件夹),在rc?.d文件夹中是以{K或S}{num}{name}命名的链接,这些链接至/etc/init.d/文件夹下的脚本,如果是K,那么意味着向/etc/init.d/下对应name的脚本传入stop 参数,如果是S开头的链接,意味着传入start参数 si::sysinit:/etc/init.d/rcS …到此,和我们的开机启动关系密切的代码已经结束了,当然,不排除在用户登录之后有针对用户的开机启动项目 # What to do in single-user mode. ~~:S:wait:/sbin/sulogin …

linux(凝思) 网卡绑定方法

linux系统里面有一个内置的nameif的命令可以实现网卡绑定的功能 方法:可以写一个脚本,然后将脚本设置为开机启动即可。 参考如下: (1) 首先写一个脚本,脚本路径为/etc/rc.d/init.d,脚本内容如下(针对两块网卡): #cat /etc/rc.d/init.d/nameif.sh #!/bin/sh /sbin/nameif -s a0 00:E0:81:D3:30:74 /sbin/nameif -s a1 00:E0:81:D3:30:76 /sbin/nameif -s eth0 00:E0:81:D3:30:74 /sbin/nameif -s eth1 00:E0:81:D3:30:76 注释:此处的MAC为举例用的,应根据自己机器的实际情况来编写脚本。 (2) 写完脚本后,给脚本加权限 chmod 777 /etc/rc.d/init.d/nameif.sh (3) 然后在对应的启动级别里做一个开机启动的连接,注意,nameif脚本需要执行在 network网络启动之前,否则无法生效 #cd /etc/rc.d/rc3.d #ln -s /etc/rc.d/init.d/nameif.sh S016nameif #cd /etc/rc.d/rc5.d #ln -s /etc/rc.d/init.d/nameif.sh S016nameif 注释:由于内核里面事先记录了eth[0-1*]的网卡名字信息,若直接对eth*进行绑定的话,会存在网卡名字占用的问题,由此会造成设置无法生效。所有上面所写的脚本里面首先将网卡的MAC地址赋给其他的名字,然后在重新指定给eth*,即可解决这个问题

ARMLinux启动过程分析_百度文库.

ARM Linux启动过程分析 一个嵌入式Linux 系统从软件角度看可以分为四个部分[1]:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 其中 bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用 Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。 从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。在嵌入式系统开发的过程中,很大一部分精力都是花在bootloader 和 Linux 内核的开发或移植上。如果能清楚的了解 bootloader 执行流程和 Linux的启动过程,将有助于明确开发过程中所需的工作,从而加速嵌入式系统的开发过程。而这正是本文的所要研究的内容。 2. Bootloader 2.1 Bootloader的概念和作用Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。由此可见,bootloader 和 Linux 内核有着密不可分的联系,要想清楚的了解 Linux内核的启动过程,我们必须先得认识bootloader的执行过程,这样才能对嵌入式系统的整个启过程有清晰的掌握。 2.2 Bootloader的执行过程不同的处理器上电或复位后执行的第一条指令地址并不相同,对于 ARM 处理器来说,该地址为 0x00000000。对于一般的嵌入式系统,通常把 Flash 等非易失性存储器映射到这个地址处,而 bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 bootloader。而因为存储 bootloader的存储器不同,bootloader的执行过程也并不相同,下面将具体分析。嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Flash 又分为 Nor Flash 和Nand Flash 两种。它们之间的不同在于: Nor Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并不支持XIP,所以要想执行 Nand Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。实际应用中的 bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置 Linux 启动参数,给 Flash 分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动Linux 内核的目的,所有的 bootloader都必须具备以下功能:BR> 1 初始化RAM 因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用

linux开机启动脚本的顺序

linux开机启动脚本的顺序 如果服务器重启之后需要手工开启许多服务、工作及以后的维护相对比较繁琐、特地总结了下linux下开机自动启动脚本所涉及的知识和方法、如下: 1、相关基础知识点 1)redhat的启动方式和执行次序是: 加载内核 执行init程序 /etc/rc.d/rc.sysinit # 由init执行的第一个脚本 /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式 /etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中) /sbin/mingetty # 等待用户登录 在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括: 调入keymap以及系统字体 启动swapping 设置主机名 设置NIS域名 检查(fsck)并mount文件系统 打开quota 装载声卡模块 设置系统时钟 等等。 /etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的 ,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx 从小到大来执行。(其中xx是数字、表示的是启动顺序)例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用 /etc/rc.d/rc3.d/下的脚本。 值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中 的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。 init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的 action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。 至此,LINUX的启动结束。 2)init运行级别及指令 一、什么是INIT: init是Linux系统操作中不可缺少的程序之一。

Linux 启动过程详解

Linux 启动过程详解 下面来详细了解一下Linux 的启动过程。Linux 的启动 过程包含了Linux 工作原理的精髓, 而且在嵌入式的开发过程也非常需要这方面知识的积累。 用户开机启动Linux 过程总体上是这样的: 首先当用户打开PC 的电源时,CPU 将自动进入实模式,并从地址0xFFFF0 开始自 动执行程序代码,这个地址通常是ROM-BIOS 中的地址。这时BIOS 进行开机自检,并 按BIOS 中设置的启动设备(通常是硬盘)进行启动,接着启动设备上安装的引导程序 lilo 或grub 开始引导Linux(也就是启动设备的第一个扇区) ,这时,Linux 才获得了启 动权。 接下来的第二阶段,Linux 首先进行内核的引导,主要完成磁盘引导、读取机器系统数 据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。 第三阶段执行init 程序(也就是系统初始化工作) init 程序调用了rc.sysinit 和rc 等程序, 而rc.sysinit 和rc 在完成系统初始化和运行服务的任务后,返回init。 之后的第四阶段,init 启动mingetty,打开终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。 Linux 启动总体流程图如图所示, 其中的4 个阶段分别由同步棒隔开。由于第一阶段 不涉及Linux 自身的启动过程,因此,下面分别对第二和第三阶段进行详细讲解。 内核引导阶段 2.2.2 在grub 或lilo 等引导程序成功完成引导Linux 系统的任务后,Linux 就从它们手中接管 了CPU 的控制权。用户可以从https://www.doczj.com/doc/9c14595877.html, 上下载最新版本的源码进行阅读,其目录为: linux-2.6.*.*archi386boot。在这过程中主要用到该目录下的这几个文件:bootsect.S、setup.S 以及compressed 目录下的head.S 等。 首先要介绍一下,Linux 的内核通常是压缩过后的,包括如上述提到的那几个重要的汇 编程序,它们都是在压缩内核vmlinuz 中的。因为Linux 中提供的内核包含了众多驱动和功能,因而比较大,所以在采用压缩内核可以节省大量的空间。

相关主题
文本预览
相关文档 最新文档