Linux内核之基于Bootsplash嵌入式Linux启动画面定制

Linux内核之基于Bootsplash嵌入式Linux启动画面定制
Linux内核之基于Bootsplash嵌入式Linux启动画面定制

Linux内核之基于Bootsplash嵌入式Linux启动画面定制

Linux内核之基于Bootsplash嵌入式Linux启动画面定制

在基于linux的嵌入式仿真平台开发中,终端的美观和可定制是一个重要的问题。开机时滚动在屏幕上的字符串和单调的penguin图标,使嵌入式设备仍然脱离不了pc的痕迹,linux控制台上单调的“白纸黑字”型表现方式可谓大煞风景。改造linux控制台使之美观可定制地展示开机信息和logo成为基于嵌入式linux应用的一项重要工作。

开源项目bootsplash(https://www.360docs.net/doc/bb10689228.html,/)为解决这个问题提供了一个完美的解决方案。Boot-

splash通过对内核打补丁来改变linux

framebuffer控制台对图形显示的支持。通过用户空间程序来定制启动logo、设定控制台背景和显隐启动时的字符信息,甚至可以支持开机画面的动

画显示。本文介绍利用splashboot打造启动画面的解决方案,

涉及内核补丁、用户空间设置等方面的具体工作。 1 内核补丁和控制工具 1.1 支持bootsplash的内核补丁

针对不同的内核版本,bootsplash站点上给出了相应的内核补丁。我们所使用的内核版本为2.4.23,下载并给内核打上补丁:cd /usr/src/linux

make mrproper

patch -Np1 -i ../bootsplash-3.0.7-2.4.23.diff

重新编译内核:

make menuconfig

选上如下的几个参数:

Code maturity level options --->

Prompt for development and/or incomplete code/drivers

Block devices ---> RAM disk support

Block devices ---> Initial RAM disk (initrd) support Console drivers ---> Video mode selection support Console drivers ---> Frame-buffer support ---> Support for frame buffer devices

VESA VGA graphics console

Use splash screen instead of boot logo

然后编译内核:

make dep && make bzImage

再把生成的内核拷贝到/boot下:

cp arch/i386/boot/bzImage /boot/linux-bootsplash

这样我们得到的新内核bzImage就是支持bootsplash的内核了,剩下的工作就是对bootsplash的定制了。 1.2 安装用户空间程序

下载bootsplash工具,解压安装:

tar –zxf bootsplash-3.0.7.tar.gz

cd bootsplash-3.0.7/Utilities

make

cp fbresolution fbmngplay fbtruetype splash /sbin/这样完成了对用户空间工具的安装,其实bootsplash分别利用如下的四个程序:splash程序是将需要在framebuffer下显示的图片

资源制作成启动ram盘的工具;fbmngplay读mng文件,播放动画;fbtruetype显示truetype字体;fbresolution检

查分辨率。后面提到的脚本,只是以不同参数来读取配置文

件,调用上面的这几个程序。 2 开机LOGO的定制

2.1 设置splash屏幕的主题

前面安装好的splash用户空间程序中有一个程序splash,它需要一个配置文件来指明使用哪个图片、要不要隐藏文本信息的输出等。可以看出

“theme”就是splash工具需要的配置文件、图片和其他所需要的文件的集合。有很多已经准备好的theme可供挑选,我们也可以定制theme。

为了方便起见,我们下载theme-Linux.tar.bz2并以它为theme。

建立目录/etc/bootsplash/themes,解压Theme-

Linux.tar.bz2到这个目录下,现在的目录结构应该是:

/etc/bootsplash/themes/Linux

读者朋友可以看看该目录下的bootsplash-1024x768.cfg 来观察配置文件的格式。这个简单的文件包含的选项不多,事实上它只是清楚

地表明应该显示哪幅图片、控制台显示文本的颜色和背景色以及文本信息输出的位置区域。另外,不要忘了它还可以分别指定verbose和silent模式下

显示文件的位置。Silent模式禁止显示启动信息,代之以一个可选的进度条(这需要关于A外包脚本的更多设置)。基于这个配置文件,你可以自己修改以显

示自己喜欢的图片和采用自己喜欢的模式。 2.2 利用splash小工具安装splash主题到initrd

在系统启动的早期阶段,内核还不能读写硬盘。这个阶段要显示图片,那么图片放在什么地方那?答案是把图片写到ramdisk里,这样在启动的时候才能

读到,因为这时候还没有加载分区呢。当然不用担心initrd 的制作,splash小工具能轻松搞定。Splash小工具能根据基于你选择的配置文件

(theme)来自动产生一个initrd。所要做的就是执行如下命令:

splash -s -f /etc/bootsplash/themes/arch/config

/arch-1024-boot.cfg /boot/initrd.splash

生成的initrd.splash就是一个新的initrd。在GRUB或LILO中加入它就可以了。

按如下的方法修改GRUB或LILO:

在GRUB中加入或修改下面的行:

kernel (hd0,3)/boot/vmlinuz?2.4.21?melenas

root=/dev/hda4 vga=791 splash=silent

initrd (hd0,3)/boot/initrd.splash

在LILO中加入或修改下面的行:

vga=791

initrd=/boot/initrd.splash

append="splash=silent"

来看看这几行的意义:

vga=791: boot splash 将在1024x768 分辨率和65000 色(16 位色)下显示。Framebuffer的设定要根据我们所使用的theme的分辨率和颜色深度来选择。

splash=silent: 在silent模式下显示boot splash. 如果你希望用vebose模式,只需删除此行即可。Verbose模式是缺省模式。

initrd=/boot/initrd.splash: 这行将initrd.splash调入启动ram盘(图片存于其中)。

更新LILO或GRUB后,就可以看到精美的启动画面。

3 启动进度条的显示首先我们要弄清楚小工具程序progress(它是和splash程序一起拷到/sbin目录下的)。

progress能够在framebuffer

设备(默认情况下是/dev/fb0)上画四边形。不带任何参数运行progress,我们可以看到该程序的可选参数列表,我们感兴趣的几个参数是:x: 四边形起始点的x坐标

y: 四边形起始点的y坐标

dx: 四边形的宽度

dy: 四边形的高度

color: 四边形的颜色。这是一个16进制数,于web页上表示颜色的一致。

举例说明之:

progress 0 0 512 384 FFFFFF

将会在屏幕左上角画一个白色的四边形,这个四边形占据四分之一屏幕。

progress 256 192 521 384 FCD192

将会在屏幕正中间位置画一个黄色的四边形。

看这些例子的效果应该在tty终端上运行,不要在Konsole 或xterm window上看效果。

搞清楚progress的用法后,我们来看怎么把它与系统启动联系起来。通过分析Debian的启动代码,我们可以看出:它的启动脚本在每次启动完一

个服务程序(xfs, cron, samba

或其他服务程序)后使用progress程序来在指定位置画指定大小的四边形。在Debian中启动脚本有两个:先执行

/etc/init.d/rcS然

后执行

/etc/init.d/rc。下面研究一下/etc/init.d/rcS代码,注意这个脚本一次调用各个rulevel下的脚本。我们在其中加入画四

边形的代码,加入的代码用加黑表示:

#

danger_var=395

j=danger_var

for i in /etc/rc$runlevel.d/S*

do

[ ! ?f $i ] &continue

if [ $previous != N ] &[ $previous != S ] then

#

# Find start script in previous runlevel and

# stop script in this runlevel.

#

suffix=${i#/etc/rc$runlevel.d/S[0?9][0?9]} stop=/etc/rc$runlevel.d/K[0?9][0?9]$suffix

previous_start=/etc/rc$previous.d/S[0?9][0?9]$suffix

#

# If there is a start script in the previous level

# and _no_ stop script in this level, we don"t

# have to re?start the service.

#

[ ?f $previous_start ] &[ ! ?f $stop ] &continue fi

#继续进度条绘制

#保证进度条宽度不超出范围

if ((j <616))

then

/usr/local/bin/progress 204 666 $j 21 FCD123 let j=j+15

fi

#结束进度条绘制

case "$runlevel" in

0|6)

startup $i stop

;;

*)

