2014年10月28日 星期二

qemu 設計原理

http://sp1.wikidot.com/qemu

原來是這樣啊

假如我們用 CPU0 的指令為例,如果有一個 CPU0 組合語言如下所示。
    LD    R1, [300]
    LDI    R2, 100
    CMP    R1, 0
    JEQ    END
    ADD    R3, R1, R2
    ST    R3, [200]
END :     RET
那麼,我們可以將其反向轉譯為如下的 C 語言程式。
    R1 = K300;
    R2 = 100;
    if (R1 == 0)
      goto END;
    R3 = R1 + R2;
    R3 = K200;
END :     return

R1:    RESW 1
R2:    RESW 1
K200:     RESW 1
K300:     RESW 1

2014年10月16日 星期四

密碼學筆記

加密就是把明文變密文的過程

加密的演算法大概分兩種:

1.對稱性加密:用一把鑰匙加密 對方也用同一把鑰匙解密 鑰匙是共享的 密文被截獲 只要同時拿到鑰匙就解密了

2.非對稱性加密:每個人有兩把鑰匙 公鑰與私鑰 公鑰與私鑰有唯一的成對性 。發送者將明文用對方的公鑰加密成為密文 對方用對方自己的私鑰解開密文得到明文。  密碼即使被截獲 雖然有公鑰但要解開密文是異常困難的。
補充:就像一個被設計有兩把鑰匙的鎖頭,一把負責鎖一把負責開。會這麼不好理解我猜是當初設計就是用一般邏輯不好理解的原則去發想的,故意違背常理增加解密的困難。

傳遞公鑰給對方的基礎建設稱作 PKI 。規劃中的建設架構包括硬軟體與第三方機構

PKI過程是將個人資訊 與 公鑰結合在一起 第三方機構確保這把公鑰與發行人的關係 是溝通雙方的憑證發行人 是仲裁者 這麼做是要確認收到的公鑰是誰的 因為密文只有那個公鑰所有人解得開

實作PKI的方法之一 X.509

常用的傳輸層(TCP上一層)加密程式庫 libssl 或 gnutls




2014年9月26日 星期五

2014年9月16日 星期二

linux kernel IO效能增進

http://yoshinorimatsunobu.blogspot.tw/2009/04/linux-io-scheduler-queue-size-and.html

有發現一個網誌提出更改sda的 scheduler 為noop
以及更改nr_requests為10000
可以大幅改進磁盤式硬碟寫入的時間

echo 10000 > /sys/block/sda/queue/nr_requests

linux的IO動作有下列順序

File system
I/O scheduler
Device Driver

磁盤式硬碟有disk seek的時間
硬碟內有TCQ機制 是一個IO指令佇列 通常長度只有32-64
nr_requests是linux 核心的IO scheduler的指令佇列長度
將nr_requests值設大會造成IO指令排程成為隨機的
恰好讓隨機資料存取搭配隨機指令
於是就可以大幅縮短磁碟隨機讀寫的執行時間

測試中

2014年5月7日 星期三

電子製造服務的新商機


RS提出的服務
http://pansci.tw/archives/59248

autodesk的新玩意兒
http://www.123dapp.com/circuits

2014年3月29日 星期六

用來在編譯時期輸出訊息的preprocessor指令


#pragma message("編譯時期會看到這個訊息")

例如用來指示內部#define的情況

#ifdef DEFINED
#pragma message("It is defined!")
#else
#pragma message("It is NOT define!")
#endif

2014年3月28日 星期五

raspberry pi 如何在開機之後 繼續使用 ttyAMA0作為console

我用debian debootstrap 製作一個root
放進樹莓派
接上txrx用電腦看console
但是開機之後 kernel跑完之後 就沒有了

上網查發現
要在 etc/inittab 最後面放上
T0:23:respawn:/sbin/getty -L ttyAMA0 9600 vt100
字串
讓他進去之後 繼續使用 ttyAMA0作為console

否則就只能用電視來看console
有點蠢

另外
ttyAMA0 是樹莓派核心的 串列埠 名稱


2014年3月20日 星期四

為什麼使用debian作為嵌入式系統的根目錄來源

根據維基百科指出,debian的設計理念是「若一段時間無錯誤回報才發行」,因此debian通常用在「不動的」的系統場合,像是伺服器之類的。另外搭配qemu-arm-static程式,可以做到在PC端搭配chroot而成的跨平台根目錄建構用環境,不但可以跨平台建構根目錄,同時debian也有發布多種cpu的套件可供安裝。另外也可以製作「開發用」目錄,也就是在chroot內安裝build-essential開發環境套件,而達到跨平台開發的目的。

