欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年miniroot_qtopia文件系统启动过程分析 .pdf

    • 资源ID:32512423       资源大小:80.21KB        全文页数:9页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年miniroot_qtopia文件系统启动过程分析 .pdf

    mini2440 root_qtopia 文件系统启动过程分析2010-03-29 15:24 对于 mini2440 最新的 root_qtopia文件系统启动过程,我在这里做了一些简单的分析,和大家分享一下经验,不足之处也请大家及时指出。其实, 虽然 root_qtopia 这个文件系统的GUI 是基于 Qtopia 的,但其初始化启动过程却是由大部分由 busybox 完成, Qtopia (qpe)只是在启动的最后阶段被开启。由于默认的内核命令行上有init=/linuxrc,因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc 。 这是一个指向 /bin/busybox 的链接,也就是说,系统起来后运行的第一个程序也就是busybox 本身。这种情况下, busybox 首先将试图解析/etc/inittab 来获取进一步的初始化配置信息(参考 busybox源代码 init/init.c 中的 parse_inittab() 函数)。而事实上, root_qtopia 中并没有 /etc/inittab 这个配置文件,根据busybox 的逻辑,它将生成默认的配置复制代码static void parse_inittab(void)#if ENABLE_FEATURE_USE_INITTABchar *token4;parser_t *parser = config_open2(/etc/inittab,fopen_for_read);if (parser = NULL)#endif/* No inittab file - set up some default behavior */* Reboot on Ctrl-Alt-Del*/new_init_action(CTRLALTDEL,reboot, );/* Umount all filesystems on halt/reboot */new_init_action(SHUTDOWN,umount -a -r, );/* Swapoff on halt/reboot */if (ENABLE_SWAPONOFF)new_init_action(SHUTDOWN,swapoff -a, );/* Prepareto restart init when a QUIT is received */new_init_action(RESTART,init, );/* Askfirst shell on tty1-4 */new_init_action(ASKFIRST,bb_default_login_shell, );/TODO: VC_1 insteadof ? is console - ctty problems - angry usersnew_init_action(ASKFIRST,bb_default_login_shell, VC_2);new_init_action(ASKFIRST,bb_default_login_shell, VC_3);new_init_action(ASKFIRST,bb_default_login_shell, VC_4);/* sysinit */new_init_action(SYSINIT,INIT_SCRIPT, );return;其中,最重要的一个,就是new_init_action(SYSINIT,INIT_SCRIPT, ) , 也就决定了接下去初始化的脚本是INIT_SCRIPT 所定义的值。这个宏的默认值是/etc/init.d/rcS.下面是文件系统中/etc/init.d/rcS 的内容 , 也是我们要分析的重点复制代码#! /bin/sh名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:runlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel# Trap CTRL-C &c only in this shell so wecan interrupt subprocesses.#trap : INT QUIT TSTP/bin/hostname FriendlyARM/bin/mount -n -t proc none/proc/bin/mount -n -t sysfsnone /sys/bin/mount -n -t usbfs none /proc/bus/usb/bin/mount -t ramfs none /devecho /sbin/mdev /proc/sys/kernel/hotplug/sbin/mdev -s/bin/hotplug# mounting file system specified in /etc/fstabmkdir -p /dev/ptsmkdir -p /dev/shm/bin/mount -n -t devpts none /dev/pts -o mode=0622/bin/mount -n -t tmpfs tmpfs /dev/shm/bin/mount -n -t ramfs none/tmp/bin/mount -n -t ramfs none/varmkdir -p /var/emptymkdir -p /var/logmkdir -p /var/lockmkdir -p /var/runmkdir -p /var/tmp/sbin/hwclock -ssyslogd/etc/rc.d/init.d/netd startecho /dev/tty1echo Starting networking. /dev/tty1sleep 1/etc/rc.d/init.d/httpdstartecho /dev/tty1echo Starting web server. /dev/tty1sleep 1/etc/rc.d/init.d/leds startecho /dev/tty1echo Starting leds service. /dev/tty1echo sleep 1/sbin/ifconfig lo 127.0.0.1/etc/init.d/ifconfig-eth0名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - /bin/qtopia &echo /dev/tty1echo Starting Qtopia, pleasewaiting. /dev/tty1下面就逐个来分析:复制代码PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:runlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel为启动环境设置必要的环境变量;复制代码/bin/hostname FriendlyARM设置机器名字;复制代码/bin/mount -n -t proc none /proc/bin/mount -n -t sysfsnone /sys/bin/mount -n -t usbfs none /proc/bus/usb/bin/mount -t ramfs none /dev挂载 “ 虚拟 ” 文件系统, /proc, /sys,并且在/dev 目录上挂载一个ramfs,相当于把原本NAND Flash上的只读的 /dev 目录 “ 覆盖 ” 上一块可写的空的SDRAM 。这里要注意的是, /sys 和挂载了 ramfs 的/dev 是正确创建设备节点的关键。对于 2.6.29 内核来说 ,已经没有了devfs 的支持,创建设备节点只有通过两种办法由文件系统完成:1) 制作文件系统镜像前用mknod 手动创建好系统中所有的(包括可能有的 )设备节点,并把这些节点文件一起做进文件系统镜像中;2)在文件系统初始化过程中,通过/sys 目录所输出的信息,在/dev 目录下动态的创建系统中当前实际有的设备节点。显然,方法1)有很大的局限性,仅限于没有设备动态增加或减少的情况,不适用于很多设备热插拔的情况,比如U 盘, SD 卡等等。方法2)是目前大多数PC 上 Linux 的做法(基于udev实现)。这种方法有两个前提:/sys 目录挂载和一个可写的/dev 目录。这也就是为什么我们在这里需要挂载 /sys 和 ramfs 在/dev 目录上。事实上,这种方法最早就是为热插拔设计的,你可以理解为当系统启动是,所有设备一下子全部“ 插入 ” 了进来。这里有一点要说明的是,在文件系统初始化跑到这里之前,原本的/dev 目录下必须有一个的设备节点: /dev/console。好了,今天先写到这里,明天继续:)复制代码echo /sbin/mdev /proc/sys/kernel/hotplug/sbin/mdev -s名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - /bin/hotplug这几个就是用来完成我上面所说的两个东西:1)通过 mdev -s 在/dev 目录下建立必要的设备节点;2)设置内核的hotplug handler 为 mdev, 即当设备热插拔时,由mdev 接收来自内核的消息并作出相应的回应, 比如挂载U 盘。对于 mdev,需要注意的是,文件系统里存在/etc/mdev.conf 文件,它包含了mdev 的配置信息。通过这个文件, 我们可以自定义一些设备节点的名称或链接来满足特定的需要。这是 root qtopia中 mdev.conf 的内容:复制代码# system all-writable devicesfull0:00666null0:00666ptmx0:00666random0:00666tty0:00666zero0:00666# console devicestty0-9*0:50660vc/0-9*0:50660# serial port devicess3c2410_serial00:50666=ttySAC0s3c2410_serial10:50666=ttySAC1s3c2410_serial20:50666=ttySAC2s3c2410_serial30:50666=ttySAC3# loop devicesloop0-9*0:00660=loop/# i2c devicesi2c-00:00666=i2c/0i2c-10:00666=i2c/1# frame buffer devicesfb0-90:00666# input devicesmice0:00660=input/mouse.*0:00660=input/event.*0:00660=input/ts.*0:00660=input/# rtc devicesrtc00:00644rtcrtc1-90:00644# misc devicesmmcblk0p10:00600=sdcard */bin/hotplugsda10:00600=udisk * /bin/hotplug名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 可以看到,原本串口驱动注册的设备名是s3c2410_serial0, s3c2410_serial1 和 s3c2410_serial2,而 mdev 则会在 /dev 目录下对应生成ttySAC0, ttySAC1 和 ttySAC2 以符合应用程序对于串口设备名称的习惯。 同样的,/dev/sdcard 和/dev/udisk 永远分别指向SD 卡和 U 盘的第一个分区。( 所以,用那些没有分区表的SD 卡或 U 盘的兄弟知道原因了吧.)复制代码# mounting file system specified in /etc/fstabmkdir -p /dev/ptsmkdir -p /dev/shm/bin/mount -n -t devpts none /dev/pts -o mode=0622/bin/mount -n -t tmpfs tmpfs /dev/shm/bin/mount -n -t ramfs none/tmp/bin/mount -n -t ramfs none/varmkdir -p /var/emptymkdir -p /var/logmkdir -p /var/lockmkdir -p /var/runmkdir -p /var/tmp就像注释中所说的,这是用来挂载其他一些常用的文件系统,并在/var 目录下 (同样是ramfs,可写的 )新建必要的目录。复制代码/sbin/hwclock -s用来设定系统时间的,从硬件RTC 中获取,不过似乎有问题接下来就是启动系统服务了,包括log 记录,网络,http server 和自定义的 跑马灯服务 .明天继续 :)关于 mdev.conf 中的复制代码# misc devicesmmcblk0p10:00600=sdcard */bin/hotplugsda10:00600=udisk * /bin/hotplug一点补充说明:这两句配置的意思是当SD 卡或者 U 盘插入 /拔出时,将这个消息传递给自定义的热插拔handler,/bin/hotplug.这个程序是友善之臂开发的用于自动挂载可移动设备的,目前是 SD 卡和 U 盘。它的逻辑很简单,将SD 卡或者 U 盘的第一个分区作为FAT/FAT32 挂载到 /sdcard 或者 /udisk.但这也同时带来一个问题,当SD 卡或者 U 盘上没有分区表或者第一个分区不是FAT/FAT32 格式的时候,它就玩不转了,兄弟们要小心了:)这是 /bin/hotplug 里的二进制数据片段,可以看到我上面说的逻辑:000010d0h: 52 00 00 00 4D 00 00 00 00 00 00 00 41 00 00 00 ; R.M.A.000010e0h: 43 00 00 00 54 00 00 00 49 00 00 00 4F 00 00 00 ; C.T.I.O.000010f0h: 4E 00 00 00 00 00 00 00 44 00 00 00 45 00 00 00 ; N.D.E.00001100h: 56 00 00 00 4E 00 00 00 41 00 00 00 4D 00 00 00 ; V.N.A.M.00001110h: 45 00 00 00 00 00 00 00 61 00 00 00 64 00 00 00 ; E.a.d.名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 00001120h: 64 00 00 00 00 00 00 00 72 00 00 00 65 00 00 00 ; d.r.e.00001130h: 6D 00 00 00 6F 00 00 00 76 00 00 00 65 00 00 00 ; m.o.v.e.00001140h: 00 00 00 00 2F 00 00 00 64 00 00 00 65 00 00 00 ;./.d.e.00001150h: 76 00 00 00 2F 00 00 00 75 00 00 00 64 00 00 00 ; v./.u.d.00001160h: 69 00 00 00 73 00 00 00 6B 00 00 00 00 00 00 00 ; i.s.k.00001170h: 2F 00 00 00 64 00 00 00 65 00 00 00 76 00 00 00 ; /.d.e.v.00001180h: 2F 00 00 00 73 00 00 00 64 00 00 00 63 00 00 00 ; /.s.d.c.00001190h: 61 00 00 00 72 00 00 00 64 00 00 00 00 00 00 00 ; a.r.d.000011a0h: 4D 00 00 00 44 00 00 00 45 00 00 00 56 00 00 00 ; M.D.E.V .000011b0h: 00 00 00 00 6D 00 00 00 6D 00 00 00 63 00 00 00 ;.m.m.c.000011c0h: 62 00 00 00 6C 00 00 00 6B 00 00 00 30 00 00 00 ; b.l.k.0.000011d0h: 70 00 00 00 31 00 00 00 00 00 00 00 73 00 00 00 ; p.1.s.000011e0h: 64 00 00 00 61 00 00 00 31 00 00 00 00 00 00 00 ; d.a.1.000011f0h: 76 00 00 00 66 00 00 00 61 00 00 00 74 00 00 00 ; v.f.a.t.00001200h: 00 00 00 00 2F 00 00 00 64 00 00 00 65 00 00 00 ;./.d.e.00001210h: 76 00 00 00 2F 00 00 00 77 00 00 00 61 00 00 00 ; v./.w.a.00001220h: 74 00 00 00 63 00 00 00 68 00 00 00 64 00 00 00 ; t.c.h.d.00001230h: 6F 00 00 00 67 00 00 00 00 00 00 00 9A B2 01 81 ; o.g.毑.?00001240h: B0; ?复制代码syslogd/etc/rc.d/init.d/netd startecho /dev/tty1echo Starting networking. /dev/tty1sleep 1/etc/rc.d/init.d/httpdstartecho /dev/tty1echo Starting web server. /dev/tty1sleep 1/etc/rc.d/init.d/leds startecho /dev/tty1echo Starting leds service. /dev/tty1echo sleep 1启动一系列服务:syslog - 用于记录内核和应用程序debug 信息netd -inetd, 一个挂载启动各种网络相关服务的看守进程httpd -http server 看守进程leds-跑马灯看守进程其中, inetd 的配置文件为 /etc/inetd.conf ,这是文件内容复制代码# /etc/inetd.conf:seeinetd(8) for further informations.echostreamtcpnowaitrootinternalechodgramudpwaitrootinternaldaytimestreamtcpnowaitrootinternaldaytimedgramudpwaitrootinternaltimestreamtcpnowaitrootinternaltimedgramudpwaitrootinternal名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - # Theseare standardservices.#ftpstreamtcpnowaitroot/usr/sbin/ftpd/usr/sbin/ftpdtelnetstreamtcpnowaitroot/usr/sbin/telnetd/usr/sbin/telnetd -i可以看到,这里启动的网络服务有两个:1)ftp server 和 2)telnet server。有关网络服务的端口和协议等具体信息,可以参考/etc/services, /etc/protocols再接下来复制代码/sbin/ifconfiglo 127.0.0.1/etc/init.d/ifconfig-eth0配置网络设备 (网卡 ):1)设定本机回环地址为127.0.0.12)运行网卡设置脚本/etc/init.d/ifconfig-eth0这是 /etc/init.d/ifconfig-eth0的内容 , 加入了我的一些注释复制代码#!/bin/shecho -n Try to bring eth0 interface up./dev/ttySAC0#判断 /etc/eth0-setting 文件是否存在if -f /etc/eth0-setting ; then#读取配置文件信息source/etc/eth0-setting#如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了if grep -q /dev/root / nfs /etc/mtab ; thenecho -n NFS root. /dev/ttySAC0#否则,根据配置文件中的MAC, IP,Mask 和 Gateway 通过 ifconfig 命令相应地配置网卡elseifconfig eth0 downifconfig eth0 hw ether $MACifconfig eth0 $IP netmask $Mask uproute adddefault gw $Gatewayfi#将配置文件中的DNS 设置写入 /etc/resolv.conf 使之生效echo nameserver$DNS /etc/resolv.conf#配置文件不存在,使用默认配置else#如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了if grep -q /dev/root / nfs /etc/mtab ; thenecho -n NFS root. /dev/ttySAC0名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - else#将网卡的IP 地址设定为192.168.1.230/sbin/ifconfigeth0 192.168.1.230 netmask 255.255.255.0 upfifiecho Done /dev/ttySAC0可以看到, NFS 自动识别就是靠判断/etc/mtab 中是否有 nfs 的挂载记录实现的。这是 root qtopia 文件系统中 /etc/eth0-settings 文件复制代码IP=192.168.1.230Mask=255.255.255.0Gateway=192.168.1.1DNS=192.168.1.1MAC=08:90:90:90:90:90终于到最后了,启动Qtopia GUI 环境复制代码/bin/qtopia &echo /dev/tty1echo Starting Qtopia, pleasewaiting. /dev/tty1可以看到,这里Qtopia 是通过运行 /bin/qtopia 来启动的。事实上,/bin/qtopia 也是一个脚本,它的任务是设定Qtopia 运行必要的环境, 最后通过调用qpe可执行文件真正启动Qtopia。这是它的全部内容,我加入了一些注释:复制代码#!/bin/sh#tslib 环境变量设置, 包括了 touchscreen 设备文件,tslib 配置文件,tslib plug-in 位置和 touchscreen校准数据文件export TSLIB_TSDEVICE=/dev/input/event0export TSLIB_CONFFILE=/usr/local/etc/ts.confexport TSLIB_PLUGINDIR=/usr/local/lib/tsexport TSLIB_CALIBFILE=/etc/pointercal#Qtopia 环境变量设置,设定了Qtopia 主要文件位置export QTDIR=/opt/Qtopiaexport QPEDIR=/opt/Qtopia#设定 PATH 和 LD_LIBRARY_PATH以包含 Qtopia 的可执行文件和共享库文件,方便 Qtopia 正确运行export PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH#通过判断 /sys/devices/virtual/input/input0/uevent中是否包含touchscreen 信息使 Qtopia 自动识别touchscreen和 USB 鼠标TS_INFO_FILE=/sys/devices/virtual/input/input0/ueventif -e $TS_INFO_FILE-a/bin/grep -q TouchScreen/etc/pointercalfiunsetTS_INFO_FILEexport QWS_KEYBOARD=TTY:/dev/tty1export KDEDIR=/opt/kdeexport HOME=/root#通过调用 /opt/Qtopia/bin/qpe 真正启动Qtopiaexec $QPEDIR/bin/qpe 1/dev/null 2/dev/null到此为止, 文件系统从初始化到最终启动Qtopia GUI 环境的全部过程就结束了,大家可以看到 ,友善之臂的 “ 小秘密 ” 其实都在这里, 说穿了很简单:)只要大家能够静下心来认真看看脚本,看看源代码,加上一些背景知识的了解,搞清楚一个嵌入式系统就这么简单引用引用第 23 楼 qiu1123 于 2009-07-01 09:41 发表的:linuxrc 这个文件无用?能否稍微介绍下?通常 /linuxrc 这个文件只有在1. 使用了 Initial Ramdisk (initrd)2. 内核命令行上指定了init=/linuxrc这两种情况下才有用,mini2440 的 root_qtopia 属于情况2), 在 root_qtopia 中, /linuxrc 是指向/bin/busybox 的符号链接,也就是说,整个文件系统的入口就变成了busybox 的 main() 函数,busybox 支持这种方式来启动busybox 本身和整个文件系统的初始化。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -

    注意事项

    本文(2022年miniroot_qtopia文件系统启动过程分析 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开