startup $i start

;;

esac

done

这段代码以同样的方式接着画四边形进度条。但是danger_var是什么呢?前面说过为

了平滑地接着第一部分画,我们需要知道第一部分四边形画到什么位置结束的。这个位置就用danger_var来记录。问题又来了,怎么将第一个脚本里的变

量传到第二个脚本?可以在第一个脚本/etc/init.d/rcS的末尾加上如下的代码:

sed "s/danger_var=[0?9]*/danger_var="$j"/g" /etc/init.d/rc > /tmp/boots

mv /tmp/boots /etc/init.d/rc

chmod 755 /etc/init.d/rc

上面的代码很清楚,获得j的值,在第二个脚本文件rc 中寻找字符串“danger_var=…”并把它修改为“danger_var=结束时的j值”,把修改后的文件另存为/tmp/boots,然后重命名为/etc/init.d/rc并改变执行权限。

如果选用danger_var作为变量名来传递位置值,那么注意在其他启动脚本中不能出现名字冲突。

现在,重启计算机,可以享受美丽的开机进度条了。

4 结论

通过开源项目bootsplash提供的内核补丁和各种用户空

间工具,可以实现对FrameBuffer下的控制台美化和定制。这对于嵌入式仿真环境平台的开发有着重要的意义,使得嵌入式仿真环境平台从一定程度上减少PC的痕迹,成为个性化和高度可定制的平台。

