版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.:.;目 录 TOC TOC 构建嵌入式Linux系统.取本实验相关的软件包到ftp下载以下软件包: 文件名备注binutils-.tar.bz gcc-.tar.bz glibc-.tar.bz glibc-linuxthreads-.tar.bz linux-.tar.bz linux-libc-headers-.tar.bz 制造交叉编译工具链所需的源码包 crosstool-.tar.gz制造交叉编译工具链的脚本和补丁 crosstool.tar.bz已制造好的交叉编译工具链,需求解包到/opt目录运用 linux-.tar.bz内核. patch-.-aka针对开发板制造的内核pa
2、tch zImage已编译好的内核,可直接下载到开发板 rootfs-basic.tar根本根文件系统打包,由于有设备文件,所以解包需求root权限 rootfs-basic.cramfs采用cramfs文件系统格式的根本根文件系统映像,可直接下载到开发板 busybox-.tar.bzbusybox源码包,嵌入式根文件系统根本命令集 sqlite-.tar.gzsqlite源码包,嵌入式数据库 libcgi-.tar.gzlibcgi源码包,用于编写CGI程序的C函数库 qtopia-core-opensource-src-.tar.gzQtopia Core源码包,Qt的嵌入式版本 .交叉
3、编译工具链要做嵌入式Linux开发,首先需求有交叉编译工具链cross compiling toolchain,也就是在主机x PC上可编译生成目的板可执行文件ARM指令的编译工具。和普通的编译工具链一样,交叉编译工具链也包括编译、链接、修正目的文件的各种程序,如gcc、glibc、ld、gas、objdump、readelf等等。交叉编译工具链本身也是需求编译生成的,要得到一套完好的交叉编译工具链需求编译以下源码包: binutils gcc glibc linux内核 linux-libc-headers glibc-linuxthreads 这些源码包具有非常强的版本依赖关系,假设源码包
4、的版本不匹配,在编译过程中会出现各种各样的问题,有些问题需求对源码做些修正或者打补丁,有些问题那么是没有处理方法的,只能改换匹配较好的版本。编译的步骤也是比较复杂的,主要有以下几步: 根据目的平台配置内核源代码,生成内核头文件 编译binutils 编译器的自举bootstrap,也就是先编译出gcc的部分功能没有glibc支持,只需C编译器没有C+编译器 编译glibc 编译完好的gcc 侥幸的是,曾经有人写出了制造交叉编译器的脚本 HYPERLINK kegel/crosstoolkegel/crosstool ,该脚本中提供了一系列源码包版本的匹配方案,运用者需求选择目的平台和源码包的版
5、本匹配方案,执行该脚本会自动从官方网站 HYPERLINK / 和 HYPERLINK / 下载源代码,自动打补丁,然后自动完成一切的编译步骤。 首先从 HYPERLINK kegel/crosstoolkegel/crosstool 下载crosstool-.tar.gz,在主目录下解包 $ tar xf crosstool-.tar.gz; cd crosstool-.如今选择一种源码包的版本组合,各种版本组合的兼容性可以参考 HYPERLINK kegel/crosstool/crosstool-./buildlogs/kegel/crosstool/crosstool-./buildl
6、ogs/ ,在此他们选择在arm平台上glibc版本较高,兼容性较好的一个组合: gcc-. cgcc-. glibc-. binutils-. linux-. hdrs-. 修正crosstool-.目录下的脚本demo-arm.sh,取消这一行开头的#号注释符: #eval cat arm.dat gcc-.-glibc-.dat sh all.sh -notest同时将本来没有注释的这一行注释掉前面加#号: eval cat arm.dat gcc-.-glibc-.-tls.dat sh all.sh -notest留意该脚本开头有 TARBALLS_DIR=$HOME/downloa
7、dsRESULT_TOP=/opt/crosstool这阐明,该脚本运转时,自动从 HYPERLINK / 和 HYPERLINK / 下载相关的源码包到主目录的downloads目录下,假设他曾经下载过这些源码包,将它们拷到downloads目录下就可以不用再次下载了。对应于他们选择的版本组合,downloads目录下的源码包有: binutils-.tar.bz gcc-.tar.bz glibc-.tar.bz glibc-linuxthreads-.tar.bz linux-.tar.bz linux-libc-headers-.tar.bz 整个编译终了后,交叉编译工具链将放在/op
8、t/crosstool目录下,因此脚本需求在/opt下建子目录,假设不希望运用root权限运转该脚本,那么需求事先给/opt目录设置写权限: $ sudo chmod a+w /opt然后修正arm.dat,其中有 TARGET=arm-unknown-linux-gnu这是按规范的命名规那么为工具链命名的,但是通常他们都采用更简单的命名,很多软件的Makefile中交叉编译器默许也都采用简单的命名,为此他们把它改为TARGET=arm-linux。 由于编译过程需求用到patch、bison、flex,确认他的系统中安装了这些软件包。 在编译过程中能够还会遇到脚本的兼容性问题,假设他的Lin
9、ux发行版将sh指向dash例如Ubuntu,应将其改指向bash: $ cd /bin$ sudo ln -sf bash sh虽然用dash执行脚本时非常高效并且其实现完全遵守POSIX规范,然而现存的很多脚本比如glibc中的脚本有不符合POSIX规范的用法,所以仍需改用bash执行。 预备就绪后,在crosstool-.目录下运转demo-arm.sh脚本开场编译。编译完成后,交叉编译工具链的可执行文件位于/opt/crosstool/gcc-.-glibc-./arm-linux/bin目录,他们可以把这个途径添加到PATH环境变量中,例如将以下命令添加到/.bashrc启动脚本:
10、export PATH=$PATH:/opt/crosstool/gcc-.-glibc-./arm-linux/bin此外,网上也可下载到已编译好的交叉编译工具链,比如 HYPERLINK /snapgear/downloads.html/snapgear/downloads.html ,但是运用他人编译好的交叉编译工具链有很多限制,不能按本人的特殊需求对其定制,比如有些工程需求特定版本的gcc和glibc,再比如需求soft-float的编译器生成指令模拟浮点数运算。 以上编译步骤需求很长时间,也可以直接从ftp下载已制造好的交叉编译工具链安装到主机: $ sudo chmod a+w /
11、opt$ tar xf crosstool.tar.bz -C /opt然后在/.bashrc启动脚本中修正PATH环境变量。 .熟习开发环境. U-boot的根本运用方法衔接好开发板的网线和串口线,启动minicom配置成 N,无Flow Control。按下开发板电源,立刻按除回车以外的恣意键,进入bootloader提示符AKAE#。假设没来及按键就曾经启动了内核,可以按开发板上的RESET键重来。 留意:u-boot的终端不能处置控制字符,不要用挪动光标键或翻页键等,退格键可以用。按了产生控制字符的键再输入命令就会产生错乱,这时可以按下回车输入当前这条曾经错乱的命令,然后在新的提示符下
12、重新键入命令。 输入printenv命令显示bootloader的参数。 更改参数运用命令set或者setenv,如以下图所示:上图中,setenv ipaddr .表示设置开发板的IP地址为.。setenv netmask .表示设置子网掩码为.。setenv serverip .表示设置与开发板相连的PC机IP是.。可以根据他的情况重新设置。为了一致同见,在后面的实验中,他们一致设置为: AKAE # set ipaddr .AKAE # set serverip . (这一项应该和他的主机IP一致)AKAE # set netmask .AKAE # set gateway . (网关i
13、p设置成什么无所谓,普通都设为主机ip)AKAE # savesave将这些设定写入flash中,下次开发板上电时依然有效。假设不save那么仅改动内存中的参数值,reset后会恢复flash中原来的参数值。 设置完成后在开发板上ping 主机的ip地址,检查网络能否正常,如下所示:AKAE # ping .host . is alive这表示主机能ping通,网络正常。假设显示如下:AKAE # ping .ping failed; host . is not alive.这就表示主机不能ping通,网络异常,需求检查他的网络。还有一些常见的参数:AKAE # set bootdelay B
14、ootdelay设为,表示开发板上电后等待秒再启动,这秒时间内按恣意键会进入u-boot命令行形状,如以下图所示:另外,还有:AKAE # set bootmode nfs或者AKAE # set bootmode nandBootmode 可以设为nfs或者nand两者之一,这个参数阐明了u-boot启动时,根文件系统在哪里寻觅,假设是nand表示根文件系统保管在开发板本身的flash某个分区中,要到flash上去找;假设是nfs那么表示u-boot要去他的PC机的nfs效力的目录(PC机硬盘上)去找。在开发板bootloader输入以下命令查看M flash是如何分区的。 AKAE # m
15、tdpartsDevice nand . # parts = #: name size offset mask_flags: u-boot x x : kernel x x : ext x x : temp xd x u-boot分区保管bootloader程序,Linux内核保管在kernel分区,根文件系统会保管到ext分区, temp分区本实验中没有用到。 假设mtdparts命令未显示上述图样,能够是flash未作分区操作,可以运用mtdparts default命令来创建上述那样的默许分区。如以下图所示: 假设要保管新的分区表,运用命令save保管到flash中,否那么reset后将
16、恢复flash中原来的分区表。 下载文件到开发板内存中,需求经过tftp协议。开发板是tftp客户端,主机是tftp效力器。在配置好主机的tftp效力之后,主机上会有一个tftp效力的主目录/tftproot,他们把要下载到开发板上的文件都先拷贝到这个目录中,之后才干下载。tftp命令的格式为 tftp 文件名。留意他们都是把内核zImage文件下载到x地址上,把根文件系统img文件下载到x地址上。当他们用命令tftp x zImage把内核zImage下载到内存地址x上之后,先运用nand erase kernel命令擦除掉flash的kernel分区上的数据(否那么在读出flash数据时会
17、报失败),然后可以用nand write x kernel x命令把内存中的内核文件烧写到flash的对应kernel分区中去,如以下图所示: 同理,当他们用命令tftp x rootfs.cramfs把根文件系统rootfs.cramfs映像文件下载到内存地址x上之后,用nand write x ext x命令把它烧写到flash的ext分区中去,当然,在烧写之前也要先运用 nand erase ext擦除掉flash的ext分区,否那么烧写后读出数据会失败。如以下图所示:留意:假设发现tftp效力配置是正确的,但是有些文件不可以下载,那么很有能够是文件权限的问题。可以运用sudo chmo
18、d zImage rootfs.cramfs这样的命令来更改文件访问权限。如今,内核和cramfs根文件系统都烧写到flash上去了,只需设置好正确的内核启动参数就可以启动开发板了。AKAE # set bootcmd nand read x kernel x; myboot xAKAE # set bootargs noinitrd console=ttySAC,AKAE # set bootmode nandAKAE # set init /linuxrc AKAE # set root /dev/mtdblockAKAE # savebootcmd参数表示u-boot上电后会自动执行的命
19、令,第一条nand read x kernel x表示从flash上kernel分区去读取Linux内核到开发板内存地址x处,大小为x字节;第二条命令是myboot x表示跳转到地址x去启动Linux内核。这两条命令要用分号“;隔开,但是设置bootcmd参数时设置给它的是一个字符串,所以分号要用本义字符“;替代。bootargs就是他们常说的Linux内核的启动命令行参数Linux_cmd_line。U-boot经过这个参数告知内核一些关键的启动参数。实践上,在Uboot中,最后的完好的启动命令行参数是由前面设置那些一个一个的小项组合而成的。真正完好的命令行参数是:noinitrd cons
20、ole=ttySAC, init=/linuxrc csx_media=rj root=/dev/mtdblock mtdparts=akae-nand:M(u-boot),M(kernel),M(ext),M(temp) ip=.:.:.:.:eth:off noinitrd表示内核启动时不需求初始化一个内存磁盘ramdisk;而root=/dev/mtdblock表示根文件系统在flash的编号为的分区上从开场编号的,所以是第三个分区,回想前面的u-boot的分区信息,flash上分区依次是u-boot,kernel,ext,temp,他们的根文件系统就在第三个分区ext上;console
21、=ttySAC, 表示翻开一个串行终端ttySAC,它是经过串口任务的,波特率为;init=/linuxrc表示内核启动好后第一个执行的运用程序是/linuxrc,根目录下的linuxrc;mtdparts=akae-nand:M(u-boot),M(kernel),M(ext),M(temp)表示u-boot传送给内核的分区信息。他们在选择运用nfs根文件系统还是cramfs根文件系统的时候,bootargs、bootcmd和init参数根本都一样,不用改动,需求改动的是bootmode参数,由bootmode参数的设置决议去选择root参数描画cramfs根文件系统所在位置)还是nfsro
22、ot参数(描画nfs根文件系统所在位置,即bootmode为nand时选择root参数,bootmode为nfs时选择nfsroot参数。在启动进入到Linux系统后,可以经过在命令行终端键入如下命令来查看命令行参数:$cat /proc/cmdline如今启动。 AKAE # reset这时屏幕上出现很多内核启动信息,之后提示登录,输入root即可登录。 (none) login: root如今可以试试各种Linux根本命令。留意cramfs是只读文件系统,在开发板上运转时不能改动里面的文件。 有些时候他们能够会尝试配置不同的内核选项,会得到不同的几个内核zImage文件,这样都烧写到fla
23、sh上再reset启动太浪费时间,可以用tftp把内核zImage加载到内存x地址上,不烧写,直接用myboot x去启动内存上的内核。如以下图示:. 将本人定制的根文件系统下载到开发板运转“根文件系统是一种不严厉的说法,其实是指文件系统中的文件和目录,这些文件和目录构成了一个Linux系统运转所需的根本框架。ftp上的rootfs-basic.tar是根文件系统的打包,由于包含设备文件,需求root权限才干解包: $ sudo tar xf rootfs-basic.tar解包后可以根据本人的需求修正其中的目录和文件,然后将根文件系统目录制形成cramfs映像再下到开发板运转,这样就到达了修
24、正根文件系统中的目的。 首先确认他的主机上安装了软件包cramfsprogs,然后制造cramfs文件系统映像: $ mkcramfs /rootfs rootfs.cramfs然后按照前面的步骤把rootfs.cramfs下载到开发板的ext分区,运转一下试试。 . 设置开发板的启动方式为NFS Root根本思想是:在主机上开NFS效力器,把主机上的/rootfs目录导出为NFS效力目录,使开发板一启动就自动加载主机的/rootfs目录为根文件系统,省去了下载和烧写映像的费事,在主机上修正根文件系统中的文件立刻在开发板的系统上生效,在开发过程中非常便利。 首先在主机上安装和配置NFS效力,确
25、认他的主机安装了nfs-kernel-server软件包。然后修正配置文件/etc/exports,添加下面一行留意*号后面紧跟左括号,无空格,每个逗号后面也不能有空格: /home/akaedu/rootfs *(rw,sync,no_root_squash)这表示他们把上一节中经过解压rootfs-basic.tar得到的/home/akaedu/rootfs/目录设置为nfs效力目录。更改配置后需求重启NFS效力: $ sudo /etc/init.d/nfs-kernel-server restart用rpcinfo -p命令看一下portmapper和nfs效力能否正常启动了,用ex
26、portfs命令看一下导出目录的设置能否正确。 进入开发板的bootloader,修正内核启动参数: AKAE # set bootcmd nand read x kernel x; myboot xAKAE # set bootargs noinitrd console=ttySAC,AKAE # set init /linuxrc AKAE # set nfsroot /home/akaedu/rootfsAKAE # set bootmode nfsAKAE # saveAKAE # reset真正完好的内核启动命令行参数是:noinitrd console=ttySAC, init=/
27、linuxrc root=/dev/nfs nfsroot=.:/home/akaedu/rootfs mtdparts=akae-nand:M(u-boot),M(kernel),M(ext),M(temp) ip=.:.:.:.:eth:off 留意,假设某一项参数很长,而minicom提供的终端却不能自动换行,一行写不下的部分只好盲打了,留意不要打错。假设是图形界面的console,可以把字体调小使得一行可以容得下这么长的参数,或者在gedit写字板程序中写好后直接粘贴到console窗口他们引荐采用这种方法,把经常用到的启动参数都集中写好,以后可以选择对应的参数直接粘贴就好了,非常方便
28、。关于NFS根文件系统的内核启动参数参考内核源代码的Documentation/nfsroot.txt文档。 如今可以本人交叉编译一些小程序,然后拷贝到主机的/rootfs目录,他们可以立刻在开发板上运转该程序,而不需求重新下载和烧写了。 . 配置YAFFS文件系统cramfs是只读文件系统,在Flash上紧缩存储,解压并加载到RAM运转。由于只读因此功能上很受限制,但可以维护系统文件不被不测的写操作损坏。实践产品往往配置两个Flash分区,一个只读分区用于存放系统文件程序文件和库文件,另一个可写分区,采用JFFS或YAFFS文件系统,用于存放运用程序数据,为了简便起见,他们只分一个区,运用可
29、写的YAFFS文件系统。留意,完成这个实验之前先要完成上一节内容,能启动到nfs根文件系统。 首先用NFS方式启动系统。YAFFS文件系统和他们熟习的ext不同,不需求格式化,只需求全部擦除就可以用了。用根文件系统中的flash_eraseall命令擦除root分区并mount上来。以下命令在开发板上执行 # flash_eraseall /dev/mtdErasing Kibyte b - % complete.Skipping bad block at xbcErasing Kibyte dfc - % complete.# mount -t yaffs /dev/mtdblock /mn
30、tyaffs: dev is name is mtdblockyaffs: Attempting MTD mount on ., mtdblockblock is bad# ls /mntlost+foundflash_eraseall命令是从mtd工程 HYPERLINK / 的源代码中交叉编译得来的。 如今可以把根文件系统中的一切文件拷贝到Flash分区。以下命令在开发板上执行: # cp -a bin etc lib linuxrc opt sbin srv tmp usr /mnt/# mkdir -p /mnt/proc /mnt/sys /mnt/dev /mnt/mnt /mnt
31、/var/run# mknod /mnt/dev/console -m c # mknod /mnt/dev/null -m c # umount mnt# reboot留意:像/proc、/sys这样正mount着特殊文件系统的目录和/dev目录下的设备文件一定不可以用cp命令拷贝。/mnt目录显然也不能拷贝。这些目录和设备文件需求手动创建。 重启目的系统之后进入U-boot,修正内核启动参数使之从ext分区启动即可假设下次还用NFS启动,这里就不save了: AKAE # set bootmode nandAKAE # set root /dev/mtdblockAKAE # set bo
32、otargs noinitrd rootfstype=yaffs rw console=ttySAC,AKAE # saveAKAE # reset如今试试能不能修正Flash根文件系统中的文件。 .编译内核将内核释放到/linux-.目录下 $ tar xf linux-.tar.bz进入内核目录: $ cd linux-.本开发板不用修正makefile,打补丁时就会自动修正首先修正Makefile,找到 ARCH ?= $(SUBARCH)CROSS_COMPILE ?=改为 ARCH ?= armCROSS_COMPILE ?= arm-linux-留意ARCH ?=arm后面不能有空
33、格,要确保空格已删除干净,并且不要漏了arm-linux-末尾的“-。下面对内核打patch(留意打patch不要反复打): /linux-.$ patch -p Pseudo filesystems - /proc file system support; Sysctl support (/proc/sys); sysfs file system support 和Virtual memory file system support (former shm fs); Tmpfs POSIX Access control Lists。 /proc file system或者叫procfs是内核
34、提供应用户程序的接口,很多Linux程序都需求在procfs中读写数据,比如busybox,因此这个选项普通是不能少的。Virtual memory file system或者叫tmpfs用于内存虚拟磁盘,后面他们在做根文件系统时要mount一个tmpfs到/dev目录下。 、不需求改动Boot options - Default kernel command string,由于bootloader中的内核启动参数会取代这里的设置。 、选中Device Drivers - Network device support - Ethernet ( or Mbit) - CSA support,添加
35、对网卡芯片的支持。在File systems - Network File Systems菜单中选上NFS client support;NFS client support for NFS version;NFS client support for the NFSv ACL protocol extension和Root file system on NFS。 、选中Device Drivers - Memory Technology Devices (MTD) - MTD partitioning support,在Device Drivers - Memory Technology D
36、evices (MTD),选中NAND Device Support和它下面的NAND Flash support for SC/SC SoC; SC NAND driver debug,不要选择SC NAND Hardware ECC,由于SC硬件生成ECC码的算法和他们所需求的不一致。 、在File systems - Miscellaneous filesystems中选中YAFFS file system support; Auto select yaffs format; cache short names in RAM, 再选上Compressed ROM file system
37、support (cramfs)。 、在Device Drivers - Graphics support中选中Support for frame buffer devices, 再选中它下面的Enable firmware EDID; Enable video Mode Handling Helpers; SC LCD framebuffer support,不选择Virtual Frame Buffer support由于它是一个用于调试的虚拟设备驱动而不是实践硬件的驱动。假设还选中了Bootup Logo,那么在内核启动过程中初始化framebuffer时会在屏幕上看到Linux的企鹅l
38、ogo,这是测试framebuffer驱动能否正常任务最直接的方法。Bootup Logo有三种规格,他们的开发板支持VGA输出,可以选择色的美丽logo。 、在 Device Drivers - USB support中选中Support for Host-side USB,然后选择OHCI HCD support,在Device Drivers - Input device support中选中Mouse interface,设置屏幕分辨率Horizontal screen resolution和Vertical screen resolution为和。 、选中Device Drivers
39、 -Real time clock - Set system time from RTC on startup and resume; /sys/class/rtc/rtcN (sysfs); /proc/driver/rtc (procfs for rtc); /dev/rtcN (character devices); Test driver/device.、假设不希望在/dev目录下生成大量伪终端设备文件,可以取消选择Device Drivers - Character devices - Legacy (BSD) PTY support。 配置完成后用make命令编译内核,这个过程需求
40、较长时间,编译好的内核位于/linux-./arch/arm/boot/zImage。如今将本人编译的内核下载到开发板,看系统能不能正常启动。 .制造根文件系统. 根文件系统框架和busybox首先用mkdir手动创建如下的根本目录构造: $ tree rootfs/rootfs/|- bin|- dev|- etc| |- init.d| - network| |- if-down.d| |- if-post-down.d| |- if-pre-up.d| - if-up.d|- lib|- mnt|- opt|- proc|- sbin|- srv|- sys|- tmp|- usr| |
41、- bin| |- lib| - sbin- var - run/bin /sbin /usr/bin /usr/sbin系统的根本命令,系统关键组件的可执行文件位于/bin和/sbin,其它运用程序的可执行文件位于/usr/bin和/usr/sbin,bin和sbin的区别在于,bin目录下的可执行文件用于日常操作,例如ls、cp,sbin目录下的可执行文件用于管理操作,例如ifconfig,执行管理操作通常需求root权限 /lib /usr/lib共享库,也是分为系统关键组件的共享库和其它运用程序的共享库 /procproc文件系统的挂载点 /syssys文件系统的挂载点 /dev设备文
42、件 /etc配置文件、启动脚本 /var运转时产生的记录文件、锁文件、日志文件 /tmp运转时产生的暂时文件 /mnt普通用作挂载点 /opt普通存放第三方软件 /srv普通用作Web效力、ftp效力的效力目录 接下来安装busybox到根文件系统中。busybox是专为嵌入式Linux设计的,它把大多数常用命令如ls、cp、tar等等的常用选项剪裁出来拼在一同。在根文件系统中只需一个可执行文件就是/bin/busybox,而其它的命令都创建为/bin/busybox的链接文件,busybox 经过命令行第个参数也就是命令名判别应该执行哪个命令。这样使得嵌入式Linux系统有完好的命令集却占用
43、很小的存储空间。 首先从官方网站 HYPERLINK / 下载源码包busybox-.tar.bz并解包到主目录下。 $ tar xf busybox-.tar.bz; cd busybox-./busybox的配置系统和内核源代码很类似,因此配置方法也和内核类似,首先修正Makefile,找到 ARCH ?= $(SUBARCH)CROSS_COMPILE ?=改为 ARCH ?= armCROSS_COMPILE ?= arm-linux-然后他们以一个缺省配置为起点来做进一步的配置: /busybox-.$ make defconfig/busybox-.$ make menuconfi
44、g在菜单中做如下配置: 选择BusyBox Settings - Installation Options - BusyBox installation prefix,设置为/home/akaedu/rootfs,编译后将安装到这个目录下。 根据需求裁剪各命令。但是Shells - Choose your default shell选项一定要保管一个默许shell例如ash,假设没有默许shell,将不会创建/bin/sh这个链接,而普通的shell脚本都是以#!/bin/sh开头的,假设找不到/bin/sh就不能执行。 然后编译和安装busybox: /busybox-.$ make/bus
45、ybox-.$ make installbusybox文件和一系列的链接文件将安装到/home/akaedu/rootfs下。busybox文件位于根文件系统的/bin目录,其它链接文件位于/bin、/sbin、/usr/bin、/usr/sbin目录,有一个链接文件linuxrc位于根文件系统的根目录/,它是系统的启动程序,bootloader中内核的启动参数有init=/linuxrc,也就是说内核启动后首先执行/linuxrc也是busybox的一个符号链接。linuxrc担任完成系统的初始化任务: 设置信号处置程序 初始化console 解析/etc/inittab文件 执行系统初始化
46、脚本,缺省的是/etc/init.d/rcS 执行inittab中类型为wait的程序 执行inittab中类型为once的程序 上述步骤完成后系统启动完成,以后init程序将循环执行以下步骤: 执行inittab中类型为respawn的程序,假设所执行的程序终止,那么再次执行它 假设收到用户恳求,那么执行inittab中类型为askfirst的程序 linuxrc需求读取设备文件/dev/console和/dev/null,他们手动创建这些设备文件: $ cd rootfs/dev; sudo mknod -m console c ; sudo mknod -m null c 留意,创建设备
47、文件需求root权限,常见设备文件的设备号可以从内核代码的Documentation/devices.txt文件中查到。 然后创建一个启动配置文件/rootfs/etc/inittab: :sysinit:/etc/init.d/rcS:respawn:/sbin/getty sc_serial:restart:/sbin/init:shutdown:/bin/umount -a -r启动的过程中首先执行rcS启动脚本,他们创建这个脚本/rootfs/etc/init.d/rcS: #!/bin/shmount -a留意这个脚本需求加可执行权限:chmod +x rcS。这个脚本做了一件事情,
48、根据/etc/fstab配置文件提供的信息mount一些文件系统,他们创建这个配置文件/rootfs/etc/fstab: # proc /proc proc defaults sys /sys sysfs defaults /proc和/sys都是pseudo文件系统,它们并不在磁盘或flash上存储任何数据,虽然看起来/proc和/sys目录下有很多文件,但这些文件都是内核导出的接口,对这些文件进展读写会读写到内核中的一些运转时参数,而不会读写到磁盘。/proc文件系统是busybox中的许多程序所需求的接口,/sys文件系统那么是后面要讲的mdev所需求的接口。 mount完文件系统后,
49、rcS执行终了。下面将执行inittab文件中类型为respawn的命令,也就是 /sbin/getty sc_serial他们的PC在启动时执行getty翻开几个虚终端,例如/dev/tty/dev/tty,嵌入式开发板也是用getty翻开虚终端,这个虚终端对应的是串口,因此需求访问串口的设备文件/dev/sc_serial,以上命令还指定了波特率为。如今他们创建这个设备文件: $ cd rootfs/dev; sudo mknod -m sc_serial c 这个设备号在内核代码的Documentation/arm/Samsung-SCXX/Overview.txt中可以查到,在内核代码
50、中,SC的第一个串口表示为ttySAC,但是后面引见的mdev程序将运用sc_serial这个名字,因此这里把文件名指定为sc_serial。 系统启动翻开虚终端后会提示输入用户名和密码然后才启动shell,他们需求创建帐号文件passwd和group。/rootfs/etc/passwd文件内容为: root:root:/:/bin/sh/rootfs/etc/group文件内容为: root:这样就创建了一个root帐号,没有密码。假设需求密码,可以把主机上的/etc/shadow文件中root帐号的那一行放到开发板的根文件系统中。 . glibc由于busybox需求glibc共享库的支
51、持,下面的步骤将在根文件系统中安装glibc。在此之前首先解释一下运用程序如何找到所需的共享库。经过ld命令的参数-rpath可以在链接时将共享库的途径记在运用程序中,但是通常不引荐这样做,通常运用程序中只记录共享库的文件名稍后提到的soname,启动程序时由动态链接器/lib/ld-linux.so根据以下规那么查找共享库摘自ld.so(): 首先在环境变量LD_LIBRARY_PATH所记录的途径中查找 然后从缓存文件/etc/ld.so.cache中查找。将共享库的途径写进/etc/ld.so.conf然后执行ldconfig命令就可以生成缓存文件/etc/ld.so.cache 假设上
52、述步骤都找不到,那么到默许的系统途径中查找,先是/usr/lib然后是/lib 留意,LD_LIBRARY_PATH是不引荐运用的,尽量不要把它设定为环境变量,详细解释参见Why LD_LIBRARY_PATH is bad HYPERLINK visi/barr/ldpath.htmlvisi/barr/ldpath.html 。 每个共享库有三个文件名:real name、soname、linker name。real name是库文件的名字,包含完好的共享库版本号;soname是库文件的一个符号链接的名字,只包含主版本号,主版本号一致即可保证库函数的接口一致,因此运用程序只需确认sona
53、me与所需的共享库一致;linker name仅由链接器运用,有的是库文件的一个符号链接的名字,有的是一段链接脚本的名字。库文件的文件头记录了soname,因此ldconfig命令可以读取文件头生成相应的符号链接文件。综上,ldconfig命令读取ld.so.conf后做两件事,一是创建适当的soname链接,二是生成ld.so.cache,包含共享库的软件包在安装过程中都会执行一下ldconfig命令。下面以libc为例阐明共享库的三个文件名: -rwxr-xr-x akaedu akaedu - : libc-.solrwxrwxrwx akaedu akaedu - : libc.so.
54、 - libc-.so-rw-r-r- akaedu akaedu - : libc.so$ cat libc.so/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */OUTPUT_FORMAT(elf-littlearm)GROUP ( libc.so. libc_nonshared.a )在他们先前制造交叉编译工具链时曾经交叉编译了glibc,位于/opt/crosstool/gcc-.-glibc-./a
55、rm-linux/arm-linux/lib目录下,他们把这些共享库拷到根文件系统/rootfs/lib目录下: $ cd /opt/crosstool/gcc-.-glibc-./arm-linux/arm-linux/lib; cp -dp * /home/akaedu/rootfs/lib/然后到/rootfs/lib目录下删掉一切静态库和一些不常用的库,剩下这些库文件: /rootfs/lib$ lsld-.so libm.so. libpcprofile.sold-linux.so. libnsl-.so libpthread-.solibanl-.so libnsl.so libp
56、thread.solibanl.so libnsl.so. libpthread.so.libanl.so. libnss_compat-.so libresolv-.solibBrokenLocale-.so libnss_compat.so libresolv.solibBrokenLocale.so libnss_compat.so. libresolv.so.libBrokenLocale.so. libnss_dns-.so librt-.solibc-.so libnss_dns.so librt.solibcrypt-.so libnss_dns.so. librt.so.lib
57、crypt.so libnss_files-.so libSegFault.solibcrypt.so. libnss_files.so libstdc+.solibc.so libnss_files.so. libstdc+.so.libc.so. libnss_hesiod-.so libstdc+.so.libdl-.so libnss_hesiod.so libthread_db-.solibdl.so libnss_hesiod.so. libthread_db.solibdl.so. libnss_nis-.so libthread_db.so.libgcc_s.so libnss
58、_nisplus-.so libutil-.solibgcc_s.so. libnss_nisplus.so libutil.solibm-.so libnss_nisplus.so. libutil.so.libmemusage.so libnss_nis.solibm.so libnss_nis.so.ldconfig是很常用的一个命令,假设某些程序把共享库安装到非规范目录/lib和/usr/lib,那么需求执行ldconfig更新缓存文件/etc/ld.so.cache,比如后面安装Qtopia Core时就会用到。但是busybox不包含ldconfig命令,由于它和glibc亲密相关,是随glibc一同发布的,先前他们制造交叉编译工具链时曾经生成了ldconfig,如今把它拷到根文件系统: $ cp crosstool-./build/arm-linux/gcc-.-glibc-./build-glibc/elf/ldconfig rootfs/sbin/如今经过NFS启动开发板,应该可以胜利启动到shell了。 . mdev先前他们在根文件系统的/dev目录下手动创建了三个设备文件:console、null和sc_serial
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026山东潍坊市诸城市市属国有企业招聘11人笔试历年参考题库附带答案详解
- 2026新疆兵团建工集团西南事业部招竞聘21人笔试历年典型考点题库附带答案详解
- 2026山东济南文旅发展集团有限公司招聘2人笔试历年典型考点题库附带答案详解
- 2026云天化集团高层次人才校园招聘(若干)笔试历年参考题库附带答案详解
- 2026四川成都文化旅游发展集团有限责任公司下属企业招聘管理会计岗等岗位2人笔试历年典型考点题库附带答案详解
- 2026中国石化销售股份有限公司陕西西安石油分公司招聘笔试历年参考题库附带答案详解
- 2025黑龙江省建设投资集团有限公司面向系统内部及社会招聘12人笔试历年参考题库附带答案详解
- 2025江西江新造船有限公司招聘70人笔试历年常考点试题专练附带答案详解
- 2025重庆轨道交通4号线招聘132人笔试历年参考题库附带答案详解
- 2025四川雅安市交通建设(集团)有限责任公司拟聘用子公司工作人员(第一批)笔试历年常考点试题专练附带答案详解
- 石油钻井井电方案
- 消防安全评估投标方案
- 三对三篮球赛记录表
- 货运驾驶员安全管理制度
- 四川省省属事业单位考试《综合知识》复习大纲考试笔试高频考点题库附答案解析
- 2023年冯晓强策略班课堂笔记
- GB/T 14561-2019消火栓箱
- 生态环境规划-课件
- 态度在民航服务工作中的运用课件
- 果树学实验-主要果实类型与构造认识解答课件
- 山东省青岛市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
评论
0/150
提交评论