《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 業界動態 > 超經典!工程師嵌入式Linux自學筆記及體會 - 全文

超經典!工程師嵌入式Linux自學筆記及體會 - 全文

2017-03-31
關鍵詞: 嵌入式技術

針對初學嵌入式的廣大朋友們,以下是我在初學接觸嵌入式的過程中整理處的一些資料信息,希望能為大家有所幫助。

  一個典型的桌面 Linux 系統包括 3 個主要的軟件層---linux 內核、C 庫和應用程序代碼。

  內核是唯一可以完全控制硬件的層,內核驅動程序代表應用程序與硬件之間進行會話。內核之上是 C 庫,負責把 POSIX API 轉換為內核可以識別的形式,然后調用內核,從應用程序向內核傳遞參數。應用程序依靠驅動內核來完成特定的任務。

  在設計嵌入式應用的時候,可以不按照這種層次,應用程序越過 C 庫直接和內核會話,或者把應用和內核捆綁在一起,甚至可以把應用寫為內核的一個線程,在內核中運行,雖然這樣在移植上帶來了困難,但考慮嵌入式系統對尺寸要求小的特點,是完全可行的。不過我們使用三層軟件結構的模式來學習嵌入式 linux將會是我們認識更清晰,簡單可行并使應用具有彈性。

  快速入門

  最簡單的建立嵌入式 Linux 應用的方法就是從我們使用的桌面 Linux 入手,安裝一個喜愛的版本,把我們的某個應用作為初始化的一部分,框架就算完成了。

  當然,嵌入式 linux 應用遠比我們的桌面版本功能簡單專一,它也許就是一個用于足彩的終端機,或是一個數碼音頻播放器,這些系統除了使用嵌入式 CPU外,僅僅再需要一個串口,網口等少量的輸入輸出接口就可以完成它們特定的應用了。

  在軟件上,它可以按照三層的概念由內核裝載器,定制的內核和較少的為特定任務設計的靜態連接的應用程序組成。之所以使用靜態連接的應用程序,是因為少量的靜態連接程序所要的存儲空間,比同樣數量的動態連接的程序所占的空間小,這個平衡點需要我們在實際開發中去獲取。也許你正在設計的是個 PDA,它的應用程序較多,那么你很可能就要使用動態連接程序來減少存儲空間。在你的/bin 或者/sbin 目錄下,用廠列表看看 bash,ifconfig,vi...,也許只用幾十K,當你運行 ldd /bin/bash 時,你會看到它們都和好幾個庫文件相連。好了,這樣看來,我們得把 PC 想像成一個嵌入式硬件平臺,再重新制作一個特定功能的嵌入式 linux。

  基礎知識

  再進行實際操作之前,先來搞清楚幾個基礎知識。

  內核裝載器 Loader,它的作用是把內核從外部存儲器,移動到內存中。它只作這個事情,一旦完成了調入內核的工作,Loader 就跳轉到內核位置開始執行。不同架構有不同的 Loader,在 x86 結構的 PC 上,通常使用的 loader 有LILO,GRUB,syslinux,syslinux 在嵌入式 linux 中也同樣工作。其他非 x86 架構的應用中,你必須使用專門的 loader,或者自己編寫 loader 來裝入內核。也有不使用 loader 的情況,系統加電以后,內核直接從燒錄有映象的 Flash 上開始執行。

  內核,一旦內核開始執行,它將通過驅動程序初始化所有硬件,這可以從我們的 pc 機監視器的輸出看出來,每個驅動程序都打印一些有關它的信息。初始化完成后,計算機就準備運行嵌入式應用。也許一個,也許是多個應用程序組成了嵌入式應用,但通常首先調用的是 init(通過 loader 向核心傳入init=/program 可以定制首先運行的程序)。桌面 linux 中,init 會讀取/etc/inittab 文件,來決定執行級別和哪些腳本和命令。嵌入式應用中,可以根據實際的情況決定是否使用標準的 init 執行方式,也許這個 init 是個靜態程序,它能夠完成我們的嵌入應用的特定任務,那完全不用考慮 inittab 了。

  initrd 文件系統,initrd 以一種把內核從存儲介質裝入到內存的相同的機制來裝入一個小型文件系統。這個文件系統最好是以壓縮的方式存儲在介質上的,解壓縮到 RAM 盤上。通過使用 initrd,包含有核心驅動和啟動腳本的小文件系統,就可以直接從介質上和內核一起啟動起來,內核屆壓縮這個文件系統,并執行這個文件系統上叫做/linuxrc 的腳本文件,這個腳本通常會把啟動過程中所需要的驅動程序裝入。腳本退出以后,initrd 文件系統也卸下了,啟動過程進入真正初始化過程。對于嵌入式來講,可以將需要的應用軟件都運行在這個initrd 文件系統上,只要/linxrc 文件不結束,內核啟動過程的其他部分就不會繼續。

  做個試驗:

  cp /boot/initrd-2.4.20.img /tmp

  cd /tmp

  mv initrd-2.4.2-.img initrd.img.gz

  gunzip initrd.img.gz

  mount -o loop initrd.img /mnt

  cd /mnt

  ls

  cat linuxrc 可以看到里面執行了加載了兩個模塊的操作,你在啟動 linxu 的時候會看見屏幕打印信息。
  入門試驗,制作一個簡單的應用

  我們使用一張軟盤啟動一臺假象的只有一個串口,鍵盤輸入,顯示輸出的x86 架構的 linux 系統,執行的特定應用就是運行 minicom,通過串口撥號。需要軟件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx 代表版本號,開始之前,在主目錄建立一個目錄,來釋放這兩個軟件包:

  cd

  mkdir -p project/minilinux

  cd project/minilinux

  tar zxvf minicom-xx.src.tar.gz

  tar zxvf syslinux-xx.tar.gz

  1、裁減 linux 內核(需要系統安裝內核文件包)

  配置內核的時候,我們需要選擇這些:摸塊編入內核,386 處理器、物理內存 off、支持 ELF、標準 PC 軟盤、支持 RAM 盤(4096)、支持 initial RAM disk(initrd)、虛你終端、虛擬終端控制臺、標準串口、ext2 文件系統、控制臺驅動,VGA text console、DOS FAT、MSDOS 文件系統,其他的都可以不要,這樣內核編出來較小。

  步驟:

  cd /usr/src/linux

  make mrproper

  make xconfig

  make dep && make bzImage

  得到 /usr/src/linux/arch/i386/boot/目錄的內核文件 bzIamge。

  2、編譯一個靜態的 minicom ,把它作為將來的 linuxrc

  cd minicom-xx/src

  vi Makefile

  修改下面這行

  minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)

  rm -f minicom 下面的行加上 -static,連接為靜態程序

  (LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)

  vi minicom.c

  找到 if (real_uid==0 && dosetup==0 ) 刪除這個判斷條件語句,主要是用于權限判斷的,因為這個嵌入應用不關注權限問題,否則會出錯。

  make

  得到可執行程序,用 ldd 檢查一下是不是靜態程序。

  3、準備 initrd 壓縮文件 image.gz

  dd if=/dev/zero of=image bs=1k count=4096

  losetup /dev/loop0 image

  mke2fs -m 0 /dev/loop0

  mounmt -t ext2 /dev/loop0 /mnt/

  mkdir -p /mnt/dev

  mkdir -p /mnt/usr/share/terminfo/l/

  cd /dev

  cp -a consle null tty tty0 zero mem /mnt/dev

  cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux

  cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc

  umount /mnt

  losetup -d /dev/loop0

  sync

  gzip -9 image
  4、制作軟盤引導,并拷貝文件 bzimage image.gz 到軟盤

  A.使用 grub

  fdformat /dev/fd0

  mke2fs /dev/fd0

  mount /mnt/fd0 /mnt/floppy

  mkdir -p /mnt/floppy/boot/grub

  cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub

  執行 grub,在軟盤上創建引導

  grub > root (fd0)

  grub > setup (fd0)

  grub > quit

  cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy

  cp ~/porject/minilinux/image.gz /mnt/floppy

  編輯 /mnt/floppy/boot/grub/grub.conf

  default =0

  timeout-=10

  title minilinux

  root (fd0)

  kernel /bzImage

  initrd /image.gz

  卸下軟盤

  umount /mnt/floppy

  B. 使用 syslinux

  fdformat /dev/fd0

  mkfs.msdos /dev/fd0

  mount -t msdos /dev/fd0 /mnt/floppy

  cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy

  cp ~/porject/minilinux/image.gz /mnt/floppy

  cp syslinux-xx/ldlinxu.sys /mnt/floppy

  cat > /mnt/floppy/syslinux.cfg

  LABEL linux

  KERNEL bzimage

  APPEND initrd=image.gz

  umont /mnt/floppy

  syslinux-xx/syslinux /dev/fd0

  sync

  5、用軟盤啟動計算機,如果幸運,minicom 的運行畫面出現在屏幕上。

  到此,我們的單應用嵌入式 linux 做好了,但它還很簡陋,沒有什么實際用途,但通過這個實驗,可以了解嵌入式系統的大致結構和開發過程。在進行實際的嵌入式開發時,通常要在 PC 機上借助嵌入式 linux 開發工具包,如:uclinux,bluecat 等,對相應的硬件平臺(目標機)進行軟件編寫編譯,調試成功后,將內核及應用程序寫入到目標機的存儲器中,從而完成整個應用。


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧美一区二区三区极速播放| 日韩网站免费观看| 亚洲国产精品高清久久久| 国产亚洲福利社区一区| 国产精品久久久久久久免费软件 | 国产精品免费aⅴ片在线观看| 欧美日本精品| 欧美日韩高清在线| 欧美日韩在线视频一区| 欧美日韩精品久久久| 欧美日韩亚洲国产精品| 欧美三级第一页| 国产精品成人一区| 国产精品视频yy9299一区| 国产精品嫩草99a| 国产精品丝袜白浆摸在线| 国产精品视频| 国产亚洲女人久久久久毛片| 国产婷婷色综合av蜜臀av| 国产亚洲欧洲一区高清在线观看| 国产一区二区久久久| 国外成人免费视频| 亚洲电影免费观看高清完整版| 亚洲二区三区四区| 亚洲欧洲日夜超级视频| 99re这里只有精品6| 亚洲视频每日更新| 小辣椒精品导航| 久久精品视频在线观看| 亚洲免费激情| 亚洲一区二区三区精品在线| 西瓜成人精品人成网站| 久久精品一区二区三区四区| 久久综合给合| 欧美全黄视频| 国产九九精品视频| 又紧又大又爽精品一区二区| 亚洲精品之草原avav久久| 亚洲午夜性刺激影院| 小嫩嫩精品导航| 亚洲欧洲中文日韩久久av乱码| 99riav久久精品riav| 亚洲欧美影院| 久久久蜜臀国产一区二区| 欧美国产在线电影| 国产精品久久久久毛片软件 | 欧美偷拍另类| 国产日韩欧美在线播放不卡| 一区二区自拍| 一区二区三区www| 久久爱另类一区二区小说| 亚洲美女视频在线免费观看| 亚洲男女自偷自拍| 久久久夜色精品亚洲| 欧美激情一区三区| 国产伦精品一区二区三区高清| 精品1区2区| 亚洲夜间福利| 亚洲日本成人| 午夜视频精品| 欧美激情免费在线| 国产亚洲va综合人人澡精品| 亚洲麻豆国产自偷在线| 中文有码久久| 亚洲精品视频在线看| 久久爱www久久做| 欧美精品1区| 国产有码在线一区二区视频| 日韩视频第一页| 亚洲福利久久| 欧美一区二区三区免费看 | 久久精品人人爽| 亚洲欧美不卡| 欧美韩日一区二区| 国产日韩欧美另类| 日韩午夜黄色| 亚洲国产视频直播| 欧美一区国产在线| 欧美日韩一区自拍| 激情国产一区| 中文一区二区| 99综合视频| 可以看av的网站久久看| 国产精品美女一区二区| 亚洲国产一区二区三区在线播| 先锋影音久久久| 亚洲手机视频| 欧美国产日本高清在线| 国产午夜精品全部视频播放| 9l视频自拍蝌蚪9l视频成人| 亚洲国产欧美日韩精品| 欧美一区=区| 欧美视频日韩视频在线观看| 亚洲激情黄色| 亚洲国产毛片完整版| 久久福利视频导航| 国产精品成人一区二区| 亚洲茄子视频| 亚洲精品一区二区三区不| 久久一区二区三区av| 国产日韩在线不卡| 亚洲欧美日韩精品久久奇米色影视| 中文网丁香综合网| 欧美日韩理论| 日韩午夜av在线| 中国亚洲黄色| 欧美日韩精品系列| 亚洲精品美女在线| 日韩午夜在线电影| 欧美激情性爽国产精品17p| 亚洲第一区在线| 亚洲精品综合精品自拍| 欧美ed2k| 亚洲国产精品成人久久综合一区| 久久成人综合网| 久久亚洲精品网站| 激情伊人五月天久久综合| 久久精品一本| 欧美 日韩 国产在线| 136国产福利精品导航网址应用 | 久久电影一区| 国产视频综合在线| 欧美自拍偷拍午夜视频| 久久久久免费视频| 精品成人在线观看| 最新国产精品拍自在线播放| 欧美 日韩 国产一区二区在线视频| 亚洲国产高清aⅴ视频| 日韩视频在线观看免费| 欧美日韩国产欧| 一区二区三区 在线观看视| 午夜激情久久久| 国产亚洲一二三区| 亚洲国产精品日韩| 欧美另类高清视频在线| 洋洋av久久久久久久一区| 亚洲嫩草精品久久| 国产视频欧美视频| 久久精品一区四区| 欧美激情第五页| 夜夜嗨av一区二区三区四季av| 亚洲自拍偷拍色片视频| 国产日韩一区二区| 亚洲激情成人在线| 欧美另类变人与禽xxxxx| 亚洲一区二区av电影| 久久精品国产亚洲5555| 亚洲高清视频一区| 亚洲视频观看| 国产亚洲欧美一区二区| 亚洲人成高清| 欧美色综合天天久久综合精品| 亚洲免费在线视频| 另类天堂视频在线观看| 日韩一区二区精品| 欧美淫片网站| 亚洲福利视频一区| 亚洲综合色丁香婷婷六月图片| 国产亚洲欧美日韩一区二区| 亚洲日本欧美天堂| 国产精品美女主播| 亚洲激情网站免费观看| 欧美午夜免费| 久久av一区二区三区漫画| 欧美国产视频在线| 亚洲制服av| 欧美黄色免费| 亚洲欧美在线一区二区| 欧美成年人网| 亚洲欧美日韩人成在线播放| 欧美成人精品| 亚洲一区二区动漫| 免费不卡中文字幕视频| 亚洲一区二区免费看| 免费欧美视频| 亚洲欧美资源在线| 欧美日本二区| 欧美专区日韩视频| 国产精品v亚洲精品v日韩精品| 亚洲成人自拍视频| 日韩视频精品| 欧美影院久久久| 亚洲免费观看| 久久久亚洲午夜电影| 国产精品99久久久久久www| 久久综合九色综合欧美狠狠| 99re6热在线精品视频播放速度| 久久久国产成人精品| 中国日韩欧美久久久久久久久| 卡通动漫国产精品| 亚洲欧美日韩精品| 欧美日韩小视频| 亚洲高清不卡一区| 国产精品毛片| 日韩一级片网址| 一区二区三区无毛| 欧美一区二区三区视频在线观看| 亚洲精品女av网站| 免费一区视频| 欧美在线视频全部完|