# 初始化变量j

# j 为进度条的宽度

j=20

for i in /etc/rcS.d/S??*

do

[ ! ?f "$i" ] &continue

# 进度条开始

#

# 保证进度条宽度不超出范围

if ((j <616))

then

# 此时调用progress程序,画比前一次宽一个单位

#(15个像素)的进度条

# x y dx dy color

/usr/local/bin/progress 204 667 $j 21 FCD123

let j=j+15

fi

# 结束进度条绘制

case "$i" in

*.sh)

(

trap ? INT QUIT TSTP

set start

. $i

)

;

;

*)

#遍历sh 文件后, 启动子进程$i start

;;

esac

done

基于32位ARM920T内核的微处理器的嵌入式Linux系统构建详解

基于32位ARM920T内核的微处理器的嵌入式Linux系统构建详解目前,在嵌入式系统中基于ARM微核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用,建立面向ARM构架的嵌入式操作系统成为当前研究的热点问题。 已经涌现出许多嵌入式操作系统,如VxWork,windows-CE,PalmOS,Linux等。在众多的嵌入式操作系统中,Linux以其开源代码及免费使用倍受开发人员的喜爱。本文选用的微处理器S3C2410是基于32位ARM920T内核的微处理器,基于此处理器构造一Linux 嵌入式操作系统,将其移植到基于32位的ARM920T内核的系统中,在此基础上进行应用程序开发。 l、开发环境介绍 1.1、基于S3C2410ARM920T的硬件平台 该系统的硬件平台为深圳旋极公司提供,硬件的核心部件为三星$3C2410ARM920T芯片,外围还包括:64MNANDFLASH和RAM外围存储芯片;串口、网口和USB外围接口;CSTNLCD和触摸屏外围显示设备;UDAl34lTS的外围音频设备。S3C2410处理器和外围设备共同构成了基于ARM920T的开发板。 1.2、嵌入式Limlx软件系统 该嵌入式Linux的软件系统包括以下4个部分:引导加载程序vivi;Linux2.6.14内核;YAFFS2文件系统以及用户程序。他们的可执行映像依次存放在系统存储设备上. 与通常的嵌入式系统布局有所不同,本系统在引导加载程序和内核映像之间还增加了一个启动参数区,在这个区里存放着系统启动参数。引导加载程序通过调用这些参数来决定启动模式、启动等待时间等,这些启动参数的增加加强了系统的灵活性。本系统采用64MNANDFLASH的存储设备。 2、嵌入式Linux系统设计与实现 2.1、引导加载程序vivi

linux启动过程