惟缺點是,套件通常是舊的,但可經由重新編譯套件原始碼解決。另外組建根目錄的內容皆以PC需求為主,因此根目錄大小往往過於龐大,不利於嵌入式系統所用。

因此目前朝向如何組建最小debian根目錄的方向研究中。

光學信號擷取系統,成品,硬體說明

系統前端使用Chopper Stabilized 放大器 又稱 Auto-Zero 放大器,是用在高準確度光二極體的信號處理場合。由於光二極體通常使用在電流模式,因此前端放大會被設計成反相放大形式。此時opamp的輸入偏移就顯得很重要,因此auto zero放大器就是利用內部高速斬波方式,不時的在根據當下輸入情形,產生補償電壓迴授到輸入,使得輸入偏移電壓接近零。一旦輸入偏移接近理想狀態,這樣在放大光訊號時,就不會因為前端放大器的非理想特性,造成個體誤差。因為傳統opamp的輸入偏移電壓,不只初始變動範圍大,還會隨著溫度、時間而產生漂移。

其次採用高速、無輸入緩衝的sigma-delta形式的ADC。因為signa-delta原始形式必須輸入差動信號,因此前端放大的單端輸出必須經過轉換成差動輸出才能為ADC所用。另外ADC採用高速SPI介面輸出,並且可以串連使用。ADC轉換過程無須軟體設定,採用外部接腳硬體設定。上電後,除了初始化自動補償以及同步信號外,ADC本身可以自動不斷地產生輸出(105k SPS)。

 CPU端使用SPI介面接收ADC。由於ADC是自動發送資料,因此CPU端使用中斷GPIO輸入接收ADC端的「資料備妥」信號 ,每次資料備妥中斷發生,系統即刻啟動SPI DMA機制,將串連三組ADC的SPI資料接收進來。搭配內部記憶體指標的動態指定緩衝區,即可做到全速(105k SPS)組合連續單次轉換而成的『頁接收』機制。

2014年2月14日 星期五

使用debootstrap 在pc上製作arm的root

# 開始之前要確定目錄下沒有名稱是root的資料夾 那是以下設定的目的資料夾
# 使用 sudo apt-get install debootstrap 安裝debootstrap
# 第一階段 會產生一個名為root的資料夾 裡面即將是root結構 下載的套件檔按會放在 root/var/cache

sudo debootstrap --verbose --foreign --variant=minbase --arch=armel squeeze ./root http://ftp.tw.debian.org/debian

# 可以實驗性質的使用 --exclude 參數將套件預設不安裝 要注意必須是從0開始安裝才會看到檔案有減少
#sudo debootstrap --verbose --foreign --variant=minbase --arch=armel --exclude gcc,perl,locale squeeze ./root http://ftp.tw.debian.org/debian

# 置入arm模擬器 使用 sudo apt-get install qemu-user-static 安裝

sudo cp /usr/bin/qemu-arm-static root/usr/bin

# 進入chroot 執行第二階段 使用chroot指令 進入以 root/ 為根目錄的環境 此時裡面的執行檔都是arm的執行檔 所以要有上述模擬器支援 才能進行第二階段的安裝

cd root

sudo chroot $(pwd) /debootstrap/debootstrap --second-stage



# 使用 sudo chroot $(pwd) 在 root/目錄下執行 可進入以 root/ 為根目錄的環境中
# 設定網路 網路將因此開通 之後可以使用chroot指令 執行apt-get或是dpkg 以進行套件安裝或設定

cat > /etc/network/interfaces << EOF

auto lo

iface lo inet loopback

EOF



# 設定套件來源 設定完成後 搭配網路開通 首先執行 apt-get update 系統因此取得最新套件來源列表 之後就可以開始使用apt-get install 指令

cat > /etc/apt/sources.list << EOF

deb http://ftp.debian.org/debian/ squeeze main contrib non-free

deb-src http://ftp.debian.org/debian/ squeeze main contrib non-free 

EOF



# 重置語系檔案

#locale-gen --purge en_US.UTF-8

# 移除locale

#apt-get install localepurge



# 移除不需要檔案 參考資料
# http://www.linuxdiyf.com/bbs/thread-74373-1-1.html
# http://askubuntu.com/questions/129566/remove-documentation-to-save-hard-drive-space



# 製作ramdisk 此時的ramdisk 映像檔大約 <48mb data-blogger-escaped-br="">
cd root

find . | cpio -o -H newc | gzip > ../image.cpio.gz

cd ..

mkimage -T ramdisk -C gzip -n 'Ramdisk Image' -d image.cpio.gz ramdisk.bin

# 參考資料
# http://hi.baidu.com/zengzhaonong/item/365c55c651e11363f7c95d9f