智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

超經(jīng)典!工程師嵌入式Linux自學(xué)筆記及體會(huì)

來(lái)源:網(wǎng)絡(luò)

點(diǎn)擊:1105

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞:嵌入式技術(shù),Linux,應(yīng)用程序代碼

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

      一個(gè)典型的桌面 Linux 系統(tǒng)包括 3 個(gè)主要的軟件層---linux內(nèi)核、C庫(kù)和應(yīng)用程序代碼。

      內(nèi)核是唯一可以完全控制硬件的層,內(nèi)核驅(qū)動(dòng)程序代表應(yīng)用程序與硬件之間進(jìn)行會(huì)話。內(nèi)核之上是C庫(kù),負(fù)責(zé)把 POSIX API 轉(zhuǎn)換為內(nèi)核可以識(shí)別的形式,然后調(diào)用內(nèi)核,從應(yīng)用程序向內(nèi)核傳遞參數(shù)。應(yīng)用程序依靠驅(qū)動(dòng)內(nèi)核來(lái)完成特定的任務(wù)。

      在設(shè)計(jì)嵌入式應(yīng)用的時(shí)候,可以不按照這種層次,應(yīng)用程序越過(guò)C庫(kù)直接和內(nèi)核會(huì)話,或者把應(yīng)用和內(nèi)核捆綁在一起,甚至可以把應(yīng)用寫(xiě)為內(nèi)核的一個(gè)線程,在內(nèi)核中運(yùn)行,雖然這樣在移植上帶來(lái)了困難,但考慮嵌入式系統(tǒng)對(duì)尺寸要求小的特點(diǎn),是完全可行的。不過(guò)我們使用三層軟件結(jié)構(gòu)的模式來(lái)學(xué)習(xí)嵌入式 linux將會(huì)是我們認(rèn)識(shí)更清晰,簡(jiǎn)單可行并使應(yīng)用具有彈性。

      快速入門(mén)

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

      當(dāng)然,嵌入式 linux 應(yīng)用遠(yuǎn)比我們的桌面版本功能簡(jiǎn)單專一,它也許就是一個(gè)用于足彩的終端機(jī),或是一個(gè)數(shù)碼音頻播放器,這些系統(tǒng)除了使用嵌入式CPU外,僅僅再需要一個(gè)串口,網(wǎng)口等少量的輸入輸出接口就可以完成它們特定的應(yīng)用了。

      在軟件上,它可以按照三層的概念由內(nèi)核裝載器,定制的內(nèi)核和較少的為特定任務(wù)設(shè)計(jì)的靜態(tài)連接的應(yīng)用程序組成。之所以使用靜態(tài)連接的應(yīng)用程序,是因?yàn)樯倭康撵o態(tài)連接程序所要的存儲(chǔ)空間,比同樣數(shù)量的動(dòng)態(tài)連接的程序所占的空間小,這個(gè)平衡點(diǎn)需要我們?cè)趯?shí)際開(kāi)發(fā)中去獲取。也許你正在設(shè)計(jì)的是個(gè) PDA,它的應(yīng)用程序較多,那么你很可能就要使用動(dòng)態(tài)連接程序來(lái)減少存儲(chǔ)空間。在你的/bin或者/sbin目錄下,用廠列表看看bash,ifconfig,vi...,也許只用幾十K,當(dāng)你運(yùn)行l(wèi)dd /bin/bash 時(shí),你會(huì)看到它們都和好幾個(gè)庫(kù)文件相連。好了,這樣看來(lái),我們得把 PC 想像成一個(gè)嵌入式硬件平臺(tái),再重新制作一個(gè)特定功能的嵌入式 linux。

      基礎(chǔ)知識(shí)

      再進(jìn)行實(shí)際操作之前,先來(lái)搞清楚幾個(gè)基礎(chǔ)知識(shí)。

      內(nèi)核裝載器 Loader,它的作用是把內(nèi)核從外部存儲(chǔ)器,移動(dòng)到內(nèi)存中。它只作這個(gè)事情,一旦完成了調(diào)入內(nèi)核的工作,Loader 就跳轉(zhuǎn)到內(nèi)核位置開(kāi)始執(zhí)行。不同架構(gòu)有不同的 Loader,在x86結(jié)構(gòu)的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux 在嵌入式 linux 中也同樣工作。其他非 x86 架構(gòu)的應(yīng)用中,你必須使用專門(mén)的 loader,或者自己編寫(xiě) loader 來(lái)裝入內(nèi)核。也有不使用loader的情況,系統(tǒng)加電以后,內(nèi)核直接從燒錄有映象的 Flash 上開(kāi)始執(zhí)行。

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

      initrd 文件系統(tǒng),initrd 以一種把內(nèi)核從存儲(chǔ)介質(zhì)裝入到內(nèi)存的相同的機(jī)制來(lái)裝入一個(gè)小型文件系統(tǒng)。這個(gè)文件系統(tǒng)最好是以壓縮的方式存儲(chǔ)在介質(zhì)上的,解壓縮到 RAM 盤(pán)上。通過(guò)使用 initrd,包含有核心驅(qū)動(dòng)和啟動(dòng)腳本的小文件系統(tǒng),就可以直接從介質(zhì)上和內(nèi)核一起啟動(dòng)起來(lái),內(nèi)核屆壓縮這個(gè)文件系統(tǒng),并執(zhí)行這個(gè)文件系統(tǒng)上叫做/linuxrc 的腳本文件,這個(gè)腳本通常會(huì)把啟動(dòng)過(guò)程中所需要的驅(qū)動(dòng)程序裝入。腳本退出以后,initrd 文件系統(tǒng)也卸下了,啟動(dòng)過(guò)程進(jìn)入真正初始化過(guò)程。對(duì)于嵌入式來(lái)講,可以將需要的應(yīng)用軟件都運(yùn)行在這個(gè)initrd 文件系統(tǒng)上,只要/linxrc 文件不結(jié)束,內(nèi)核啟動(dòng)過(guò)程的其他部分就不會(huì)繼續(xù)。

      做個(gè)試驗(yàn):

      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 可以看到里面執(zhí)行了加載了兩個(gè)模塊的操作,你在啟動(dòng) linxu 的時(shí)候會(huì)看見(jiàn)屏幕打印信息。

      入門(mén)試驗(yàn),制作一個(gè)簡(jiǎn)單的應(yīng)用

      我們使用一張軟盤(pán)啟動(dòng)一臺(tái)假象的只有一個(gè)串口,鍵盤(pán)輸入,顯示輸出的x86 架構(gòu)的 linux 系統(tǒng),執(zhí)行的特定應(yīng)用就是運(yùn)行 minicom,通過(guò)串口撥號(hào)。需要軟件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx 代表版本號(hào),開(kāi)始之前,在主目錄建立一個(gè)目錄,來(lái)釋放這兩個(gè)軟件包:

      cd

      mkdir -p project/minilinux

      cd project/minilinux

      tar zxvf minicom-xx.src.tar.gz

      tar zxvf syslinux-xx.tar.gz

      1、裁減 linux 內(nèi)核(需要系統(tǒng)安裝內(nèi)核文件包)

      配置內(nèi)核的時(shí)候,我們需要選擇這些:摸塊編入內(nèi)核,386 處理器、物理內(nèi)存 off、支持 ELF、標(biāo)準(zhǔn) PC 軟盤(pán)、支持 RAM 盤(pán)(4096)、支持 initial RAM disk(initrd)、虛你終端、虛擬終端控制臺(tái)、標(biāo)準(zhǔn)串口、ext2 文件系統(tǒng)、控制臺(tái)驅(qū)動(dòng),VGA text console、DOS FAT、MSDOS 文件系統(tǒng),其他的都可以不要,這樣內(nèi)核編出來(lái)較小。

      步驟:

      cd /usr/src/linux

      make mrproper

      make xconfig

      make dep && make bzImage

      得到 /usr/src/linux/arch/i386/boot/目錄的內(nèi)核文件 bzIamge。

      2、編譯一個(gè)靜態(tài)的 minicom ,把它作為將來(lái)的 linuxrc

      cd minicom-xx/src

      vi Makefile

      修改下面這行

      minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)

      rm -f minicom 下面的行加上 -static,連接為靜態(tài)程序

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

      vi minicom.c

      找到 if (real_uid==0 && dosetup==0 ) 刪除這個(gè)判斷條件語(yǔ)句,主要是用于權(quán)限判斷的,因?yàn)檫@個(gè)嵌入應(yīng)用不關(guān)注權(quán)限問(wèn)題,否則會(huì)出錯(cuò)。

      make

      得到可執(zhí)行程序,用 ldd 檢查一下是不是靜態(tài)程序。

      3、準(zhǔn)備 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、制作軟盤(pán)引導(dǎo),并拷貝文件 bzimage image.gz 到軟盤(pán)

      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

      執(zhí)行 grub,在軟盤(pán)上創(chuàng)建引導(dǎo)

      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

      卸下軟盤(pán)

      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、用軟盤(pán)啟動(dòng)計(jì)算機(jī),如果幸運(yùn),minicom 的運(yùn)行畫(huà)面出現(xiàn)在屏幕上。

      到此,我們的單應(yīng)用嵌入式 linux 做好了,但它還很簡(jiǎn)陋,沒(méi)有什么實(shí)際用途,但通過(guò)這個(gè)實(shí)驗(yàn),可以了解嵌入式系統(tǒng)的大致結(jié)構(gòu)和開(kāi)發(fā)過(guò)程。在進(jìn)行實(shí)際的嵌入式開(kāi)發(fā)時(shí),通常要在 PC 機(jī)上借助嵌入式 linux 開(kāi)發(fā)工具包,如:uclinux,bluecat 等,對(duì)相應(yīng)的硬件平臺(tái)(目標(biāo)機(jī))進(jìn)行軟件編寫(xiě)編譯,調(diào)試成功后,將內(nèi)核及應(yīng)用程序?qū)懭氲侥繕?biāo)機(jī)的存儲(chǔ)器中,從而完成整個(gè)應(yīng)用。

    (審核編輯: 智匯張瑜)

    聲明:除特別說(shuō)明之外,新聞內(nèi)容及圖片均來(lái)自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請(qǐng)聯(lián)系我們刪除。

    主站蜘蛛池模板: 一体化净水器-一体化净水设备-集成式|装配式模块化净水设备-山东奕博环境 | 陕西筱润智能科技有限公司 干部人事智能档案柜 智能密集架 智能档案柜 部队选层文件智能柜 智能枪弹柜 财务智能档案柜 边防武警智能密集架 医院智能档案柜 部队选层文件智能柜智能枪弹柜 学校医院文件柜 企事业单位公检法智能文件柜 生产厂家-筱润智能科技有限公司 RFID射频智能密集架 全自动智能选层档案柜 智能密保柜 枪柜部队营房营具床桌椅办公家具 办公用品档案盒设备货架 全自动智能选层柜生产厂家-筱润智能科技有限公司 | 宁波搬家_宁波搬家公司_宁波搬厂_专业搬家搬厂-「宁波喜洋洋搬家公司」 | 无锡大型数控龙门铣加工中心,精密焊接件制造,机械设备加工-无锡嘉迅机械科技有限公司 | 实木全屋定制|整木定制|整木家装|实木护墙板-浩冠家具官网 | 语音芯片_蓝牙芯片_ble数传芯片_蓝牙数传模块厂家_拓达半导体-蓝牙数传芯片模块原厂 | 西安真石漆_无机涂料厂家_无机涂料多少钱一个平方—陕西秦森环保科技有限公司 | 气体检测仪,多功能气体检测仪,四合一检测仪,氯气检测仪,有机挥发气体检测仪,气体报警器-南京诺邦电子科技有限公司 | 领先的木工机械生产厂家,原木加工流水线,立式带锯机,数控木工跑车-邢台亚士达机械制造有限公司 | 聊城钢管厂,无缝钢管厂家-山东旺耀金属制品有限公司 | 上海中泉泵业制造有限公司-柴油机泵,一体化泵站,柴油机消防泵,泵站,预制一体化泵站 | 旋风铣_数控旋风铣整机_旋风铣头|定制生产厂家【腾创机械厂官网】 | 透明捆扎带_束带机打包带_束带机纸带_热封纸带机_上海得亿束带机包装材料有限公司 | 沥青灌缝胶-路面贴缝带-灌缝胶厂家-山东晟辉工程材料有限公司 | 合肥固化地坪-安徽耐磨地坪-合肥环氧地坪厂家-安徽玉平地坪工程有限公司 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 猪粪烘干机|小型鸡粪烘干机|猪粪烘干机价格|小型鸡粪烘干机价格 - 河南宏科重工干燥机设备生产厂家 | 无人叉车|智能无人叉车|智能AGV叉车|激光叉车AGV厂家_江西丹巴赫机器人股份有限公司 | 全自动码垛机|码垛机器人|高位码垛机械手|拆垛机|缠绕机|山东腾阳智能装备有限公司 | 盆底肌修复仪器-产后康复脉冲磁训练仪-南京佳澜健康管理有限公司 | 渣浆泵厂家/潜水-渣浆泵过流件-管道增压泵 - 河北聚洪泵业有限公司 | 手术示教系统-实训示教系统-数字化手术室-直播录播系统 - 深圳市视源视讯技术有限公司 | 青岛除甲醛公司|青岛甲醛治理|青岛除甲醛|甲醛检测|光触媒除甲醛|装修除味除甲醛|新房除甲醛|青岛室内环境污染检测治理|青岛闪洁环保科技有限公司官网 | 陕西西安升降机_导轨式升降货梯_电动固定剪叉式升降平台_甘肃兰州液压机械厂家 | 九江赛璐珞实业有限公司-赛璐珞板,赛璐璐板材,PVC装饰膜,PVC片材,醋酸纤维胶板_多彩装饰材料生产厂家 | 汽油发电机,柴油发电机,小型汽油发电机,小型柴油发电机,家用发电机生产厂家——上海东明动力设备有限公司 | 油漆颜料砂磨机,油墨水砂磨机,水性涂料砂磨机-常州市奥能达机械设备有限公司 | 深圳货柜租赁_集装箱出售/租赁_集装箱改造_鹏泰集装箱 | 陕西柱塞泵厂家_智能张拉设备_桥梁施工设备_千斤顶_液压分裂棒_液压分裂枪|陕西中拓矿山设备有限公司 | 喷涂机器人|自动喷涂生产线|自动喷涂设备|自动化生产线-深圳市荣德机器人科技有限公司 | 收银系统_收银机_pos收款机_门店管理系统-客如云 | 智能调光模块,调光系统巨川电气-专注智能照明 | 离婚协议书怎么写_离婚协议书模板标准版_离婚协议书范本下载 - 离婚协议书 | 伸缩接头,限位伸缩接头,传力接头,可拆卸接头,橡胶接头,衬四氟橡胶接头,橡胶软连接,橡胶补偿器,防水套管- 巩义市隆盛管道设备有限公司 | 球墨井盖厂家-铸铁井盖批发-雨水篦子生产厂家-安徽含山县林头新华铸造厂 | 邮政纸箱_淘宝纸箱_抗压纸箱,盐城纸箱,盐城纸箱厂家,盐城承重纸箱-盐城君雅纸箱 | 泰安德兴元机械设备有限公司|网站首页 | 聚达|聚达物联|聚达物联科技|杭州聚达物联科技有限公司|www.judawulian.com|智慧社区|数字驾驶舱|智慧清运|智慧工地|邻家小达 | 龙淼环保-旋流-喷淋塔,高温布袋,脉冲布袋-单机-滤筒除尘器,活性炭吸附箱,催化燃烧设备,除尘器配件-沧州龙淼环保设备制造有限公司 | 文学素材,好词好句,正能量句子,百科知识-素文网 | 深圳理津技术有限公司(REHLOGY)-全球工业品供应商:自动化产品|仪器仪表|设备|备品备件|工具|消耗品|非标设备|建筑工程等一站式综合服务! |