Linux系统启动过程分析 by 王斌斌 binbinwang118@https://www.360docs.net/doc/bb10689228.html, Linux系统启动过程分析 操作系统的启动过程,实际上是控制权移交的过程。Linux 系统启动包含四个主要的阶段:BIOS initialization, boot loader, kernel initialization, and init startup.见下图: 阶段一、BIOS initialization,主要功能如下: 1.Peripherals detected 2.Boot device selected 3.First sector of boot device read and executed 系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。 执行POST代码对系统外围关键设备检测通过后,系统启动自举程序,根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。 注:在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否准备好,以供操作系 “” 统使用。 阶段二、Boot Loader 关于Boot Loader,简单的说就是启动操作系统的程序,如grub,lilo,也可以将boot loader本身看成一个小系统。 The BIOS invokes the boot loader in one of two ways: 1.It pass control to an initial program loader (IPL) installed within a driver's Master Boot Record (MBR) 2.It passes control to another boot loader, which passes control to an IPL installed within a partition's boot sector. In either case, the IPL must exist within a very small space, no larger than 446 bytes. Therefore, the IPL for GRUB is merely a first stage, whose sole task is to locate and load a second stage boot loader, which does most of the work to boot the system. There are two possible ways to configure boot loaders: Primary boot loader: Install the first stage of your Linux boot loader into the MBR. The boot loader must be configure to pass control to any other desired operating systems. Secondary boot loader: Install the first stage of your Linux boot loader into the boot sector of some partition. Another boot loader must be installed into the MBR, and configured to pass control to your Linux boot loader. 假设Boot Loader 为grub (grub-0.97),其引导系统的过程如下: grub 分为stage1 (stage1_5) stage2两个阶段。stage1 可以看成是initial program loaderI(IPL),而stage2则实现了grub 的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root )等。

LInux 嵌入式操作系统期末试题

1.简答题:请简单概括什么是嵌入式系统、并举出嵌入式系统的特点;(6分) 答: 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统; 其特点如下: (1)嵌入式系统是面向特定系统应用的。 (2)嵌入式系统涉及计算机技术、微电子技术、电子技术、通信和软件等各个行业; 是一个技术密集、资金密集、高度分散、不断创新的知识集成系统; (3)嵌入式系统的硬件和软件都必须具有高度可定制性;只有这样才能适应嵌入式系 统应用的需要,在产品价格和性能方面具备竞争力; (4)嵌入式系统的生命周期相当长。 (5)嵌入式系统不具备本地系统开发能力,通常需要有一套专门的开发工具和环境。 2.嵌入式操作系统的优势:1.低成本开发系统 2.可应用多种硬件平台 3.可定制内核 4. 性能优异 5.良好的网络支持 3.linux文件类型:1.普通文件 2.目录文件 3.链接文件 4.设备文件 a.块设备文件(硬 盘:/dev/hda1)b.字符设备(串行端口接口设备) 4.linux文件属性:访问权限:r:可读w:可写x:可执行用户级别:u:文件拥有者g:所 属用户组 o:其他用户第一个字符显示文件类型:-普通d目录 l 链接… 5.简答题:(6分) linux目录结构:/bin 存放linux常用操作命令的执行文件(二进制文件) /boot 操作系统启动时所需要的程序 /dev Linux系统中使用的外部设备 /etc 系统管理时所需要的各种配置文件和子目录 /etc/rc.d Linux启动和关闭时要用到的脚本 /etc/rc.d/init Linux默认服务的启动脚本 /home 系统中默认用户工作根目录 /lib 存放系统动态链接共享库 /mnt软驱、光驱、硬盘的挂载点 /proc存放系统核心与执行程序所需信息、 /root超级用户登陆时的主目录 /sbin 存放管理员常用系统管理程序 /usr存放用户应用程序和文件 /var存放日志信息(答六点即可) 6.编写一个shell文件:创建studen01 –student30这30个用户,用户组为class1,之 后编写shell文件,删除所有用户

嵌入式Linux内核移植详解(顶嵌)

