顯示具有 Network Programming 標籤的文章。 顯示所有文章
顯示具有 Network Programming 標籤的文章。 顯示所有文章

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月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社群活動後,再來討論後面部分旳細節。本次程式碼可由此下載

2011年8月29日 星期一

自製BenOS支援lspci 命令

image
在實現網路支援之前,必須先能使用PCI Bus來找到網路卡相關資訊,
參考OSDev.org的"Where I can find Programming Info on PCI?”一文後,
筆者已在Bos實現了lspci 命令,參考"Configuration Mechanism #1”完成,下列程式,
其實一開始,最先遇到問題部分是如何讀取PCI?
原文使用sysOutLong() 和sysInLong(), 對照MIT OSE Lab相關資料,實作如下:
static __inline uint32_t inl(int port)
{
        uint32_t data;
        __asm __volatile("inl %w1,%0" : "=a" (data) : "d" (port));
        return data;
}
static __inline void outl(int port, uint32_t data)
{
        __asm __volatile("outl %0,%w1" : : "a" (data), "d" (port));
}
筆者也試了一下NASM的寫法如下:
        global _inl, _outl
;uint32_t _intl(int port)
_inl:
        mov  edx, [esp+4]
        mov  eax, 0
        in eax, dx
        ret
;void _outl(int port, uint32_t data)
_outl:
        mov  edx, [esp+4]  ; io port
        mov  eax, [esp+8]  ; data
        out  dx, eax
        ret
之後,實作pci_conf_readl與pci_conf_readw,先試作讀取的部分:
完整程式碼請參照kernel/pci.ckernel/osfunc.s,從GitHub 上bos下載。

結論

在程式實作過程中,只要依照PCI所定義的資料表,將所需要的資料取出,存到一個PCI資訊的陣列中。
當有需要時,再從PCI 資訊陣列中取出相對應的記錄一一列出便可得到文章開頭的螢幕畫面。
其中一筆如下:
vendor:0x8086, devid:0x100E, class:0200(Network Controller), rev=3
0x100E指得便是e100的Intel網路卡。而它便是筆者正在研究議題的網路卡資訊來源之一, 提供網路實作使用。

(註一:軟語錄:"提高程式設計功力的方法無它,便是不斷地實作與追踪偵錯。")
(註二:此次9/6活動,筆者將分享最近在研究網路實作的心得,歡迎來切磋指教。)

2010年3月15日 星期一

有效率 TCP/IP 程式設計

一本不錯的書,最近又重看Effective TCP/IP Programming。
此書提供44個提示來改進你的網路程式。

你可參考下列連結:
http://www.amazon.com/Effective-TCP-IP-Programming-Programs/dp/0201615894/ref=sr_1_1?ie=UTF8&s=books&qid=1268599171&sr=8-1