- Aug 07 Wed 2013 09:10
-
[ftp] ipv6 ubuntu linux ftp
- Jan 03 Thu 2013 21:08
-
[elfutils] arm 交叉編譯
1. 下載
https://fedorahosted.org/releases/e/l/elfutils/
2. 解壓
tar -jxvf elfutils-0.155.tar.bz2
3. 指令:
https://fedorahosted.org/releases/e/l/elfutils/
2. 解壓
tar -jxvf elfutils-0.155.tar.bz2
3. 指令:
- Dec 24 Mon 2012 20:01
-
[tcpdump] arm 交叉編譯
1. download source code
https://www.tcpdump.org/
選左手邊的Latest Release
下載
tcpdump-4.3.0.tar.gz
libpcap-1.3.0.tar.gz
2. 編譯 libpcap
建立安裝目錄
mkdir install
解壓縮
tar -zxvf libpcap-1.3.0.tar.gz
cd libpcap-1.3.0/
配置:交叉編譯器及安裝目錄 (要絕對路徑)
./configure --host=arm-none-linux-gnueabi --prefix=/install
碰到錯誤:
configure: error: pcap type not determined when cross-compiling; use --with-pcap=...
加入--with-pcap=linux 再一次
./configure --host=arm-none-linux-gnueabi --prefix=/install --with-pcap=linux
配置成功!
編譯:
make
make install
https://www.tcpdump.org/
選左手邊的Latest Release
下載
tcpdump-4.3.0.tar.gz
libpcap-1.3.0.tar.gz
2. 編譯 libpcap
建立安裝目錄
mkdir install
解壓縮
tar -zxvf libpcap-1.3.0.tar.gz
cd libpcap-1.3.0/
配置:交叉編譯器及安裝目錄 (要絕對路徑)
./configure --host=arm-none-linux-gnueabi --prefix=/install
碰到錯誤:
configure: error: pcap type not determined when cross-compiling; use --with-pcap=...
加入--with-pcap=linux 再一次
./configure --host=arm-none-linux-gnueabi --prefix=/install --with-pcap=linux
配置成功!
編譯:
make
make install
- Oct 08 Mon 2012 20:07
-
[netperf] arm 交叉編譯
- Aug 19 Sun 2012 10:24
-
[postgresql] install on ubuntu
- Jan 18 Wed 2012 20:55
-
[Linux] Why C in the Linux Kernel? Not C++.
https://kerneltrap.org/node/2067 這篇說的 最大的原因是C++ compiler不夠可靠 還有其他原因 自己看吧~XD
- Jan 08 Sun 2012 09:28
-
Linux 網卡driver的checksum offload
有些網卡會加入checksum offload的機制 所謂的checksum offlaod 就是讓硬體自己算完checksum後再加入packet中 像是IP header 的checksum, TCP/UDP的checksum 就看網卡硬體本身有實作哪些checksum的機制 在linux中 也有加入這些功能喔 再寫網卡driver的時候 linux net_device 的資料結構中 有features這個欄位
- Nov 10 Thu 2011 00:20
-
[git] gitweb 自動產生下載路徑
- Nov 02 Wed 2011 20:46
-
[讀書心得]#3 面對失靈的年代:克魯曼談金融海嘯
作者獲得2008的諾貝爾經濟學獎
但是這本書卻看不到任何的經濟學公式
反而是在書的前面
用了一個國會照顧兒童戶助會的故事
去說明現在資本主義裡
貨幣的運作方式
非常的淺顯易懂
所述說的幾個金融危機
都是發生在近代的
但沒有到1930年代 美國經濟大蕭條這麼的遠
從墨西哥 阿根廷的龍舌蘭酒危機開始說起
日本失落的十年
亞洲金融風暴
到2008的金融海嘯 雷曼兄弟的倒閉
每一個事件的前因後果都交代得很清楚
但是文字卻不艱深
歷史一再的重演
景氣不斷的循環
你可以像是閱讀歷史故事一樣
慢慢的品嘗過去經濟的錯誤
用簡單的觀念
就可以了解金融危機的成因
是本不可多得的好書
但是這本書卻看不到任何的經濟學公式
反而是在書的前面
用了一個國會照顧兒童戶助會的故事
去說明現在資本主義裡
貨幣的運作方式
非常的淺顯易懂
所述說的幾個金融危機
都是發生在近代的
但沒有到1930年代 美國經濟大蕭條這麼的遠
從墨西哥 阿根廷的龍舌蘭酒危機開始說起
日本失落的十年
亞洲金融風暴
到2008的金融海嘯 雷曼兄弟的倒閉
每一個事件的前因後果都交代得很清楚
但是文字卻不艱深
歷史一再的重演
景氣不斷的循環
你可以像是閱讀歷史故事一樣
慢慢的品嘗過去經濟的錯誤
用簡單的觀念
就可以了解金融危機的成因
是本不可多得的好書
- Oct 30 Sun 2011 14:47
-
[Linux] Linux Kernel Memory Allocation
linux kernel中
memory可以分成3種類型的ZONE
1. ZONE_DMA: 有些Device需要用DMA (direct memory access) 用途的memory
2. ZONE_NORMAL: 一般memory
3. ZONE_HIGHMEM: high memory, 不是永久都會是kernel space address的那些memory
在linux kernel中allocate page or memory的function
1. struct page * alloc_pages(gfp_t gfp_mask, unsigned int order)
gfp_mask 待會再說 先感受一下page要怎樣allocate
要注意的是,這裡的order指的是 2^order (1 << order)
例如
page = alloc_pages(GFP_KERNEL, 2);
要的是4個page
另 page_address(struct page *page) 可以回傳page的logical address
2. unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
這個function的動作和alloc_pages()一樣,只是他是直接回傳page的logical address
3. struct page * alloc_page(gfp_t gfp_mask)
等同於
alloc_pages(gfp_mask, 0);
4. unsigned long __get_free_page(gfp_t gfp_mask)
等同於
__get_free_pages(gfp_mask, 0);
5. unsigned long get_zeroed_page(unsigned int gfp_mask)
這個function比較特別,回傳的是page 的logical address
但是內容已經被清為0
注意 以上function回傳的都是連續的physical space (連續的physical pages)!!
對應的free functions
void __free_pages(struct page *page, unsigned int order)
void free_pages(unsigned long addr, unsigned int order)
void free_page(unsigned long addr)
記住!
在alloc memory的時候必須加入錯誤偵測
因為並不一定每一次alloc memory 都會成功
sample code.
unsigned long page;
page = __get_free_pages(GFP_KERNEL, 3)
if (!page) {
/* 記憶體不足 */
return -ENOMEM;
}
/* 不需要用 請記得釋放它 */
free_pages(page, 3)
以上所說 都為page為單位
以下是以byte為單位
1. void * kmalloc(size_t size, gfp_t flags);
void kfree(const void *ptr);
回傳一個連續的physical space
Sample code.
struct dog *p;
p = kmalloc(sizeof(struct dog), GFP_KERNEL);
if (!p)
/* handling error... */
kfree(p);
很明顯的 這個function所回傳的資料
最小一定會比size大 這是因為kernel的最底層
會是以page為單位allocate
所以回傳的大小會是page size的倍數
注意!!
不用要kfree()去釋放不是由kmalloc()所配置的memory
剛剛用了這麼多gfp_mask
現在深入的談談gfp_mask 有哪些flag 和 要怎麼用
是可以分成action modifier, zone modifier, 和type flag
不過一般來說只會用到type flag
type flag是由action modifier和zone modifier組成
但是在這裡只會紀錄常用的type flag
Type Flags
1. GFP_ATOMIC
一看見atomic 然後去查字典 會發現是原子的意思
原子跟kernel 有甚麼關係 ??
其實應該是取他不可分割的意思
意思就是這個動作不會被中斷 一次做到完的意思
在alloc memory的時候 為了要回收memory可能會reschedule
會造成這個process sleep
所以這個flag就是確保在allocate memory的時候不會做以上的動作
這個特性 就是要用在
interrupt handles 之類,不能sleep的routine中
2. GFP_KERNEL
可以進入sleep,最常用的應該就是這個flag
如果沒有特殊需求 用這個就對了
3. GFP_NOIO, GFP_NOFS
NOIO 沒有初始化disk I/O
NOFS 沒有初始化filesystem I/O
為什麼需要用??
I/O只有一個
假設沒有使用這些flag
第一個allocator 配置memory 做了I/O的操作
另一個allocator 配置memory的時候也做了I/O的動作
allocator必需確認沒有人在使用I/O
會造成deadlock
4. GFP_DMA
通常使用在device drivers 而且和GFP_ATOMIC 或 GFP_KERNEL
其中之一連用
以下是一些情況和對應的flags
-------------------------------------------------------------
情況 flags
process context, can sleep Use GFP_KERNEL
process context, cannot sleep Use GFP_ATOMIC
interrupt handler Use GFP_ATOMIC
softirq Use GFP_ATOMIC
tasklet Use GFP_ATOMIC
need DMA memory, can sleep Use (GFP_DMA | GFP_KERNEL)
need DMA memory, cannot sleep Use (GFP_DMA | GFP_ATOMIC)
另外 virtual address的配置是使用
vmalloc vfree
vmalloc()只保證回傳連續的virtual pages
在virtual address 是連續的!
在kernel中為了效能
通常都會使用kmalloc
Reference
memory可以分成3種類型的ZONE
1. ZONE_DMA: 有些Device需要用DMA (direct memory access) 用途的memory
2. ZONE_NORMAL: 一般memory
3. ZONE_HIGHMEM: high memory, 不是永久都會是kernel space address的那些memory
在linux kernel中allocate page or memory的function
1. struct page * alloc_pages(gfp_t gfp_mask, unsigned int order)
gfp_mask 待會再說 先感受一下page要怎樣allocate
要注意的是,這裡的order指的是 2^order (1 << order)
例如
page = alloc_pages(GFP_KERNEL, 2);
要的是4個page
另 page_address(struct page *page) 可以回傳page的logical address
2. unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
這個function的動作和alloc_pages()一樣,只是他是直接回傳page的logical address
3. struct page * alloc_page(gfp_t gfp_mask)
等同於
alloc_pages(gfp_mask, 0);
4. unsigned long __get_free_page(gfp_t gfp_mask)
等同於
__get_free_pages(gfp_mask, 0);
5. unsigned long get_zeroed_page(unsigned int gfp_mask)
這個function比較特別,回傳的是page 的logical address
但是內容已經被清為0
注意 以上function回傳的都是連續的physical space (連續的physical pages)!!
對應的free functions
void __free_pages(struct page *page, unsigned int order)
void free_pages(unsigned long addr, unsigned int order)
void free_page(unsigned long addr)
記住!
在alloc memory的時候必須加入錯誤偵測
因為並不一定每一次alloc memory 都會成功
sample code.
unsigned long page;
page = __get_free_pages(GFP_KERNEL, 3)
if (!page) {
/* 記憶體不足 */
return -ENOMEM;
}
/* 不需要用 請記得釋放它 */
free_pages(page, 3)
以上所說 都為page為單位
以下是以byte為單位
1. void * kmalloc(size_t size, gfp_t flags);
void kfree(const void *ptr);
回傳一個連續的physical space
Sample code.
struct dog *p;
p = kmalloc(sizeof(struct dog), GFP_KERNEL);
if (!p)
/* handling error... */
kfree(p);
很明顯的 這個function所回傳的資料
最小一定會比size大 這是因為kernel的最底層
會是以page為單位allocate
所以回傳的大小會是page size的倍數
注意!!
不用要kfree()去釋放不是由kmalloc()所配置的memory
剛剛用了這麼多gfp_mask
現在深入的談談gfp_mask 有哪些flag 和 要怎麼用
是可以分成action modifier, zone modifier, 和type flag
不過一般來說只會用到type flag
type flag是由action modifier和zone modifier組成
但是在這裡只會紀錄常用的type flag
Type Flags
1. GFP_ATOMIC
一看見atomic 然後去查字典 會發現是原子的意思
原子跟kernel 有甚麼關係 ??
其實應該是取他不可分割的意思
意思就是這個動作不會被中斷 一次做到完的意思
在alloc memory的時候 為了要回收memory可能會reschedule
會造成這個process sleep
所以這個flag就是確保在allocate memory的時候不會做以上的動作
這個特性 就是要用在
interrupt handles 之類,不能sleep的routine中
2. GFP_KERNEL
可以進入sleep,最常用的應該就是這個flag
如果沒有特殊需求 用這個就對了
3. GFP_NOIO, GFP_NOFS
NOIO 沒有初始化disk I/O
NOFS 沒有初始化filesystem I/O
為什麼需要用??
I/O只有一個
假設沒有使用這些flag
第一個allocator 配置memory 做了I/O的操作
另一個allocator 配置memory的時候也做了I/O的動作
allocator必需確認沒有人在使用I/O
會造成deadlock
4. GFP_DMA
通常使用在device drivers 而且和GFP_ATOMIC 或 GFP_KERNEL
其中之一連用
以下是一些情況和對應的flags
-------------------------------------------------------------
情況 flags
process context, can sleep Use GFP_KERNEL
process context, cannot sleep Use GFP_ATOMIC
interrupt handler Use GFP_ATOMIC
softirq Use GFP_ATOMIC
tasklet Use GFP_ATOMIC
need DMA memory, can sleep Use (GFP_DMA | GFP_KERNEL)
need DMA memory, cannot sleep Use (GFP_DMA | GFP_ATOMIC)
另外 virtual address的配置是使用
vmalloc vfree
vmalloc()只保證回傳連續的virtual pages
在virtual address 是連續的!
在kernel中為了效能
通常都會使用kmalloc
Reference
- Oct 30 Sun 2011 08:05
-
Code Optimization
紀錄一些寫code的時候最佳化的技巧 (主要是由Cortex-A Series Programmer's Guide看來的)
著重於souce code optimization方面,而不是演算法方面
當然有一個好的演算法能夠大大增加效能
因此在討論optimization方面
演算法是首先考慮的問題
再去追求code方面的optimization
1. Function inlining
call function會有overhead, 例如
必須把回傳值存起來、push 暫存器到stack、把參數存到暫存器...
所以如果這個function做的事情很少 (可能只有幾個指令)
但是又被呼叫很多次,就會造成效能無謂的浪費
function inlining 的作法就是複製一份function的原始碼到
程式裡面用到這個function的地方,取代掉function call的方式 (push stack)
(一般來說,把function宣告成inline,然後compiler會做複製的動作)
這樣最後呈現的組語就不會有call function這一段描述
但是缺點就是,因為他是複製一份function裡的source code,
所以會增加code size
那最好在那裡用inline functions呢?
a. 如果這個function只在一個地方被用到
b. 呼叫這個function的指令比真正function內執行的指令還多
哪裡不適合用?
a. functions that are intended to be patched
b. common library functions that are separate from the main codebase
-----
這兩點至於是為什麼? 我也不清楚 Orz
之後如果有解 在跟大家分享 或是有強者可以為大家解惑~
2. Eliminating common sub-expressions
盡量重複使用已經計算好的結果
例如
著重於souce code optimization方面,而不是演算法方面
當然有一個好的演算法能夠大大增加效能
因此在討論optimization方面
演算法是首先考慮的問題
再去追求code方面的optimization
1. Function inlining
call function會有overhead, 例如
必須把回傳值存起來、push 暫存器到stack、把參數存到暫存器...
所以如果這個function做的事情很少 (可能只有幾個指令)
但是又被呼叫很多次,就會造成效能無謂的浪費
function inlining 的作法就是複製一份function的原始碼到
程式裡面用到這個function的地方,取代掉function call的方式 (push stack)
(一般來說,把function宣告成inline,然後compiler會做複製的動作)
這樣最後呈現的組語就不會有call function這一段描述
但是缺點就是,因為他是複製一份function裡的source code,
所以會增加code size
那最好在那裡用inline functions呢?
a. 如果這個function只在一個地方被用到
b. 呼叫這個function的指令比真正function內執行的指令還多
哪裡不適合用?
a. functions that are intended to be patched
b. common library functions that are separate from the main codebase
-----
這兩點至於是為什麼? 我也不清楚 Orz
之後如果有解 在跟大家分享 或是有強者可以為大家解惑~
2. Eliminating common sub-expressions
盡量重複使用已經計算好的結果
例如
- Oct 29 Sat 2011 23:02
-
[小園藝] 迎風草~