内核移植阶段 内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。 内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。 一.移植准备 1. 目标板 我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址: https://www.360docs.net/doc/bb10689228.html,/thread-80832-5-1.html。bootloader移植准备。 2. 内核源码 这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是 ftp://https://www.360docs.net/doc/bb10689228.html,/pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2。 3. 烧写工具 我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持 4. 知识储备 要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进 行简单介绍。 (1)arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子 目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体 系结构的子目录。PC机一般都基于此目录。 (2)block/:部分块设备驱动程序。 (3)crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验 算法。 (4) documentation/:文档目录,没有内核代码,只是一套有用的文档。 (5) drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目 录:如,/block 下为块设备驱动程序,比如ide(ide.c)。 (6)fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持 一个文件系统, 例如fat和ext2。

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内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux 内核,另一种是内核增量补丁,它们都是tar归档压缩包。除非你有特别的原因需要使用旧版本的Linux内核,否则你应该总是升级到最新版本。 使用Git 由Linus领头的内核开发队伍从几年前就开始使用Git版本控制系统管理Linux内核了(参考阅读:什么是Git?),而Git项目本身也是由Linus创建的,它和传统的CVS不一样,Git是分布式的,因此它的用法和工作流程很多开发人员可能会感到很陌生,但我强烈建议使用Git下载和管理Linux内核源代码。 你可以使用下面的Git命令获取Linus内核代码树的最新“推送”版本: $ git clone git://https://www.360docs.net/doc/bb10689228.html,/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 然后使用下面的命令将你的代码树与Linus的代码树最新状态同步: $ git pull 安装内核源代码 内核包有GNU zip(gzip)和bzip2格式。Bzip2是默认和首选格式,因为它的压缩比通常比gzip更好,bzip2格式的Linux内核包一般采用linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的具体版本号,下载到源代码包后,解压和抽取就很简单了,如果你下载的是bzip2包,运行: $ tar xvjf linux-x.y.z.tar.bz2 如果你下载的是gzip包,则运行: $ tar xvzf linux-x.y.z.tar.gz 无论执行上面哪一个命令,最后都会将源代码解压和抽取到linux-x.y.z目录下,如果你使用Git下载和管理内核源代码,你不需要下载tar包,只需要运行git clone命令,它就会自动下载和解压。 内核源代码通常都会安装到/usr/src/linux下,但在开发的时候最好不要使用这个源代码树,因为针对你的C库编译的内核版本通常也链接到这里的。 应用补丁

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) linux是如何组成的? 答:linux是由用户空间和内核空间组成的 为什么要划分用户空间和内核空间? 答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的 安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间 linux内核是如何组成的? 答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、 VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers)设备驱动 linux 内核源代码 linux内核源代码是如何组成或目录结构? 答:arc目录存放一些与CPU体系结构相关的代码其中第个CPU子目录以分解boot,mm,kerner等子目录 block目录部分块设备驱动代码 crypto目录加密、压缩、CRC校验算法 documentation 内核文档 drivers 设备驱动 fs 存放各种文件系统的实现代码 include 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中 init 内核初始化代码 ipc 进程间通信的实现代码 kernel Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化) lib 库文件代码 mm 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录net 各种网络协议的实现代码,注意而不是驱动 samples 内核编程的范例 scripts 配置内核的脚本 security SElinux的模块 sound 音频设备的驱动程序 usr cpip命令实现程序 virt 内核虚拟机 内核配置与编译 一、清除 make clean 删除编译文件但保留配置文件

LInux嵌入式操作系统期末试题

