2011年9月16日 星期五

自製免費軟體:超軟中文直式閱瀏器sviewer 0.27.1001更新

sviewer027


主要修正 2.7.1001
* 解決無BOM標頭UTF8檔案,顯示亂碼問題。
* 狀態列顯示檔案類型UTF8, BOM UTF8, ASCII等等
* 工具字型大小選擇: 字型加大為大24, 中20, 小16

檔案下載
由此下載sviewer-027-1001.zip檔案
a073cfa82d621593c49fc26b6972e7bf *sviewer-027-1001.zip

2011年9月14日 星期三

Go 程式語言再探

go_webs_qrcode
  從官網中範例程式找到一段Go程式碼WebServer,加入我的編譯腳本檔如下:
GOCC=6g
GOLD=6l
PROJECT=webserver
all: $(PROJECT)
$(PROJECT).6: $(PROJECT).go
        $(GOCC) $(CFLAGS) $^
$(PROJECT): $(PROJECT).6
        $(GOLD) -o $@ $^
run: $(PROJECT)
        ./$^
clean:
        rm -f $(PROJECT).6 $(PROJECT)
當你輸入,make run 時,如果設定無誤(詳設定請參閱Go語言初探),將會啟動一個Web Server 在localhost:1718。
如上圖,筆者輸入本站網址,點按[Show QR],輕輕鬆鬆產生本站QRCode圖像。
結語
短短50行程式碼,其中包含20行網頁腳本,使用掛載flag, http, io, log, template等等套件大幅提高程式生產力。
若要學習Go,不容錯過Effective Go一文。

2011年9月7日 星期三

Go 程式語言初探

from http://golang.org



最近寫多篇與OS開發相關超硬的文章,來學習Go 語言換換口味輕鬆一下吧!參考英文說明,寫了以下心得:

使用平台為Mac OS X 10.6.8 + Xcode 4.2

前言

Go 程式語言是一個開放源碼的專案,以BSD-style授權發佈。
它以通用語言作為系統設計基礎想法。在強調於型別、垃圾回收及明確定義支持Concurrent程式設計的語言功能等等。並提供大量套件 ,提高寫程式效率。目前支援x86及ARM處理器,一個64位元及32位元x86的編譯套件(6g和8g),及支援ARM的編譯套件(5g)。


開發環境設定

安裝 Mercurial (hg)
 sudo easy_install mercurial
(註:easy_install 是python所內附一個好用安裝第三方工具的python腳本)

Mercurial versions 1.7.x 需要設定檔來指定憑證授權 Certification Authorities (CAs). 在筆者機器遇到下列警示訊息:
warning: go.googlecode.com certificate with fingerprint 28:92:... not verified (check hostfingerprints or web.cacerts config setting)

這表示你所使用的Mercurial沒有正確設定CAs. 參考configure the CAs一文,進行設定。
以下是OSX 10.6以上版本的設定

openssl req -new -x509 -extensions v3_ca -keyout /dev/null -out dummycert.pem -days 3650

使用openssl命令建立替代憑證(設定內容隨意打)
接著使用下列指令將dummycert.pem複製到/etc

sudo cp dummycert.pem /etc/hg-dummy-cert.pem

最後在~/.hgrc 或go/.hg/hgrc內容加入下列兩行。

[web]
cacerts = /etc/hg-dummy-cert.pem

下載Go 正式發佈版本源碼


 hg clone -u release https://go.googlecode.com/hg/ go


編譯Go

你將需要安裝Xcode,其中包含GCC, C libraries ...

$ cd go/src
$ ./all.bash
如果沒任何錯誤發生,訊息如下:


ALL TESTS PASSED

---
Installed Go for darwin/amd64 in /Users/you/go.
Installed commands in /Users/you/Go/bin.
*** You need to add /Users/you/Go/bin to your $PATH. ***
The compiler is 6g.

最後幾行顯示你的系統資訊,硬體架構,和所安裝的目錄,你需要將此目錄加到搜尋路徑中。詳請參閱英文文章環境變數environment variables.


