發表文章

目前顯示的是 4月, 2018的文章

yocto recipe : (2) 撰寫 bbappend

前言 xxx.bb 檔案是用來描述一個 recipe. 然而 xxx.bb 會因為 patch codes、新增 tasks、等等的因素修改. 這邊介紹如何使用 xxx.bbappend[1] 檔案. 以不修改 xxx.bb 的情況下擴充需求. 文章將以 patch codes 為例子, 並個別以 devtool 工具和手動的方式示範. bbapend 簡介 .bbappend 是擴充 .bb 的方式. 藉由 .bbappend 來新增 tasks、patch code、新增/修改變數等等諸此之類的事. 其名稱必須跟所要修改的相同, 而版本號則依據需求寫. 舉例: bb file 名稱: giflib_5.1.4.bb bbappend 名稱: giflib_5.1.4.bbappend 或 giflib_%.bbappend. %: 表示萬用字元 使用 .bbappend 的情況, 我個人認為有以下情況再使用 (1) 當 recipe 已存在 yocto 最基本的 layer, 不應隨便修改. 舉例: u-boot_2017.09.bb 存在於 yocto 的 meta layer (2) 某些 layers 會共用此 recipe 的情況下. 舉例: meta-raspberrypi 與 meta-ti 分別各自使用自己的 xserver-xf86-config_0.1.bbappend 來對 yocto meta layer 的 xserver-xf86-config_0.1.bb 做擴充修改. bbappend 範例 事前準備 用 giflib [4] 作為測試程式. 先下載 giflib-5.1.4.tar.bz2. 接著使用 bitbake-layer 建立 meta-custom layer, 再透過 recipetool 把產生的 giflib_5.1.4.bb 存放於此 layer. # 執行 oe-init-build-env 進行 yocto 編譯環境設定 [ yijyun@localhost poky ] $ . oe-init-build-env # 建立 3rd-pkgs, 並把 giflib 放至此 [ yijyun@localhost build ] $

Linux 的 binfmt_misc (binfmt) module 介紹

linux 透過 qemu 的動態轉譯(dynamic translation)模式, 能直接執行別架構的程式. 舉例: x86_64 中執行 arm64 架構的程式. 然而每次都必須透過 qemu-aarch64 [program] [args...] 的方式執行, 似乎有點瑣碎. 以下就介紹 linux 是如何使用 binfmt_misc kernel module 來化繁為簡... qemu 與 binfmt 搭配 測試環境為 x86_64 架構, 使用 aarch64 toolchain 編譯下方 hello.c 為 static 的程式. 免去執行時候 link 尋找 libraries 的問題. 這邊透過 1) 直接執行. 2)藉由 qemu 執行. 3) qemu 搭配 binfmt_misc 來示範結果. #include <stdio.h> int main () { printf( "hello !! \n " ); return 0 ; } 首先安裝 aarch64 的 toolchain 來編譯程式. 並確認編譯出來的格式為 aarch64 # 安裝 arm 版本的 toolchain yijyun@yijyun-VirtualBox:~ $ sudo apt-get install gcc-aarch64-linux-gnu # 使用 arm-gcc 編譯 yijyun@yijyun-VirtualBox:~ $ aarch64-linux-gnu-gcc -static hello.c # 查看編譯出來的格式 yijyun@yijyun-VirtualBox:~ $ aarch64-linux-gnu-objdump -f a.out a.out: file format elf64-littleaarch64 architecture: aarch64, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x0000000000400cd8 # 顯示本機的架構 yijyun@yijyun-VirtualBox:~ $ uname -i x86_

邏輯區塊位址 (Logical block addressing, LBA)

圖片
現今都使用LBA(Logical block addressing)的方式來描述資料對應到硬碟的儲存區塊. 而下就以硬碟的基本架構為頭, 再接著說明LBA的計算方式. CHS (cylinders-heads-sectors, 磁柱-磁頭-磁區) 硬碟主要可以看成磁盤和磁頭兩個部分, 如圖1. 磁盤負責存放資料, 資料的讀寫則透過磁頭. 通常一個磁盤上下兩面皆可讀寫, 所以會有對應到兩個磁頭. 而磁頭的起始編號為 0, 1, 2, n. 圖1. 硬碟架構 磁盤又可以在分為磁軌(track)和磁區(sector), 如圖2. 磁盤會被分成數個軌道, 這可以想像成操場的跑道. 每個軌道即是磁軌. 編號由外而內編號, 0, 1, 2,...,n. 而磁軌又會被被劃分成數個區段稱為磁區, 起始為 1, 2, 3, ...n. 每個磁區的大小依照規範而定. 傳統常用為 512 bytes, 現今主流則偏向 4096 bytes(Advance Format). 圖2. 磁盤 而多個磁盤相同磁軌所呈現的關係則稱為磁柱. 基本上磁柱的數量等同於磁軌. 計算硬碟容量的公式如下: 容量 = 磁柱 x 磁頭 x 磁軌擁有的磁區數量 x 磁區大小. LBA (Logical block addressing) 由於要經由CHS來算出要存資料的位置頗麻煩的. 所以就有了 LBA 的方式, 來對應硬碟的每一個存取區塊. 公式如下[1]: LBA = (C × HPC + H) × SPT + (S - 1) LBA: the logical block address C, H, S: cylinder number, the head number, and the sector number HPC: maximum number of heads per cylinder SPT: the maximum number of sectors per track 而 LBA 反推回 CHS 的公式如下[1]: C = LBA ÷ (HPC × SPT) H = (LBA ÷ SPT) mod HPC S = (LBA mod SPT) + 1 e.g