简答题:请简单概括什么是嵌入式系统、并举出嵌入式系统的特点;(6分) 答: 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统; 其特点如下: (1)嵌入式系统是面向特定系统应用的。 (2)嵌入式系统涉及计算机技术、微电子技术、电子技术、通信和软件等各个行业; 是一个技术密集、资金密集、高度分散、不断创新的知识集成系统; (3)嵌入式系统的硬件和软件都必须具有高度可定制性;只有这样才能适应嵌入式系统应用的需要,在产 品价格和性能方面具备竞争力; (4)嵌入式系统的生命周期相当长。 (5)嵌入式系统不具备本地系统开发能力,通常需要有一套专门的开发工具和环境。 嵌入式操作系统的优势:1.低成本开发系统 2.可应用多种硬件平台 3.可定制内核 4.性能优异 5.良好的网络支持 linux文件类型:1.普通文件2.目录文件3.链接文件4.设备文件a.块设备文件(硬盘:/dev/hda1)b.字符设备(串行端口接口设备) linux文件属性:访问权限:r:可读w:可写x:可执行用户级别:u:文件拥有者g:所属用户组o:其他用户第一个字符显示文件类型:- 普通 d 目录 l 链接… 简答题:(6分) linux目录结构:/bin 存放linux常用操作命令的执行文件(二进制文件) /boot 操作系统启动时所需要的程序 /dev Linux系统中使用的外部设备 /etc 系统管理时所需要的各种配置文件和子目录 /etc/rc.d Linux启动和关闭时要用到的脚本 /etc/rc.d/init Linux默认服务的启动脚本 /home 系统中默认用户工作根目录 /lib 存放系统动态链接共享库 /mnt软驱、光驱、硬盘的挂载点 /proc存放系统核心与执行程序所需信息、 /root超级用户登陆时的主目录 /sbin 存放管理员常用系统管理程序 /usr存放用户应用程序和文件 /var存放日志信息(答六点即可) 编写一个shell文件:创建studen01 –student30这30个用户,用户组为class1,之后编写shell文件,删除所有用户 操作步骤:1.打开Terminal(终端): 2.输入vi shell 3.输入i 进入编辑模式 4.输入 #!/bin/bash groupadd class1 for((i=1;i<10;i++)) do username=student0$i

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

pc104 linux定制

基于PC/104平台嵌入式Linux系统核心定制方法 2007-10-26 嵌入式在线收藏| 打印 基于PC/104平台的嵌入式Linux技术在海洋自动观测系统中具有广泛的应用前景,Linux核心定制方法的研究是嵌入式Linux系统研制的关键工作。本文结合PC/104平台嵌入式Linux系统的研制,详细论述了Linux内核和文件系统的定制方法。 本文就如何对Linux系统的核心实现定制进行论述,主要内容包括Linux内核部分和文件系统,系统定制的硬件平台是PC/104单片机。之所以将Linux内核定制、文件系统定制单独讨论,是因为在基于任何平台的Linux系统定制过程中,其内核和文件系统的定制工作都具有相似的特征和相似的过程。 在基于PC/104平台的嵌入式Linux研制过程中,进行核心定制的主要目的是从需求出发使系统最大程度地满足应用的需要、最大程度地适应系统硬件平台、最优化地支持系统外围设备和应用程序,并且尽量减少对系统资源的占用、减少系统功耗,增强系统的安全性、稳定性、可靠性,另外使系统真正地实现产权自主化。 内核定制 一般操作系统的内核从体系结构角度可以划分为两种:微内核体系结构、单内核体系结构。微内核体系结构只在内核中包括了一些基本的内核功能,其它部分在用户内存空间运行,这种结构需要在各层之间进行调用,因此会有一定的消耗,使执行效率不如单内核体系结构。Linux采用单内核体系结构,内核的所有部分都集中在一起,这样能使系统的各部分直接沟通,有效地缩短任务之间的切换时间,提高了系统的响应速度,实时性好并提高了CPU的利用率,但在系统比较大的时候体积也比较大,与嵌入式系统容量小、资源有限的特点不符合,因此需要进行非常精细的定制以适应嵌入式系统的需要。 内核版本 Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是双树系统。一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或称开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行,如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。 一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发树就体现在源程序的版本号中;源程序版本号的形式为x.y.z,对于稳定树来说,y是偶数;对于开发树来说,y 比相应的稳定树大一(是奇数)。到目前为止,稳定树的最高版本是2.4.21,开发树的最新版

Linux启动过程详解

深入浅出:Linux的启动流程刨析 Linux的启动过程,是一个Linuxer必须要熟练掌握的。通过系统的启动过程,可以更深入的理解Linux,假如Linux系统出问题的话,可以通过启动过程来分析原因,解决问题。而且,在掌握了Linux的启动流程后,还可以借助宿主机来打造自己的Linux。 下面是我画的一张简单的Linux启动流程图 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1、/sbin/init 2、/etc/inittab 3、/etc/rc.d/rc.sysinit 4、/etc/rc.d/rcN.d //这是几个文件夹N代表数字1,2,3,4.. 5、/etc/fstab 1、关于/sbin/init与/etc/inittab 关于/sbin/init ,它是一个二进制可执行文件,为系统的初始化程序,而/etc/inittab是它的配置文件,我们可以通过/etc/inittab来一睹它的功能,里面的内容是一种固定的文本格式,id:runlevels:action:process 我们来通过它的内容来学习它之前,先了解写运行级别的分类(0-6): 0:关机half

