<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Busybox編譯及其yaffs2文件系制作

          Busybox編譯及其yaffs2文件系制作

          作者: 時間:2016-11-22 來源:網(wǎng)絡(luò) 收藏

          一、Busybox編譯(版本busybox-1.13.0)

          1、在環(huán)境變量中設(shè)置交叉編譯器 的路徑(版本cross-4.3.3)

          本文引用地址:http://www.ex-cimer.com/article/201611/319973.htm

          2、[*] BuildBusybox as a static binary (no shared libs)

          3、busybox settings->busybox librarytuning->username completion、fancyshell prompts

          4、makemenuconfig設(shè)置CROSSCOMPILE為arm-linux-

          5、install optin-->

          [*] Dont use /usr 防止編譯后生成的文件安裝到主機的/usr目錄下,改變了主機的系統(tǒng)

          6、make install即可在_install目錄下生成bin sbin usr(bin,sbin)及其linuxrc文件(該文件鏈接到/bin/busybox)

          二、yaffs2文件系統(tǒng)制作

          將_install目錄下的文件拷貝至~/myroot文件夾下,按如下結(jié)構(gòu)創(chuàng)建目錄,并在相應(yīng)目錄下添加如下內(nèi)容:

          目錄結(jié)構(gòu)

          /

          |--bin (busybox產(chǎn)生)

          |-- dev (設(shè)備名由mknod創(chuàng)建)

          |--etc

          | |-- init.d

          |`-- sysconfig

          |-- home (手工創(chuàng)建用戶)

          | |-- san (空)與passwd文件對應(yīng)

          | `-- sky (空)與passwd文件對應(yīng)

          |-- lib (從交叉編譯工具路徑拷貝cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so*lib -a)

          |-- mnt (空)

          |-- proc (空)

          |-- root (空)

          |-- sbin (busybox產(chǎn)生)

          |-- sys (空)

          |-- tmp (空)

          |-- usr (busybox產(chǎn)生)

          ||-- bin (busybox產(chǎn)生)

          | |-- lib (busybox產(chǎn)生?)

          | `-- sbin (busybox產(chǎn)生)

          `-- var (空)

          dev目錄分析

          dev

          |-- cp -a /dev/console dev
          cp -a /dev/null dev
          cp -a /dev/ttyS0 dev
          cp -a /dev/ttyS1 dev

          (mknod -m 600console c 5 1,這一個沒有試過)

          cant open /dev/s3c2410_serial: No such file or director

          /dev目錄下的console沒有弄好 就會出現(xiàn)這個問題,最簡單的辦法就是直接復(fù)制過來,具體的機理有待進一步研究

          etc目錄分析

          etc

          |-- fstab (指明需掛載的文件系統(tǒng))

          |-- group (用戶組)

          |-- init.d (啟動文件目錄)

          | `-- rcS (存放系統(tǒng)啟動時配置以及自啟動加載的進程等)

          |-- inittab (init進程的配置文件)

          |-- passwd (密碼文件)

          |-- profile (用戶環(huán)境配置文件)

          `--sysconfig

          `-- HOSTNAME (存放主機名)

          【fstab】

          #device mount-point type options dump fsckorder

          proc /proc proc defaults 0 0

          tmpfs /tmp tmpfs defaults 0 0

          sysfs /sys sysfs defaults 0 0

          tmpfs /dev tmpfs defaults 0 0

          var/dev tmpfs defaults 0 0

          【group】

          root:*:0:

          daemon:*:1:

          bin:*:2:

          sys:*:3:

          adm:*:4:

          tty:*5:

          disk:*:6:

          lp:*:7:

          mail:*:8:

          news:*:9:

          uucp:*:10:

          proxy:*:13:

          kmem:*:15:

          dialout:*:20:

          fax:*:21:

          voice:*:22:

          cdrom:*:24:

          floopy:*:25:

          tape:*:26:

          sudo:*:27:

          audio:*:29:

          ppp:x:99:

          500:x:500:sky

          501:x:501:sky

          【init.d/rcS】

          #!/bin/sh

          PATH=/sbin:/bin:/usr/sbin:/usr/bin

          runlevel=S

          prevlevel=N

          umask 022

          export PATH runlevel prevlevel

          #

          # Trap CTRL-C &c only in this shell sowe can interrupt subprocesse.

          mount -a

          mkdir /dev/pts

          mount -t devpts devpts /dev/pts

          echo /sbin/mdev >/proc/sys/kernel/hotplug

          mdev -s

          mkdir -p /var/lock

          /bin/hostname -F /etc/sysconfig/HOSTNAME

          【inittab】

          #/etc/inittab

          ::sysinit:/etc/init.d/rcS

          console ::askfirst:-/bin/sh(s3c2410_serial0 ::askfirst:-/bin/sh)

          ::ctrlaltdel:/sbin/reboot

          ::shutdown:/bin/umount -a -r

          s3c2410_serial為串口設(shè)備號,名稱必須與drivers/serial/samsung.c一致,或則,系統(tǒng)啟動時無法找到串口!!

          /*注意s3c2410上串口的設(shè)備名稱是/dev/s3c2410_serial[0..3]*/

          $vimdrivers/serial/samsung.c

          879static struct uart_driver s3c24xx_uart_drv= {

          880.owner = THIS_MODULE,

          881.dev_name = "s3c2410_serial",

          882.nr = CONFIG_SERIAL_SAMSUNG_UARTS,

          883.cons = S3C24XX_SERIAL_CONSOLE,

          884.driver_name = S3C24XX_SERIAL_NAME,

          885.major = S3C24XX_SERIAL_MAJOR,

          886.minor = S3C24XX_SERIAL_MINOR,

          887};

          系統(tǒng)啟動后

          [root@Sanux /]#ls dev/s3c2410_serial*

          dev/s3c2410_serial0 dev/s3c2410_serial1 dev/s3c2410_serial2

          【passwd】

          root::0:0:root:/:/bin/sh

          ftp::14:50:FTP User:/var/ftp:

          bin:*:1:1:bin:/bin

          daemon:*:2:2:daemon:/sbin:

          nobody:*:99:99:Nobody:/:

          sky::520:502:LinuxUser,,,,:/home/sky:/bin/sh

          san::530:503:san user,,,,:/home/san:/bin/sh

          【profile】

          #Ashprofile

          #vim:syntax=sh

          #Nocore files by default

          #ulimit -S -c 0>/dev/null 2>&1

          USER="`id -un`"

          LOGNAME=$USER

          PS1=[u@h W]#(PS1=[$USER@$HOSTNAME$PWD]#)

          PATH=$PATH

          HOSTNAME=`/bin/hostname`

          export USER LOGNAME PS1 PATH

          【sysconfig/HOSTNAME】

          yourname

          lib目錄

          lib(cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so*lib -a)

          |--ld-2.8.so

          |-- ld-linux.so.3 -> ld-2.8.so

          |-- libBrokenLocale-2.8.so

          |-- libBrokenLocale.so.1 ->libBrokenLocale-2.8.so

          |-- libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.0

          |-- libSDL-1.2.so.0.11.0

          |-- libSDL-1.2.so.0.11.2

          |-- libSDL.so -> libSDL-1.2.so.0.11.0

          |-- libSegFault.so

          |-- libanl-2.8.so

          |-- libanl.so.1 -> libanl-2.8.so

          |-- libc-2.8.so

          |-- libc.so.6 -> libc-2.8.so

          |-- libcidn-2.8.so

          |-- libcidn.so.1 -> libcidn-2.8.so

          |--libcrypt-2.8.so

          |-- libcrypt.so.1 -> libcrypt-2.8.so

          |-- libdl-2.8.so

          |-- libdl.so.2 -> libdl-2.8.so

          |-- libgcc_s.so -> libgcc_s.so.1

          |-- libgcc_s.so.1

          |-- libm-2.8.so

          |-- libm.so.6 -> libm-2.8.so

          |-- libmemusage.so

          |-- libnsl-2.8.so

          |-- libnsl.so.1 -> libnsl-2.8.so

          |-- libnss_compat-2.8.so

          |-- libnss_compat.so.2 ->libnss_compat-2.8.so

          |-- libnss_dns-2.8.so

          |-- libnss_dns.so.2 -> libnss_dns-2.8.so

          |-- libnss_files-2.8.so

          |-- libnss_files.so.2 ->libnss_files-2.8.so

          |-- libnss_hesiod-2.8.so

          |-- libnss_hesiod.so.2 ->libnss_hesiod-2.8.so

          |-- libnss_nis-2.8.so

          |-- libnss_nis.so.2 -> libnss_nis-2.8.so

          |-- libnss_nisplus-2.8.so

          |-- libnss_nisplus.so.2 ->libnss_nisplus-2.8.so

          |-- libpcprofile.so

          |-- libpthread-2.8.so

          |-- libpthread.so.0 -> libpthread-2.8.so

          |-- libresolv-2.8.so

          |-- libresolv.so.2 -> libresolv-2.8.so

          |-- librt-2.8.so

          |-- librt.so.1 -> librt-2.8.so

          |-- libsqlite3.so -> libsqlite3.so.0.8.6

          |-- libsqlite3.so.0 -> libsqlite3.so.0.8.6

          |-- libsqlite3.so.0.8.6

          |-- libthread_db-1.0.so

          |-- libthread_db.so.1 ->libthread_db-1.0.so

          |-- libutil-2.8.so

          `-- libutil.so.1 -> libutil-2.8.so

          說明:linuxrc執(zhí)行時會依賴lib庫文件

          1)、如果將busybox編譯成動態(tài)鏈接的形式,沒有l(wèi)ib動態(tài)庫或者缺少相應(yīng)的庫文件,那么linux會提示無法執(zhí)行或者找不到相應(yīng)的庫。

          2)、如果將busybox編譯成靜態(tài)鏈接的形式(實際就是調(diào)用編譯器的靜態(tài)鏈接庫來編譯可執(zhí)行文件),沒有l(wèi)ib動態(tài)庫也是可以的。

          [*]Build Busybox as a static binary (no shared libs)

          實際上,在linux平臺上編譯可執(zhí)行文件,如果調(diào)用的是動態(tài)鏈接庫,那么我們在執(zhí)行的時候,需要exportLD_LIBRARY_PATH指向動態(tài)鏈接庫的路勁,如果調(diào)用的是靜態(tài)鏈接庫,那就不用設(shè)置庫的路勁了。道理都是一樣的。

          3)、如果將busybox編譯成靜態(tài)鏈接的形式,且lib目錄下沒有相應(yīng)的動態(tài)鏈接庫(如libc.so,libm.so等),那么編譯出來的可執(zhí)行程序無法運行,會提示說"[程序名]:Not found",因此,一般不會將busybox編譯成靜態(tài)鏈接的形式。這個問題是在編寫watchdog測試程序時發(fā)現(xiàn)的。

          三、使用mkyaffsimage_2制作yaffs2文件系統(tǒng)

          mkyaffsimage_2 myroot myroot.bin

          說明:

          1)、在實際的嵌入是系統(tǒng)中,產(chǎn)品發(fā)行后,一般都不會使用終端登錄的功能(除非返廠維修,debug時要用到),所以在終端登錄時沒必要設(shè)置密碼,也沒必要要bash。

          所以,etc目錄可簡化為:

          fstab

          init.d/rcS

          inittab

          sysconfig/HOSTNAME

          這樣在終端登錄后的提示符為“#”,而不會有用戶名、主機名。

          在移植Android系統(tǒng)時,也按這種方法制作系統(tǒng)就可以了。

          2)、編譯好內(nèi)核,制作好文件系統(tǒng)后,我們的Linux系統(tǒng)是可以正常跑起來了,終端也可以使用命令了,但是,如果要做產(chǎn)品研發(fā),離成品的要求還很遠很遠!除了做嵌入式學(xué)習(xí),可以接受現(xiàn)在的情況,用戶是絕對不會買這樣的產(chǎn)品的。

          我們好要做下面一些工作:

          a)、驅(qū)動移植(BSP):沒有驅(qū)動,LCD,USB,WIFI,聲卡,顯卡等許多外設(shè)都無法使用,AP也不可能跑在上面。

          b)、Framewor修改:如sdcard掛載,屏幕旋轉(zhuǎn),屏幕校準,恢復(fù)出廠設(shè)置等。

          c)、BSP、Framework與AP整合測試,并修改其中的大象Bug:在測試的過程中,肯定會發(fā)現(xiàn)大量的Bug,這是完全可以預(yù)料的。其中有一些是AP的問題,有些是Framework或BSP的問題,但是在實際的開發(fā)中,Bug往往都會是相互關(guān)聯(lián)的,可能是AP的一個程序,發(fā)現(xiàn)了Framework或BSP的問題,但Framework或BSP卻無法發(fā)現(xiàn)。所以,要真正讓BSP,F(xiàn)ramework達到完美,那就一定要與AP整合測試。

          ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

          console輸入reboot或powerdown后,GT2440掛載不了yaffs2(具體的原因及好的解決方案還沒有找到,繼續(xù)研究)

          uncorrectable error : <3>end_request:I/O error, dev mtdblock2, sector 0

          Buffer I/O error on device mtdblock2,logical block 0

          Kernel panic - not syncing: VFS: Unable tomount root fs on unknown-block(31,2)

          后來無緣無故的好了(PS1=[u@h W]#(PS1=[$USER@$HOSTNAME $PWD]#)

          ,用后面的替換前面的,在制作文件系統(tǒng),就沒有出現(xiàn)這個問題了,但出來了新的問題,如下:)

          block 1912 is bad

          Partially written block 90 detected

          Partially written block 90 detected

          Partially written block 90 detected

          Partially written block 90 detected

          .

          .

          yaffs2的一個bug,升級一下估計能解決(通過下面介紹的方法,修改了一下源碼,解決了問題)

          yaffs文件系統(tǒng)的Partially written block detected信息

          對文件系統(tǒng)進行一系列的操作之后,直接斷電,然后重新啟動后,掛載文件系統(tǒng)時可能會出現(xiàn)如下提示信息:

          yaffs: dev is 32505863 name is"mtdblock7"

          yaffs: passed flags ""

          yaffs: Attempting MTD mount on 31.7,"mtdblock7"

          Partially written block 13 detected

          Partially written block 13 detected

          Partially written block 13 detected

          Partially written block 13 detected

          yaffs_read_super: isCheckpointed 0

          Please press Enter to activate this console.ls

          [root@localhost /]#

          這種提示信息是正常的,Partially written block 在正常使用時,文件系統(tǒng)的垃圾收集程序?qū)幚怼?/p>

          可以屏蔽這個信息,或者僅在YAFFS_TRACE_SCAN的時候顯示這個信息,修改yaffs_guts.c文件的6668行,將

          T(YAFFS_TRACE_ALWAYS,

          (TSTR("Partially written block %ddetected" TENDSTR),

          blk));

          改為:

          T(YAFFS_TRACE_SCAN,

          (TSTR("Partially written block %ddetected" TENDSTR),

          blk));

          可以查看這個網(wǎng)址:http://www.yaffs.net/lurker/message/20100425.012952.08849f31.en.html



          關(guān)鍵詞: Busybox編譯yaffs2文件系制

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();