构建嵌入式linux系统.doc
《构建嵌入式linux系统.doc》由会员分享,可在线阅读,更多相关《构建嵌入式linux系统.doc(19页珍藏版)》请在咨信网上搜索。
专业的嵌入式技术研发、推广、培训、认证机构 构建嵌入式Linux系统 1.获取本实验相关的软件包 到ftp下载以下软件包: 文件名 备注 binutils-2.16.1.tar.bz2 gcc-4.0.2.tar.bz2 glibc-2.3.6.tar.bz2 glibc-linuxthreads-2.3.6.tar.bz2 linux-2.6.15.4.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2 制作交叉编译工具链所需的源码包 crosstool-0.43.tar.gz 制作交叉编译工具链的脚本和补丁 crosstool.tar.bz2 已制作好的交叉编译工具链,需要解包到/opt目录使用 linux-2.6.17.14.tar.bz2 内核2.6.17.14 patch-2.6.17.14-aka 针对2410开发板制作的内核patch zImage 已编译好的内核,可直接下载到开发板 rootfs-basic.tar 基本根文件系统打包,由于有设备文件,所以解包需要root权限 rootfs-basic.cramfs 采用cramfs文件系统格式的基本根文件系统映像,可直接下载到开发板 busybox-1.9.1.tar.bz2 busybox源码包,嵌入式根文件系统基本命令集 sqlite-3.4.0.tar.gz sqlite源码包,嵌入式数据库 libcgi-1.0.tar.gz libcgi源码包,用于编写CGI程序的C函数库 qtopia-core-opensource-src-4.2.2.tar.gz Qtopia Core源码包,Qt的嵌入式版本 2.制作交叉编译工具链 要做嵌入式Linux开发,首先需要有交叉编译工具链(cross compiling toolchain),也就是在主机(x86 PC)上可编译生成目标板可执行文件(ARM指令)的编译工具。和普通的编译工具链一样,交叉编译工具链也包括编译、链接、修改目标文件的各种程序,如gcc、glibc、ld、gas、objdump、readelf等等。交叉编译工具链本身也是需要编译生成的,要得到一套完整的交叉编译工具链需要编译以下源码包: § binutils § gcc § glibc § linux(内核) § linux-libc-headers § glibc-linuxthreads 这些源码包具有非常强的版本依赖关系,如果源码包的版本不匹配,在编译过程中会出现各种各样的问题,有些问题需要对源码做些修改或者打补丁,有些问题则是没有解决办法的,只能更换匹配较好的版本。编译的步骤也是比较复杂的,主要有以下几步: 1. 根据目标平台配置内核源代码,生成内核头文件 2. 编译binutils 3. 编译器的自举(bootstrap),也就是先编译出gcc的部分功能(没有glibc支持,只有C编译器没有C++编译器) 4. 编译glibc 5. 编译完整的gcc 幸运的是,已经有人写出了制作交叉编译器的脚本( ),该脚本中提供了一系列源码包版本的匹配方案,使用者需要选择目标平台和源码包的版本匹配方案,执行该脚本会自动从官方网站( http://www.gnu.org/ 和 http://www.kernel.org/ )下载源代码,自动打补丁,然后自动完成所有的编译步骤。 首先从 下载crosstool-0.43.tar.gz,在主目录下解包 ~$ tar xf crosstool-0.43.tar.gz; cd crosstool-0.43 现在选择一种源码包的版本组合,各种版本组合的兼容性可以参考 ,在此我们选择在arm平台上glibc版本较高,兼容性较好的一个组合: § gcc-4.0.2 § cgcc-4.0.2 § glibc-2.3.6 § binutils-2.16.1 § linux-2.6.15.4 § hdrs-2.6.12.0 修改crosstool-0.43目录下的脚本demo-arm.sh,取消这一行开头的#号注释符: #eval `cat arm.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest 同时将原本没有注释的这一行注释掉(前面加#号): eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest 注意该脚本开头有 TARBALLS_DIR=$HOME/downloads RESULT_TOP=/opt/crosstool 这说明,该脚本运行时,自动从 http://www.gnu.org/ 和 http://www.kernel.org/ 下载相关的源码包到主目录的downloads目录下,如果你已经下载过这些源码包,将它们拷到downloads目录下就可以不必再次下载了。对应于我们选择的版本组合,downloads目录下的源码包有: § binutils-2.16.1.tar.bz2 § gcc-4.0.2.tar.bz2 § glibc-2.3.6.tar.bz2 § glibc-linuxthreads-2.3.6.tar.bz2 § linux-2.6.15.4.tar.bz2 § linux-libc-headers-2.6.12.0.tar.bz2 整个编译结束后,交叉编译工具链将放在/opt/crosstool目录下,因此脚本需要在/opt下建子目录,如果不希望使用root权限运行该脚本,则需要事先给/opt目录设置写权限: ~$ sudo chmod a+w /opt 然后修改arm.dat,其中有 TARGET=arm-unknown-linux-gnu 这是按标准的命名规则为工具链命名的,但是通常我们都采用更简单的命名,很多软件的Makefile中交叉编译器默认也都采用简单的命名,为此我们把它改为TARGET=arm-linux。 由于编译过程需要用到patch、bison、flex,确认你的系统中安装了这些软件包。 在编译过程中可能还会遇到脚本的兼容性问题,如果你的Linux发行版将sh指向dash(例如Ubuntu),应将其改指向bash: $ cd /bin $ sudo ln -sf bash sh 虽然用dash执行脚本时非常高效并且其实现完全遵守POSIX标准,然而现存的很多脚本(比如glibc中的脚本)有不符合POSIX标准的用法,所以仍需改用bash执行。 准备就绪后,在crosstool-0.43目录下运行demo-arm.sh脚本开始编译。编译完成后,交叉编译工具链的可执行文件位于/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin目录,我们可以把这个路径添加到PATH环境变量中,例如将以下命令添加到~/.bashrc启动脚本: export PATH=$PATH:/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin 此外,网上也可下载到已编译好的交叉编译工具链,比如 http://www.snapgear.org/snapgear/downloads.html ,但是使用别人编译好的交叉编译工具链有很多限制,不能按自己的特殊需要对其定制,比如有些项目需要特定版本的gcc和glibc,再比如需要soft-float的编译器(生成指令模拟浮点数运算)。 以上编译步骤需要很长时间,也可以直接从ftp下载已制作好的交叉编译工具链安装到主机: ~$ sudo chmod a+w /opt ~$ tar xf crosstool.tar.bz2 -C /opt 然后在~/.bashrc启动脚本中修改PATH环境变量。 3.熟悉开发环境 3.1 下载内核和根文件系统到开发板 连接好开发板的网线和串口线,启动minicom(配置成115200 8N1,无Flow Control)。按下开发板电源,立刻按除回车以外的任意键,进入bootloader提示符vivi>。如果没来及按键就已经启动了内核,可以按开发板上的RESET键重来。 注意:vivi的终端不能处理控制字符,不要用移动光标键或翻页键等,退格键可以用。按了产生控制字符的键再输入命令就会产生错乱,这时可以按下回车输入当前这条已经错乱的命令,然后在新的提示符下重新键入命令。 输入以下命令显示bootloader的参数。 vivi> para show ...... ip : 192.168.0.15 host : 192.168.0.1 gw : 192.168.0.1 mask : 255.255.255.0 ...... 开发板的IP地址是192.168.0.15,并且认为与之通讯的主机IP是192.168.0.1。根据你的情况重新设置。比如: vivi> para set ip "192.168.1.25" vivi> para set host "192.168.1.125" (这一项应该和你的主机IP一致) vivi> para set gw "192.168.1.125" vivi> para save para save将这些设定写入flash中,下次开发板上电时仍然有效。如果不save则仅改变内存中的参数值,reset后会恢复flash中原来的参数值。 在开发板bootloader输入以下命令查看64M flash是如何分区的。 vivi> part show mtdpart info. (6 partitions) name offset size flag ------------------------------------------------ vivi : 0x00000000 0x00020000 0 128k param : 0x00020000 0x00010000 0 64k kernel : 0x00030000 0x001c0000 0 1M+768k root : 0x00200000 0x00400000 0 4M usr : 0x00600000 0x03a00000 0 58M vivi分区保存bootloader程序,而这个分区表本身以及刚才用para show显示的参数是保存在param分区的。我们要把内核下载到kernel分区,把根文件系统下载到root分区。 可以使用part add和part del命令添加删除分区: vivi> part del usr deleted 'usr' partition vivi> part del root deleted 'root' partition vivi> part add root 0x00200000 0x03e00000 0 root: offset = 0x00200000, size = 0x03e00000, flag = 0 vivi> part show mtdpart info. (6 partitions) name offset size flag ------------------------------------------------ vivi : 0x00000000 0x00020000 0 128k param : 0x00020000 0x00010000 0 64k kernel : 0x00030000 0x001c0000 0 1M+768k root : 0x00200000 0x03e00000 0 62M 如果要保存新的分区表,使用命令part save保存到flash中,否则reset后将恢复flash中原来的分区表。 下载文件到开发板需要通过tftp协议。开发板是tftp服务器,主机是tftp客户端。主机上的tftp客户端程序推荐安装atftp软件包,atftp可以通过命令行参数指定服务器地址和要传送的文件路径,这样可以把传输命令写到一个脚本中重复使用。 在开发板上执行如下命令启动tftp服务器,等待主机发送kernel。 vivi> load flash kernel t 现在开发板的网络被启用,从主机上应该可以ping通开发板了。在主机上执行如下命令将已编译好的kernel映像下载到开发板: ~$ atftp -l ./zImage -p 192.168.1.25 (这里换成你设置的开发板IP) ftp上的rootfs-basic.cramfs是已经做好的根文件系统映像。将其下载到开发板。 vivi> load flash root t ~$ atftp -l rootfs-basic.cramfs -p 192.168.1.25 在启动之前还要修改内核启动参数。 vivi> para set linux_cmd_line "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0" vivi> para save 现在启动。 vivi> boot 这时屏幕上出现很多内核启动信息,待framebuffer驱动加载之后,与开发板相连的显示器上(注意不是minicom终端的显示器)会出现企鹅logo。之后提示登录,输入root即可登录。 (none) login: root 现在可以试试各种Linux基本命令。注意cramfs是只读文件系统,在开发板上运行时不能改动里面的文件。 3.2 将自己定制的根文件系统下载到开发板运行 “根文件系统”是一种不严格的说法,其实是指文件系统中的文件和目录,这些文件和目录构成了一个Linux系统运行所需的基本框架。ftp上的rootfs-basic.tar是根文件系统的打包,由于包含设备文件,需要root权限才能解包: ~$ sudo tar xf rootfs-basic.tar 解包后可以根据自己的需要修改其中的目录和文件,然后将根文件系统目录制作成cramfs映像再下到开发板运行,这样就达到了修改根文件系统中的目的。 首先确认你的主机上安装了软件包cramfsprogs,然后制作cramfs文件系统映像: ~$ mkcramfs ~/rootfs rootfs.cramfs 然后按照前面的步骤把rootfs.cramfs下载到开发板的root分区,运行一下试试。 3.3 设置开发板的启动方式为NFS Root 基本思想是:在主机上开NFS服务器,把主机上的~/rootfs目录导出为NFS服务目录,使开发板一启动就自动加载主机的~/rootfs目录为根文件系统,省去了下载和烧写映像的麻烦,在主机上修改根文件系统中的文件立刻在开发板的系统上生效,在开发过程中十分便利。 首先在主机上安装和配置NFS服务,确认你的主机安装了nfs-kernel-server软件包。然后修改配置文件/etc/exports,添加下面一行(注意*号后面紧跟左括号,无空格,每个逗号后面也不能有空格): /home/akaedu/rootfs *(rw,sync,no_root_squash) 更改配置后需要重启NFS服务: ~$ sudo /etc/init.d/nfs-kernel-server restart 用rpcinfo -p命令看一下portmapper和nfs服务是否正常启动了,用exportfs命令看一下导出目录的设置是否正确。 进入开发板的bootloader,修改内核启动参数: vivi> para set linux_cmd_line "noinitrd root=/dev/nfs rw ip=192.168.1.25:192.168.1.125::255.255.255.0:::off nfsroot=/home/akaedu/rootfs init=/linuxrc console=ttySAC0" vivi> para save 注意,NFS Root方式的内核启动参数很长,而vivi提供的终端却不能自动换行,一行写不下的部分只好盲打了,注意不要打错,不要漏了末尾的"号。如果是图形界面的console,可以把字体调小使得一行可以容得下这么长的参数,或者在别处写好后直接粘贴到console窗口。关于NFS根文件系统的内核启动参数参考内核源代码的Documentation/nfsroot.txt文档。 现在可以自己交叉编译一些小程序,然后拷贝到主机的~/rootfs目录,我们可以立刻在开发板上运行该程序,而不需要重新下载和烧写了。 3.4 配置YAFFS文件系统 cramfs是只读文件系统,在Flash上压缩存储,解压并加载到RAM运行。由于只读因而功能上很受限制,但可以保护系统文件不被意外的写操作损坏。实际产品往往配置两个Flash分区,一个只读分区用于存放系统文件(程序文件和库文件),另一个可写分区,采用JFFS或YAFFS文件系统,用于存放应用程序数据,为了简便起见,我们只分一个区,使用可写的YAFFS文件系统。 首先用NFS方式启动系统。YAFFS文件系统和我们熟悉的ext2不同,不需要格式化,只需要全部擦除就可以用了。用根文件系统中的flash_eraseall命令擦除root分区并mount上来。以下命令在开发板上执行 # flash_eraseall /dev/mtd3 Erasing 16 Kibyte @ 6b8000 -- 10 % complete. Skipping bad block at 0x006bc000 Erasing 16 Kibyte @ 3dfc000 -- 99 % complete. # mount -t yaffs /dev/mtdblock3 /mnt yaffs: dev is 32505859 name is "mtdblock3" yaffs: Attempting MTD mount on 31.3, "mtdblock3" block 432 is bad # ls /mnt lost+found flash_eraseall命令是从mtd项目( http://www.linux-mtd.infradead.org/ )的源代码中交叉编译得来的。 现在可以把根文件系统中的所有文件拷贝到Flash分区。以下命令在开发板上执行: # cp -a bin etc lib linuxrc opt sbin srv tmp usr /mnt/ # mkdir -p /mnt/proc /mnt/sys /mnt/dev /mnt/mnt /mnt/var/run # mknod /mnt/dev/console -m 600 c 5 1 # mknod /mnt/dev/null -m 666 c 1 3 # umount mnt # reboot 注意:像/proc、/sys这样正mount着特殊文件系统的目录和/dev目录下的设备文件一定不可以用cp命令拷贝。/mnt目录显然也不能拷贝。这些目录和设备文件需要手动创建。 重启目标系统之后进入vivi,修改内核启动参数使之从root分区启动即可(如果下次还用NFS启动,这里就不para save了): vivi> para set linux_cmd_line "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0" vivi> boot 现在试试能不能修改Flash根文件系统中的文件。 4.编译内核 将内核释放到~/linux-2.6.17.14目录下 ~$ tar xf linux-2.6.17.14.tar.bz2 进入内核目录: ~$ cd linux-2.6.17.14 首先修改Makefile,找到 ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 改为 ARCH ?= arm CROSS_COMPILE ?= arm-linux- 注意不要漏了arm-linux-末尾的“-”。下面对内核打patch: ~/linux-2.6.17.14$ patch -p1 < ../patch-2.6.17.14-aka 然后以内核源代码自带的smdk2410基本配置文件为基础,使用menuconfig定制内核(确认你的主机安装了libncurses-dev软件包)。 ~/linux-2.6.17.14$ cp arch/arm/configs/smdk2410_defconfig .config ~/linux-2.6.17.14$ make menuconfig 查看配置菜单中的如下选项(有些已经默认选中): 1、在Floating point emulation中选择NWFPE math emulation。由于ARM920T没有浮点协处理器,浮点数指令需要用其它指令仿真实现。 有两种方法可以仿真浮点指令:一种方法如先前所说的,使交叉编译器支持soft-float,也就是一遇到C代码里的浮点运算就自动生成仿真指令,另一种方法是交叉编译器仍然生成浮点运算指令(对于ARM平台是指协处理器指令),然而ARM920T没有浮点协处理器,无法识别浮点指令,因而产生undefined异常,这个Floating point emulation内核选项就是在undefined异常的处理函数中仿真实现浮点运算。也就是说,这里我们使用非soft-float的交叉编译器并在内核中实现浮点仿真。这样的运行效率比使用soft-float编译要低,因为每次浮点运算都需要处理异常和进入内核,但是兼容性好,便于我们利用别人已编译好的程序。 2、选中File systems -> Pseudo filesystems -> /proc file system support和Virtual memory file system support (former shm fs)。/proc file system(或者叫procfs)是内核提供给用户程序的接口,很多Linux程序都需要在procfs中读写数据,比如busybox,因此这个选项一般是不能少的。Virtual memory file system(或者叫tmpfs)用于内存虚拟磁盘,后面我们在做根文件系统时要mount一个tmpfs到/dev目录下。 3、不需要改变Boot options -> Default kernel command string,因为bootloader中的内核启动参数会取代这里的设置。 4、选中Device Drivers -> Network device support -> Ethernet (10 or 100Mbit) -> CS8900 support,添加对网卡芯片的支持。在File systems -> Network File Systems菜单中选上NFS file system support和Root file system on NFS。 5、选中Device Drivers -> Memory Technology Devices (MTD) -> MTD partitioning support,在Device Drivers -> Memory Technology Devices (MTD) -> NAND Flash Device Drivers中,选中NAND Device Support和NAND Flash support for S3C2410/S3C2440 SoC,不要选择S3C2410 NAND Hardware ECC,因为S3C2410硬件生成ECC码的算法和我们所需要的不一致。 在File systems -> Miscellaneous filesystems中选中YAFFS2 file system support,然后选择Lets Yaffs do its own ECC和Use the same ecc byte order as Steven Hill's nand_ecc.c。再选上Compressed ROM file system support (cramfs)。 NAND芯片将存储空间划分为块(block),每个块再划分为页(page)。每一页分为常规数据和带外数据(out-of-band data,OOB)。带外数据用于保存ECC(纠错码,Error-Correction Code)和坏块信息等。NAND闪存和NOR闪存一样有三种基本操作:读、擦除和写。与NOR闪存不同的是,NOR闪存可以随机访问数据,而NAND闪存只能以页为单位读和写,以块为单位擦除。有三种方式可以计算生成ECC数据:由MTD子系统生成、由YAFFS文件系统生成、由芯片中专门的硬件生成。生成ECC和读取ECC进行校验的算法必须一致,否则会认为校验失败。这里我们在patch代码中让YAFFS文件系统生成ECC码,因而不用硬件生成的ECC码。 6、在Device Drivers -> Graphics support中选中S3C2410 LCD framebuffer support,不选择Virtual Frame Buffer support因为它是一个用于调试的虚拟设备驱动而不是实际硬件的驱动。如果还选中了Logo configuration -> Bootup Logo,那么在内核启动过程中初始化framebuffer时会在屏幕上看到Linux的企鹅logo,这是测试framebuffer驱动是否正常工作最直接的方法。Bootup Logo有三种规格,我们的开发板支持VGA输出,可以选择224色的漂亮logo。 7、在 Device Drivers -> USB support中选中Support for Host-side USB,然后选择OHCI HCD support和USB HID Boot Protocol drivers -> USB HIDBP Mouse (simple Boot) support,在Device Drivers -> Input device support中选中Mouse,设置屏幕分辨率Horizontal screen resolution和Vertical screen resolution为640和480。 8、选中Device Drivers -> Character devices -> S3C2410 RTC Driver。 9、如果不希望在/dev目录下生成大量伪终端设备文件,可以取消选择Device Drivers -> Character devices -> Legacy (BSD) PTY support。 配置完成后用make命令编译内核,这个过程需要较长时间,编译好的内核位于~/linux-2.6.17.14/arch/arm/boot/zImage。现在将自己编译的内核下载到开发板,看系统能不能正常启动。 5.制作根文件系统 5.1 根文件系统框架和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 | |-- 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 共享库,也是分为系统关键组件的共享库和其它应用程序的共享库 /proc proc文件系统的挂载点 /sys sys文件系统的挂载点 /dev 设备文件 /etc 配置文件、启动脚本 /var 运行时产生的记录文件、锁文件、日志文件 /tmp 运行时产生的临时文件 /mnt 一般用作挂载点 /opt 一般存放第三方软件 /srv 一般用作Web服务、ftp服务的服务目录 接下来安装busybox到根文件系统中。busybox是专为嵌入式Linux设计的,它把大多数常用命令(如ls、cp、tar等等)的常用选项剪裁出来拼在一起。在根文件系统中只有一个可执行文件就是/bin/busybox,而其它的命令都创建为/bin/busybox的链接文件,busybox 通过命令行第0个参数(也就是命令名)判断应该执行哪个命令。这样使得嵌入式Linux系统有完整的命令集却占用很小的存储空间。 首先从官方网站 下载源码包busybox-1.9.1.tar.bz2并解包到主目录下。 ~$ tar xf busybox-1.9.1.tar.bz2; cd busybox-1.9.1/ busybox的配置系统和内核源代码很相似,因此配置方法也和内核相似,首先修改Makefile,找到 ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 改为 ARCH ?= arm CROSS_COMPILE ?= arm-linux- 然后我们以一个缺省配置为起点来做进一步的配置: ~/busybox-1.9.1$ make defconfig ~/busybox-1.9.1$ make menuconfig 在菜单中做如下配置: § 选择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-1.9.1$ make ~/busybox-1.9.1$ make install busybox文件和一系列的链接文件将安装到/home/user/rootfs下。busybox文件位于根文件系统的/bin目录,其它链接文件位于/bin、/sbin、/usr/bin、/usr/sbin目录,有一个链接文件linuxrc位于根文件系统的根目录/,它是系统的启动程序,bootloader中内核的启动参数有init=/linuxrc,也就是说内核启动后首先执行/linuxrc(也是busybox的一个符号链接)。linuxrc负责完成系统的初始化工作: 1. 设置信号处理程序 2. 初始化console 3. 解析/etc/inittab文件 4. 执行系统初始化脚本,缺省的是/etc/init.d/rcS 5. 执行inittab中类型为wait的程序 6. 执行inittab中类型为once的程序 上述步骤完成后系统启动完成,此后init程序将循环执行以下步骤: 1. 执行inittab中类型为respawn的程序,如果所执行的程序终止,则再次执行它 2. 如果收到用户请求,则执行inittab中类型为askfirst的程序 linuxrc需要读取设备文件/dev/console和/dev/null,我们手动创建这些设备文件: ~$ cd rootfs/dev; sudo mknod -m 600 console c 5 1; sudo mknod -m 666 null c 1 3 注意,创建设备文件需要root权限,常见设备文件的设备号可以从内核代码的Documentation/devices.txt文件中查到。 然后创建一个启动配置文件~/rootfs/etc/inittab: ::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty 115200 s3c2410_serial0 ::restart:/sbin/init ::shutdown:/bin/umount -a -r 启动的过程中首先执行rcS启动脚本,我们创建这个脚本~/rootfs/etc/init.d/rcS: #!/bin/sh mount -a 注意这个脚本需要加可执行权限:chmod +x rcS。这个脚本做了一件事情,根据/etc/fstab配置文件提供的信息mount一些文件系统,我们创建这个配置文件~/rootfs/etc/fstab: # <file name> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 sys /sys sysfs defaults 0 0 /proc和/sys都是- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 构建 嵌入式 linux 系统
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文