1:单用户模式singel user 2:多用户模式multi user ,不提供nfs服务without nfs 3:完全多用户字符模式full multiuser text mod 4:系统预留officially undefined 5:图形登录界面graphical login 6:重启reboot id:3:initdefault: //这里定义linux的启动时的运行级别,可以看到我的主机的启动级别是3 # System initialization. si::sysinit:/etc/rc.d/rc.sysinit //紧接着,运行系统第一个脚本/etc/rc.d/rc/sysinit //它的action:sysyinit指的是定义系统初始化过程 l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 //然后就是加载服务了,他们被定义在/etc/rc.d/rcN.d l3:3:wait:/etc/rc.d/rc 3 //action:waite 这个进程在在对应级别启动一次,知道它结束为止,我的系统启动级别为3,所有执行rc 3对应的服务 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ca::ctrlaltdel:/sbin/shutdown -t3 -r now //这里定义了一个组合快捷键,熟悉吧,没错就是重启,你可以把它注释掉不用 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"//这里定义了ups电源,powerfail 指的是如果突然断电,它对应的process命令是,提示用户系统电源失效,将要关机,提醒用户把数据都存储好 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"//这里的action,powerokwaite,指的是系统恢复供电,关机取消...

 1:2345:respawn:/sbin/mingetty tty1 //开启终端,在系统准备工作做好后,就会启动出6个终端,tty1~6 mingetyy就是终端的执行命令 2:2345:respawn:/sbin/mingetty tty2 //可以看到他们对应的级别是2345,你也可以注释

linux内核启动时几个关键地址

linux内核启动时几个关键地址 1、名词解释 ZTEXTADDR 解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。 ZRELADDR 内核启动在RAM中的物理地址。压缩的内核映像被解压到这个地址,然后执行。 This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid: __virt_to_phys(TEXTADDR) == ZRELADDR The initial part of the kernel is carefully coded to be position independent. TEXTADDR 内核启动的虚拟地址,与ZRELADDR相对应。一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。 TEXTADDR = PAGE_OFFSET + TEXTOFFST Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region. Previous kernels placed a restriction of 256MB here. TEXT_OFFSET 内核偏移地址,即内核起始位置相对于内存起始位置的偏移,对于相对于物理内存还是相对于虚拟内存都是一样的结果。在arch/arm/makefile中设定。 PHYS_OFFSET RAM第一个bank的物理起始地址,即物理内存的起始地址。 Physical start address of the first bank of RAM. PAGE_OFFSET RAM第一个bank的虚拟起始地址,即内核虚拟地址空间的起始地址。 2、小结 从上面分析可知道,linux内核被bootloader拷贝到RAM后,解压代码从ZTEXTADDR开始运行(这段代码是与位置无关的PIC)。内核被解压缩到ZREALADDR处,也就是内核启动的物理地址处。相应地,内核启动的虚拟地址被设定为TEXTADDR,满足如下条件: TEXTADDR = PAGE_OFFSET + TEXT_OFFSET 内核启动的物理地址和虚拟地址满足入下条件: ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR) 假定开发板为smdk2410,则有: 内核启动的虚拟地址 TEXTADDR = 0xC0008000 内核启动的物理地址 ZRELADDR = 0x30008000 如果直接从flash中启动还需要设置ZTEXTADDR地址。

简析linux内核的内核执行流程图