使用Go來編Hello範例
$ make
6g hello.go
hello.go:2: can't find import: fmt
錯誤發生原因沒有指定環境變數。
筆者指定下列環境變數後,總算編譯成功。

export PATH=~/Go/bin:$PATH
export GOROOT=$HOME/Go
export GOARCH=386
export GOOS=darwin
export GOBIN=$HOME/Go/bin

$ make
6g hello.go
6l -o hello hello.6


執行結果
$ make run
./hello
hello, world


hello 範例可由此下載

歡迎留言分享心得。

2011年9月5日 星期一

啟用e100 (i82559er)網路卡在自製Bos

bos_i82559er_enabled 續上篇自製BenOS支援lspci 命令,參考MIT OSE Lab6: Network Driver 及其中各項文件,且參照相關Linux網路驅動程式設計,目前已整合實作82559er網路卡驅動至BOS v0.21中。
新增及修改下列檔案:
pcireg.h PCI相關參數標頭檔,引用自NetBSD,源自MIT OSE LAB
pci.c 移植Lab6 kern/pci.c
net_e100.h 參考Lab6相關實作資料
net_e100.c 參考Lab6相關實作資料
teset/Makefile   已修改以i82559er為參數,啟動qemu :
qemu -fda "../bos.img" -net user -net nic,model=i82559er
執行後結果,如文頭畫面。

啟用e100
其中pci.c,如何啟用e100 82559er 簡略原始碼如下:
pci_func_enable(pci_pdata_t f) {
        pci_conf_write(f, PCI_COMMAND_STATUS_REG,
                       PCI_COMMAND_IO_ENABLE |
                       PCI_COMMAND_MEM_ENABLE |
                       PCI_COMMAND_MASTER_ENABLE);
        for (bar = PCI_MAPREG_START; bar < PCI_MAPREG_END;
             bar += bar_width)
        {
                uint32_t oldv = pci_conf_read(f, bar);
                bar_width = 4;
                pci_conf_write(f, bar, 0xffffffff);
                uint32_t rv = pci_conf_read(f, bar);
                if (rv == 0)   continue;
                int regnum = PCI_MAPREG_NUM(bar);
                if (PCI_MAPREG_TYPE(rv) == PCI_MAPREG_TYPE_MEM) {
                        if (PCI_MAPREG_MEM_TYPE(rv) == PCI_MAPREG_MEM_TYPE_64BIT)
                                bar_width = 8;
                        size = PCI_MAPREG_MEM_SIZE(rv);
                        base = PCI_MAPREG_MEM_ADDR(oldv);
                } else {
                        size = PCI_MAPREG_IO_SIZE(rv);
                        base = PCI_MAPREG_IO_ADDR(oldv);
                }
       pci_conf_write(f, bar, oldv);
       f->addr_base[regnum] = base;
       f->addr_size[regnum] = size; }

net_e100.c
啟用後,這時便用使用到 io region 1: 0xc040,長度為64位元組,參考Intel 82559,來進行下列操作。
需要將e100 做軟體重置(可參e100_reset函式),因使用DMA Rings,
所以接著要掛上傳送的緩衝區Control Block List(CBL)及接收用的緩衝區Receive Frame Area(RFA),可參考cbl_init()及rfa_init()。



net 命令
在起動Bos v0.21後,輸入net 指令,可看到下列結果:
bos$ net
PCI function 00:18.0 (8086:1209) enabled
mem region 0: 4096 bytes at 0xf2020000
io region 1: 64 bytes at 0xc040
cbl avail = 9, wait = 1, slot = 0x420000, irq=11
rfa avail = 10, wait = 0, slot = 0x420050
其中黃色標記三項資訊,在對網路卡設備進行操作時,會使用到。


結語
原使用e100設備序號,並不生效;後來研究OSE資料後,發現必須在qemu參數中設定,之後再使用設備序號1209來啟用e100(i82559er),如此才能正確執行在qemu環境。
MIT OSE Lab6十分具有挑戰性,筆者經幾天的努力才把這網路卡驅動部分實作完成;但大約只完成Lab6的三分之二,其餘部分,待9/6社群活動後,再來討論後面部分旳細節。本次程式碼可由此下載