2012年11月9日 星期五

[OpenWrt] AR71xx Flash Partitions

之前提到 OpenWrt 至少要有 4 MiB Flash,例如 TL-WR703N 就用 4 MiB Flash,而 TL-WR1043ND 用 8 MiB,它們的 Flash 利用是怎樣規劃的呢?這裡是以 TP-Link 的路由器做說明:(有兩個數字的欄位,分別為 4 MiB Flash 跟 8 MiB Flash 的情形)

partitionoffsetsizesize (KiB)
u-boot
(mtd0)
0x00x20000128
firmware
(mtd5)
kernel
(mtd1)
0x200000x3D0000
0x7D0000
3904
8000
rootfs

(mtd2)

[squashfs]
/rom

rootfs_data
(mtd3)
/overlay
art
(mtd4)
0x3F0000
0x7F0000
0x1000064
  • u-boot 固定 128 KiB,其中位址 0x1FC00 為 MAC Address、0x1FE00 為 PIN
  • art 固定佔用最後的 64 KiB
  • u-boot 跟 art 之間的區域就是 firmware,其 image 由 OpenWrt 的工具程式 mktplinkfw 產生,共由 header、kernel、rootfs 三個部份組成。
    • header 固定為 512 (0x200) bytes,紀錄許多關於韌體資訊的欄位,mtd 分割併入 kernel。
    • kernel 使用剩下的就是 rootfs 空間。kernel 可使用 gzip 或 lzma 壓縮,後者使用的空間較小,讓 rootfs 有更多空間,尤其是使用 4MiB Flash 的時候。
      • 可能是 u-boot 不支援 lzma 壓縮的關係,lzma 壓縮的 kernel 其實會多一層 lzma-loader 載入,然後才能載入真正的 kernel,但整體來說使用的空間較小。例如我剛編譯的 kernel (vmlinux) 是 2,817,980 bytes,gzip 壓縮後是 1,282,951 bytes,lzma 壓縮後是 928,491 bytes。lzma-loader 4,630 bytes,但實際佔用 7,680 bytes 空間,加上 lzma kernel 為 93671,比 gzip 少了 338 KiB。
    • rootfs 使用 squashfs 唯讀檔案系統,使用剩下的空間又自動分出為 rootfs_data 分割作為可讀寫 overlay。
參考:
  1. http://wiki.openwrt.org/doc/techref/flash.layout

[Lua] boolean

boolean 是 Lua 八種基本資料型態之一,包括 false 跟 true。判斷時,false 跟 nil 為 false:其它皆為 true,數字 0 跟空字串 "" 也是 true

[Lua] string

Lua 字串 (Lua 八種基本資料型態之一)
  • 可包含任何字元,包括 \000,結尾沒有 \000。
  • 內容是不能改變的,改變需要另建新字串
  • single or double quoted
  • escape sequence
    • \a:bell
    • \b:backspace
    • \f:form feed
    • \n:換行
    • \r:carriage return
    • \t:水平跳位
    • \v:垂直跳位
    • \\:「\」
    • \":「"」
    • \':「'」
    • \數字:最多三位十進位數字,如果後面不是數字,數字開頭的 0 可省略
  • double square bracket,類似註解,可用成對的「[[」跟「]]」或「[=[」跟「]=]」(依此類推,兩邊等號數目要相等),不解釋裡面的 escape sequence,例如
    page=[[
    <html>
    <head>
    <title>An HTML Page</title>
    <head>
    <body>
    Hello World
    </body>
    </html>
    ]]

    write(page)
  • 數字運算時自動轉換成數字,明確轉換用函數 tonumber
  • 「..」字串 concatenation operator,如果前面接數字,要有空格,不然會視為小數點。明確轉為字串用函數 tostring
  • length operator:字串前面加「#」
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

[Lua] identifier

識別字
  • 由字母、數字 (不能當開頭)、或「_」組成的字串
  • 可以自己把「_」預留為 dummy 變數
  • 避免使用「_大寫字母」,例如 _VERSION,Lua 保留作為特殊用途
    • _PROMPT:互動模式時的提示字
  • 保留字:and break do else elseif end false for function if in local nil not or repeat return then true until while
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

[Lua] comment

註解
  • 任何地方「--」開始,直到行末
區塊註解
  • 以「--[[」開始,直到下個「]]」
  • 以「--[=[」開始,直到下個「]=]」,依此類推,兩邊等號數目要相等
小技巧:使用成對的「--[[」跟「--]]」,要取消註解,只要前面多加「-」變成「---[[」
--[[
--註解
--]]
取消
---[[
--取消區塊註解
--]]
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

2012年11月8日 星期四

[Lua] Hello World

安裝:sudo apt-get lua5.2
(註:目前 Ubuntu 1304 是用 liblua5.1)

檔案:hello.lua
print("Hello World")
執行:lua hello.lua
Hello World
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006 
相關文章
  • lua教學 - 不錯的 lua Hello World 文章,應該是《Programming in Lua》某個章節的翻譯,使用 lua 互動模式使用 print 印出字串、數字,數字運算,字串運算,數字變數,io.write(),io.read()。

2012年11月7日 星期三

[OpenWrt] sysupgrade

/sbin/sysupgrade 是一個 shell 指令檔,在 OpenWrt 自動化韌體更新作業,包括保留設定檔、覆寫 firmware 分割[註]、重開機等等。

基本上,sysupgrade 需要 RAM 暫時儲存韌體及保留的設定檔。會保留的檔案或目錄紀錄在 /etc/sysupgrade.conf 跟 /lib/upgrade/keep.d/*。sysupgrade 加 -n 參數則不保留。

sysupgrade 會載入 /lib/upgrade 下的命令檔,不同 platform 需要提供自己的 platform_check_image() 來檢查更新檔是否正常,一般是 /lib/upgrade/platform.sh。此外亦可提供自己的 platform_do_upgrade() 及 platform_copy_config()。

註:raw flash 使用 mtd write,x86 跟 x86_64 用 dd,x86 的 olpc 用 > /dev/hda

參考:
  1. https://openwrt.org/docs/guide-user/installation/generic.sysupgrade
  2. /sbin/sysupgrade

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...