简析linux核的执行流程 ----从bootsect.s到main.c(核版本0.11)Linux启动的第一阶段(从开机到main.c) 3个任务: A、启动BIOS,准备实模式下的中断向量表和中断服务程序。 B、从启动盘加载操作系统程序到存。 C、为执行32的main函数做过渡准备。 存变化如下: ①、0xFE000到0xFFFFF是BIOS启动块,其中上电后第一条指令在0xFFFF0。 ②、而后0x00000到0x003FF总共1KB存放中断向量表,而接下去的地址到0x004FF共256B存放BIOS数据,从0x0E05B 开始的约8KB的存中存放中断服务程序。 ③、利用BIOS中断0x19h把硬盘的第一扇区bootsect.s的代码加载到存中,即0x07c00处,后转到该处执行。 ④、将bootsect.s的代码复制到0x90000处。 ⑤、利用中断0x13h将setup.s程序加载到存0x90200处。 ⑥、再将剩余的约240个扇区的容加载到0x10000~0x2EFFF 处。 ⑦、开始转到setup.s处执行,第一件事就利用BIOS提供的中断服务程序从设备上获取核运行的所需系统数据并存在0x90000的地址处,这时将原来bootsect.s的代码覆盖得只剩2Byte的空间。

⑧、关中断并将系统代码复制到0x00000处,将原来放在这里的中断向量表与BIOS数据区覆盖掉,地址围是 0x00000~0x1EFFF。同时制作两表与两寄存器。 ⑨开地址线A20,寻址空间达到4GB,后对8259重新编程,改变中断号。 ⑩、转到head.s(大小是25K+184B)执行,执行该程序完后是这样的: 0x00000~0x04FFF:页目录与4个页表,每一项是4KB,共20KB;0x05000~0x05400:共1KB的空间是软盘缓冲区; 0x05401~0x054b8:共184B没用; 0x054b9~0x05cb8:共2KB的空间存中断描述符表; 0x05cb9~0x064b8:共2KB的空间存全局描述符表; 之后就是main函数的代码了! 第二阶段、从main.c函数到系统准备完毕阶段。 第一步:创建进程0,并让进程0具备在32位保护模式下载主机中的运算能力。流程是: 复制根设备和硬盘参数表(main.c中的102、110、111行) 物理存规划格局(main.c的112行~126行,其中有 rd_init函数定义在kernel/ramdisk.c中,此函数用于虚拟盘初始化;而mem_init函数是用于存管理结构初始化,定义在mem/memory.c中,该函数页面使用

基于ARM的嵌入式linux内核的裁剪与移植.

基于ARM的嵌入式linux内核的裁剪与 移植 0引言微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Neculeus和WindowsCE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linu 0 引言 微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Nec uleus和Windows CE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linux 非常适合多数Intemet设备。Linux操作系统可以支持不同的设备和不同的配置。Linux对厂商不偏不倚,而且成本极低,因而很快成为用于各种设备的操作系统。嵌入式linux是大势所趋,其巨大的市场潜力与酝酿的无限商机必然会吸引众多的厂商进入这一领域。 1 嵌入式linux操作系统 Linux为嵌入操作系统提供了一个极有吸引力的选择,它是个和Unix 相似、以核心为基础、全内存保护、多任务、多进程的操作系统。可以支持广泛的计算机硬件,包括X86、Alpha、Sparc、MIPS、PPC、ARM、NEC、MOTOROLA 等现有的大部分芯片。Linux的程序源码全部公开,任何人都可以根据自己的需要裁剪内核,以适应自己的系统。文章以将linux移植到ARM920T内核的 s3c2410处理器芯片为例,介绍了嵌入式linux内核的裁剪以及移植过程,文中介绍的基本原理与方法技巧也可用于其它芯片。 2 内核移植过程 2.1 建立交叉编译环境 交叉编译的任务主要是在一个平台上生成可以在另一个平台上执行的程序代码。不同的CPU需要有不同的编译器,交叉编译如同翻译一样,它可以把相同的程序代码翻译成不同的CPU对应语言。 交叉编译器完整的安装涉及到多个软件安装,最重要的有binutils、gcc、glibc三个。其中,binutils主要用于生成一些辅助工具;gcc则用来生成交叉编译器,主要生成arm—linux—gcc交叉编译工具;glibc主要是提供用户程序所使用的一些基本的函数库。 自行搭建交叉编译环境通常比较复杂,而且很容易出错。本文使用的是

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)

相关文档
最新文档