前兩天,完成了ucos在2440上的移植,以及boot的修改。今天突然想到,我在linux下,該如何來編寫,調試比較複雜的驅動。我想這個問題應該從如何調試核心入手,先轉載兩個文字,待西西看來。
系統搭建過程中,對于系統平台搭建工程師在完成Bootloader 的 調試之後就進入Kernel 裁減移植的階段,其中最重要的一步是 Kernel 啟動的 調試,在 調試Kernel過程中通常遇到最常見的問題是啟動異常:
UncompressingLinux............................................................
........................... done, booting the kernel.( 挂死在此處)
注意:這裡是arch/arm/boot/compressed/head.S的解壓過程,調用了decompress_kernel()(同目錄下的 misc.c)->include/asm-arm/arch-xxx/uncompress.h的putc()實作。這是在uboot中初始化的,用的是實體位址,因為此時核心還沒有起來。
而 printascii則是調用了彙編。printascii()位于arch/arm/kernel/debug.S,他需要調用虛拟位址,此虛拟位址通過machine_start提供,而相關的宏在include/asm/arch-xxx/debug-macro.S實作,這下明白了。
10-05-14添加:debug.s裡面需要判斷一下目前是否打開了mmu,然後指定uart的基址。在解壓階段的head.s,mmu是1:1映射,目的是加快速度。到了核心的head.s,就是真正的mmu了,此時就是虛拟位址了。
導緻驅動異常(啟動挂死)的原因有很多,如基于EVM 闆的硬體做了修改(如更改了FLASH 空間大小、位址和型号,更改了SDRAM 、DDR SDRAM 空間大小、位址和型号,更改了晶振頻率等),闆卡ID号不支援等。那麼如何進行調試那,其實有兩種調試技術比較有效。
Kernel 啟動調試技術- 使用printascii() 函數跟蹤start_kernel() 有沒運作 ,在booting the kernel 之後Kernel 最先執行的是start_kernel() 函數,确認start_kernel() 有否執行就是在其開始代碼段添加printascii("start_kernel …"),如果序列槽沒有列印出start_kernel …,說明start_kernel() 沒有運作,那麼可能的原因有Bootloader 配置的啟動參數錯誤、 Kernel 加載到(DDR) SDRAM 的位址不正确,Kernel 編譯時指定的(DDR) SDRAM 運作位址不正确等。這樣就需要一項一項排查錯誤,當錯誤被排查完畢,通常列印出 start_kernel …是種必然,如果列印出這儀資訊說明Kernel已 進入到start_kernel() 執行,如果此時有序列槽啟動列印就比較成功了,如果仍然沒有列印啟動資訊,就需要另外一種調試技術。
附代碼修改:init/main.c <<-
…
extern void printascii(const char*); // Modify
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern struct kernel_param __start___param[], __stop___param[];
printascii("start_kernel …"); // Modify
smp_setup_processor_id();
…
->>
Kernel 啟動調試技術- 使用printascii() 函數列印printk() 緩存資訊 ,如果Kernel已進入到start_kernel() 執行,仍然沒有啟動資訊列印出來,說明序列槽波特率出問題的可能性比較大,啟動資訊是暫時緩存到臨時buffer--printk_buf 中的,進入start_kernel() 中會對序列槽波特率重新初始化,當初始化完成後,緩存的系統啟動資訊便列印出來,不能列印說明用于序列槽波特率初始化的系統時鐘源沒有初始化正确,通常是系統時鐘源和實際的晶振頻率不一緻導緻的,通常排查和解決這個問題後,系統啟動資訊是能正确列印的。為了幫助解決問題,可以使用 printascii() 列印printk_buf内容。這樣就能把printascii ()列印的系統資訊和預想的系統資訊進行比較,進而加快解決問題的進度。
附代碼修改:kernel/printk.c <<-
…
extern void printascii(const char*); // Modify
static char printk_buf[1024]; // Modify
asmlinkage int printk(const char *fmt, ...)
{
va_list args;
int r;
va_start(args, fmt);
r = vprintk(fmt, args);
va_end(args);
printascii(printk_buf); // Modify
return r;
}
…
static int recursion_bug;
static int new_text_line = 1;
//static char printk_buf[1024]; // Modify
…
->>
如上是Kernel 裁減移植過程中最重要的兩個啟動調試技術,靈活使用将帶來工作效率的提升,不管硬體平台是那種ARM 或者其它類型的CPU ,也不管是哪個 Kernel 版本(如Linux-2.6.24 、Linux-2.6.30 等 都可以采用這兩個啟動調試技術解決實際問題。為了支援 printascii() 函數,需要在 Kernel 裁減中(make menuconfig )添加Kernel hacking ->[*]Kernel low - level debugging functions 的支援。
我的補充:
1/ 可以在/kernel/head.s裡添加列印看是否跑到mmu開啟前:
__turn_mmu_on:
//列印一個字元a
mov r9,r0
mov r0,'a'
bl printascii //該函數位于arch/arm/kernel/debug.s,調用了include/mach/debug-macro.S
mov r0,r9
//現在開啟mmu
mov r0, r0
mcr p15, 0, r0, c1, c0, 0 @ write control reg
mrc p15, 0, r3, c0, c0, 0 @ read id reg
mov r3, r3
mov r3, r3
mov pc, r13
2/ 一般按樓上方法,在startkernel就可以列印出來,如果:在第一步可以列印,而開啟mmu後不能列印,那絕對是虛拟位址映射問題,這個問題我搞了2天了....
3/ 如果還沒有反應,就要檢查序列槽列印那段 debug-macro.S 是否有問題了。
總結一下:
/compressed/head.s和/kernel/head.s基本上不用改,看檔案頭,2001年寫的,就知道了.呵呵.
linux核心調試指南
一些前言
作者前言
知識從哪裡來
為什麼撰寫本文檔
為什麼需要彙編級調試
***第一部分:基礎知識***
總綱:核心世界的陷阱
源碼閱讀的陷阱
代碼調試的陷阱
原理了解的陷阱
建立調試環境
發行版的選擇和安裝
安裝交叉編譯工具
bin工具集的使用
qemu的使用
initrd.img的原理與制作
x86虛拟調試環境的建立
arm虛拟調試環境的建立
arm開發闆調試環境的建立
gdb基礎
基本指令
gdb之gui
gdb技巧
gdb宏
彙編基礎--X86篇
使用者手冊
AT&T彙編格式
内聯彙編
彙編與C函數的互相調用
調用鍊形成和參數傳遞
C難點的彙編解釋
優化級别的影響
彙編基礎--ARM篇
使用者手冊
調用鍊形成和參數傳遞
源碼浏覽工具
調用圖生成工具
find + grep
wine + SI
global
Source-Navigator
vim + cscope/ctags
kscope
lxr
SI等與gdb的特點
調用鍊、調用樹和調用圖
理想調用鍊
函數指針調用
調用鍊的層次
非理想調用鍊
調用樹與調用圖
穿越盲區
穿越gdb的盲區
穿越交叉索引工具的盲區
工程方法
bug 與 OOPS
***第二部分:核心分析***
調試相關子系統
kgdb源碼分析
sysrq
oprofile
kprobes
驅動分析
載入子產品符号
seq_file.c的分析
module.c的分析
中斷處理過程
s3c24xx記憶體初始化分析
虛拟位址空間
使用者層的觀察窗
互動,從核心層分析
了解裝置模型
面向對象的實作
裝置模型的分層
外圍支援機制
檔案系統
***第三部分:其他工具***
strace
ltrace
SystemTap
MEMWATCH
YAMD
Magic SysRq
附錄:社群交流相關
更新檔送出相關文檔
更新檔制作與送出示範
git使用
附錄:核心參考書籍文章
私人備忘
linux核心調試指南
大海裡的魚有很多,而我們需要的是魚鈎一隻
本文檔由大家一起自由編寫,修改和擴充,sniper負責維護。引用外來的文章要注明作者和來處。本文檔所有指令都是在ubuntu/debian下的操作。選取的核心源碼從文檔開始編寫時最新的核心版本–2.6.26開始,而且會随着linux的更新而不斷更換新的版本。是以文檔的内容可能前後不一緻。相信大家有能力克服這個問題。
本文檔的字元圖示在linux環境下顯示正常,在window下顯示有細微的錯亂。
本文檔唯一的更新網址是:http://wiki.zh-kernel.org/sniper 轉載請保留此網址。
有任何建議請發郵件:[email protected]
有任何問題請到郵件清單提問:http://zh-kernel.org/mailman/listinfo/linux-kernel
一些前言
作者前言
一個人默默地敲打這篇文章也有段時間了。在這個過程裡,沒有收到任何的贊譽,也沒接到任何的闆磚,沒有任何的回報。就這麼敲打着,修理着。但是本人從沒懷疑這篇文檔的價值,這是因為,本人就是這篇文檔的親身收益者。在這裡把它“無私”奉獻出來,乃是出于對于某類同道者锲而不舍孜孜以求的“德性”的認同和“同情”,你的痛苦我表示感同身受,你的迷茫我願意一起分擔。一定有人能從個文檔受益,這便已讓我知足。其實,寫這個文檔并非是件苦差,而是字字都是有感而發的,不吐不快的結果。這裡的句句都是本人教訓和經驗的記錄。
談到調試器,世上存在兩種截然不同的看法。其中一種,是超級解霸的作者,他認為“程式不是寫出來的,好程式絕對是調試出來的”。對于這個觀點,雖然本人學識淺陋,也很崇拜“ ”他的為人,但是本人還是持着極不認同的态度。而第二種相反觀點的人,便是linux之父linus了。他認為調試器隻會“誤人子弟”,隻會導緻人們迷于表象而不去真正了解源碼本身。并以此為由,長期沒把kgdb内置到核心中。對于調試器調試bug會引入錯誤的修正這個觀點,我認為還是有點道理的。但是他以此為由而不把它集合到核心中,這個做法我就認為是毫無道理了。因為linus本人就說過:“我隻使用GDB,而且我總是并不把它作為調試器來使用,隻是将其作為一個可以用來分析程式的分解器來使用。”既然他可以這樣做,為什麼就認定他人使用gdb的目的一定就是用來調試bug而不是另有所用呢?本人之是以這樣說,這是因為本人正也是使用gdb主要是用來輔助分析核心代碼而不是主要用來調試錯誤的。這也正就是本文的主題。
世上從不缺少解決問題的答案,缺少的是解決問題的方法。現在,linux的世界裡已經不缺少牛書了,将盡一千頁一本的滿載答案的磚頭書接踵而來,但是漸漸地發現,看書看到後面就忘了前面,回到前面有忘了後面,甚至一個章節還沒看完,那個子系統已經被完全重寫了。慢慢地,就會懷疑“我是不是真的變老了?真的不行了?”但是我們從沒想過:“憑什麼我們就如此受制于人?他就能搞懂,而我就不行呢?”。其實,我們需要的是一種重其意而忘其形的根本之道,需要的是一種兵來将擋,火來水淹的通用解決方法。而絕不是淹沒于牛人們的結論中。否則,遇到一個新的問題,就隻能埋怨牛人的書還不夠厚,以至于沒把你需要的東西也包括進去了。牛人一定有一套牛方法,而他在書中不詳說,我不認為是他故意“留一手”,而是認為這是對自身覺得習以為常的事物的一種疏忽。牛人的研究結果其實不是最重要的,他的研究方法和手段才是最重要的事情。而我,也漸漸地發現,調試器能帶給我們很多有用的提示,使得我們能不斷的尋找到思考的靈感和方向,也使得學習變得非常的有趣性和有目的性。我想,利用調試器輔助源碼分析,是不是正是很多牛人正在做的而沒有說出來的事情呢?無論答案如何,本人還是覺得,調試器是個好東西,不要輕易把它擱置在一旁。雖然很多高人也許已經是深安此道,甚至已經不需要它的提示了,但是它依然有益于我等功力尚淺的人。把這種經驗和技巧記錄下來,讓需要這項技巧的人少化時間去摸索,這絕對不是一件壞事。
正是因為這個原因,随着文檔慢慢地變大,也更加的覺得文檔的題目起得有點不恰當了,題目起作“核心動态分析指南”更恰當點。文檔的主旨是利用調試器動态分析核心,調試錯誤隻是這個過程的副産品罷了。不過,這個新的名字實在是不夠現在名字“刺眼”,是以也就沒有啟用它。
說了這麼多的廢話和出格的話,無非是有兩個目的:這個文章慢慢的變得這麼長了,如果沒有半句的“人”話,沒有半句的現實世界中的語句。那估計本人不是變成了機器人,閱讀的人也會變成了機器人。順便借這段文字交交朋友。另一個目的呢,是說不應拘束于工具,工具是死的,人是活的。如果某些工具确能帶給我們某些有益的提示,我們就可以去嘗試它,取起優點而舍其糟粕。
引用的原文:
Linus 談調試器和核心如何發展:http://www.bitscn.com/linux/kernel/200604/7493.html
知識從哪裡來
1. 永遠不要忘記的三大幫助指令
XXX -h(xxx –help)
man -a XXX
info XXX
2. 如何安裝幫助文檔
$ sudo synaptic 界面出來後,在“組别”->“文檔”選取你要的文檔進行安裝
或$ apt-cache search Documentation | grep XXX 搜尋需要的文檔進行安裝
3. 從軟體/工具的官方網站閱讀/下載下傳文檔
4. 從irc擷取幫助 irc.freenode.net
5. 從郵件清單擷取幫助 mailist http://lkml.org/ http://marc.info/
6. 發行版社群文檔或社群 https://help.ubuntu.com/community/http://wiki.ubuntu.org.cn/
7. 利用google搜尋文檔或閱讀他人文章
8. 利用google搜尋lkml
http://www.google.cn/advanced_search?hl=zh-CN 網域那裡填上lkml.org
9. 擷取核心文檔
源碼本身
源碼中的注釋
核心源碼附帶的文檔 Documentation
相關的教科書
論文 免費論文引擎 http://citeseerx.ist.psu.edu/
核心子系統的官方網站
擷取核心源碼目錄Documentation/DocBook/ 下已經編譯好的書籍
找到最新版本的文檔
$ apt-cache search linux-doc
安裝最新的文檔
$ sudo apt-get install linux-doc-2.6.24
閱讀Documentation/DocBook/ 下已經編譯好的書籍(html格式)
$ firefox /usr/share/doc/linux-doc-2.6.24/html/index.html
10. 買書
11. 書籍最後面的參考書目
12. 文章末尾的參考文章
為什麼撰寫本文檔
todo:學習方法,學習曲線,參考書籍的特點和不足,本文檔的任務
核心學習曲線
1.隻讀書不看源碼
參考書籍:Linux Kernel Development
2.參考源碼讀書(讀書為主)
參考書籍:understanding the linux kernel
3.參考書讀源碼(看源碼為主)
參考書籍:情景分析
4.隻看源碼不/少讀書(送出更新檔為主)
參考:lkml,main-tree, mm-tree
linux核心分析方法:
按分析的對象分:
1.代碼: 分析的對象是源代碼
2.資料: 分析的對象是核心運作時産生的資料
按觀察對象的狀态分:
1.靜态: 觀察的目标對象是靜止不動的
2.動态: 觀察的目标對象是動态變化的
是以綜合地看,分析方法的種類有:
1.靜态代碼:
最原始的方式,閱讀源代碼
2.動态代碼:
利用某些工具或手段,動态分析源代碼。又分為
a. 利用lxr, cscope, source insight等工具交叉索引源代碼
b. 利用git,web-git通過閱讀增量patch等形式觀察源碼的進化
c. 利用調試器跟随核心的運作動态觀察核心正在運作的代碼片段
3.靜态資料:
觀察的對象是核心在運作時産生或收集彙總出來的資料。又分為
a. 代碼中printk語句列印出來的核心資訊
b. 系統出錯産生的oops,panic資訊
c. 借助systemtap等類似工具提取的核心資料彙總
4.動态資料:
借助核心調試器實時觀察核心不斷産生的資料
可見核心調試器是最強大的核心分析工具,但它也不是“全功能”的工具。
1. 主要地,本文檔聚焦于描述如何利用gdb對核心進行源碼級别和彙編級别的觀察和調試。
而這種調試的目的有兩個:
确定bug産生的引入點。這部分内容放于本文檔第一部分。
配合源碼閱讀工具(source insight,kscope等),觀察核心實時運作的狀況,觀察核心資料的産生和變化,以及觀察各個函數的動态調用關系,進而以一種精确的動态的和驗證性的方式來了解核心運作的原理。這部分内容放于本文檔第二部分
前者是調試器應用的主要價值,而後者卻是本文檔的興趣所在。
2. 因為需要觀察使用者層和核心層的互動,示範調試工具的全面功能等原因,本文檔内容不完全局限于核心層。
3. 另外,為了提供核心調試知識的全面叙述,我們對其他調試工具,其他調試的問題比如檢測記憶體洩露等内容,也會進行說明。此部分内容放于本文檔的第三部分。
為什麼需要彙編級調試
逆向工程的需要
例子1:NT 核心的程序排程分析筆記 http://www.whitecell.org/list.php?id=11
例子2: NT 下動态切換程序分析筆記 http://www.whitecell.org/list.php?id=13
在windows的世界裡,核心源碼和具體原理是不公開的。但很多牛人就憑一個破爛調試器閱讀反彙編代碼就能得到内部真相,可見調試器彙編級調試威力之大。但是在linux是源碼公開的情況下,就沒必要幹那樣的辛苦活了。但是因為以下原因,彙編級調試還是必要的。
彙編比C語言更低層
有時(比如代碼優化)情況下,因為C代碼經過了編譯器的處理,調試器在c源碼調試這個級别下給出的資訊是無法了解的,甚至看起來是錯誤的。但是如果直接對調試器給出的反彙編代碼進行分析,就不會受到那類問題的束縛。也就是說,進行彙編級别的調試能最大程度的利用調試器的功能。
彙編是C語義的解釋
當你對某句C語言不是很了解時,看看編譯器是怎麼想的,是個很不錯的辦法。
能鍛煉彙編源碼的閱讀能力
另一方面,核心中本來存在很多彙編源代碼,進行彙編級調試也是鍛煉閱讀彙編源碼能力的最有效方法。
當然,彙編級調試雖然強大,但代價也是很昂貴。和源碼級調試相比,分析彙編代碼花的時間要多上幾十倍。是以,在源碼公開的情況下,應該以源碼級調試為主,特殊情況下才需要彙編級調試。
***第一部分:基礎知識***
總綱:核心世界的陷阱
也是閱讀了解其他任何大型代碼會遇到的問題。下面各節的内容都是圍繞這些小項展開的。如果有的内容不知所雲,先看後面内容,再回頭看這裡。
〔先從其他地方複制過來,等待充實〕
源碼閱讀的陷阱
源碼不但是越來越大,更是越來越“刁”了。“刁”到了就是借助源碼交叉索引工具也有它索引不到的地方。是以目前,即使是從源碼閱讀的角度而不是從調試的角度,隻利用閱讀工具不借助調試工具的話,源碼都無法閱讀。
源碼“刁”到源碼解析工具都無法解析的因素有:
1. 彙編源碼包括内嵌彙編 可能無法被你的源碼閱讀工具所解析
2. 彙編代碼和C代碼之間的調用關系 無法被被源碼閱讀工具解析
3. 利用函數指針的函數調用 無法被被源碼閱讀工具解析
4. 宏“假函數” 可能無法被被源碼閱讀工具解析(SI不能解析,lxr能)
比如page_buffers()。定義是:
#define page_buffers(page) /
({ /
BUG_ON(!PagePrivate(page)); /
((struct buffer_head *)page_private(page)); /
})
5. 利用宏在編譯時動态生成的函數體 無法被被源碼閱讀工具解析
比如fs/buffer.c中有一大批類似函數。比如buffer_unwritten()
定義在buffer_head.h
82 #define BUFFER_FNS(bit, name) /
..省略
91 static inline int buffer_##name(const struct buffer_head *bh) /
92 { /
93 return test_bit(BH_##bit, &(bh)->b_state); /
94 }
..
130 BUFFER_FNS(Unwritten, unwritten)
這類函數一般是短小的内嵌函數,用gdb調試時都看不出來。隻能靠字元搜尋再加上一點機靈。
6. 函數/變量的某類c擴充屬性标記, 可能導緻該函數/變量無法被被源碼閱讀工具解析
比如static struct vfsmount *bd_mnt __read_mostly;中的bd_mnt
7. 其他語種的保留關鍵字,可能無法被你的源碼閱讀工具所解析
如預設配置的SI無法解析struct class,當然,這個問題和核心無關。
但是借助調試器,就能直接而輕易地解決上述源碼解析工具難以解決的問題。
代碼調試的陷阱
搭建調試環境
gdb調試器的陷阱
1. 宏“假函數”
2. 内嵌函數
3. 代碼優化
4. 彙編碼
5. 程序切換
6. 中斷處理
7. 系統調用
原理了解的陷阱
0. 連結器腳本和make文法
下面這些雜七雜八的檔案對核心整體原理的了解起着決定性的作用。
核心中的連結腳本
linux-2.6$ find ./ -name "*lds*"
核心中的重要宏檔案
module_param* macros
include/linux/moduleparam.h
*__initcall Macros
include/linux/init.h
核心中的彙編檔案
linux-2.6$ find ./ -name "*.S"
核心中的Makefile
linux-2.6$ find ./ -name "Makefile"
核心中的配置檔案
linux-2.6$ find ./ -name "*config*"
1. C與彙編代碼的互相調用
2. 各子系統間的接口互動
3. 核心的設計思想及其代碼編寫和運作形式
a) 基于對象的思想
例子:檔案系統,裝置模型
b) “釋出—訂閱”模型
例子:notification chain
建立調試環境
發行版的選擇和安裝
為什麼選debian
〔如題〕 http://www.debian.org/ http://www.emdebian.org/
為什麼本人選擇debian?因為:引用内容來之www.debian.org
“Debian 計劃 是一個緻力于建立一個自由作業系統的合作組織。...屁話省略...屁話..N多屁話之後: 當然,人們真正需要的是應用軟體,也就是幫助他們完成工作的程式: 從文檔編輯,到電子商務,到遊戲娛樂,到軟體開發。Debian 帶來了超過 18733 個 軟體包 (為了能在您的機器上輕松的安裝,這些軟體包都已經被編譯包裝為一種友善的格式) — 這些全部都是 自由 軟體。”
原因終于看到了,選擇debian是因為本人比較懶,比較笨。而debian正好迎合了我這種人的需求。
1. 它”帶來了超過 18733 個 軟體包”。18733這個數目非常不直覺,而且或許是N年前的資料了。我們可以到debian的ftp看看,現在它可供安裝的軟體和工具達到了5個DVD的容量。難以想象,在這5個DVD容量的工具庫中,還會找不到我所想要的東西。
2. debian有一個非常出名的安裝包管理機制。你需要做的就是,打開“立新得”軟體,然後在一個小方框裡寫上你需要東西的相關資訊,然後再點點一個叫做“搜尋”的小方塊。接着,debian就會在它5個DVD大的工具庫中尋找你想要的工具。在結果傳回後,選擇好你的工具,再點點一個叫做“應用”的小方塊,過一會,就可以使用你的工具了。
再也沒有了“缺少什麼什麼包”的煩人提示了,一切都這麼簡單,又這麼強大。這,正是我想要的。
debian與ubuntu
[兩者差別,版本外号,支援社群,source list等] 1. ubuntu的易用性比debian要好。尤其是中文支援,還有ubuntu國内有活躍的社群。 2. 雖然ubuntu是基于debian的,apt 軟體庫也能擷取到debian的軟體,但它畢竟是不同的系統環境,理念不同,對于一些偏門或太舊或太新的軟體時,ubuntu往往不支援,安裝不了。比如,gcc-3.4-arm-linux-gnu這個包,發行時間已久,ubuntu下安裝不了,但在debian下則可以。http://www.ubuntu.com/community/ubuntustory/debian
如不特别說明,本文檔所有指令都是在ubuntu Hardy Heron8.04版本 和debian testing版本下的操作。
從0安裝debian
〔如果想領教古典linux相對于windows的特色,請安裝一次debian吧。盡管和以前比,已經很智能了。但安裝了debian,選了中文環境,發現漢字都是歪歪倒倒的。而且沒有漢字輸入法,裝了漢字輸入法後,卻用不了。不知道是我笨還是程式有bug.是以不得不用英文寫下本爛文,怕把安裝過程給忘了。需要翻譯回中文〕
How to install and configure a debian system from zero
1.install the system with one CD
Download CD iso file from debian official website, and burn it into a CD. Note that, we can just download the first CD iso but not DVDs or the whole serials of CDs, because the first CD has already contained all the basis components of dedian system and many other most common applications. We can use the first CD to install debian system, and then to install some other needed programs from it if needed. In this way, you can save much time spent on touching many inrelatived things.
2.install application & tool from CD
ou can install some common apllications from the CD with the following commnad: apt-get install expected-application. Why can we do that without any more configuration? Why is it not need to has a ability to access internet? Well, Let’s look at the file named sourse.list which idenifying where to get software’s pakage?? deb cdrom:[Debian GNU/Linux testing _Lenny_ - Official Snapshot i386 CD Binary-1 20080605-15:01]/ lenny main It means that system try to get somethig from your CD, so obviously that you can get some the most common but not all the tools available in debian official apllication repository.
3.try to access the internet
Thank to the first CD, we can do that easily. Fist, install the tool ppp contained in CD and its’ configuration tool pppoeconfig. All these steps are described in file ADSL(PPPOE)接入指南.txt
4.search any useful information through the internet
now, we have built a base debian system, but it is too simple. I want to do some some thing, for example, to chat with some other people with pidgin, but it is not contained in the first CD, which just downloaded by you. And you may want to search some helps with google,etc. Just to do it, google is a most useful tool.
5.search the internet updating source
I think you have get much thing through the google. But the most important thing is to get a available update source for your system, and change the source.list–that is /etc/apt/source.list. Now, I have got a good one, and it seems good. Don’t forget to turn on the security entry in the orgion file source.list. That file looks like following after my updataion:
#deb cdrom:[Debian GNU/Linux testing _Lenny_ - Official Snapshot i386 CD Binary-1 20080605-15:01]/ lenny main
deb http://ftp.debian.org/debian/ lenny main contrib non-free
deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main
You should note that the internet address is debian office’s, but It takes some while to get it. And my searching tool is google. :) Oh, we shoul run a command to update the new configuration to system before using it, don’t ferget: apt-get update
6.get help from IRC
Well, we have already been able to get some applications or tools from internet with command apte-get or wget,etc.. But I think the first thing to do is to get and install a very valuable tool named pidgin which can bring you into IRC world. Because Many experiance and kind person live in channel #debian of irc.freenode.net. You can get help from it very quickly. How to configure pidgin? Sorry, I don’t like to answer such a problem , please just to google it or try it by yourselft. I am not so kind as some guys living in IRC : )
7.get and install synaptic
If you ever used ubuntu, you should agree that synaptic is good tool to update you system. It can save you much time of searching tools, typing commnad, or managing the downloaded tools. But Unfortunately, such a important tool is not installed in the default system, and it is not contained in the first CD. So, We can just to get it with command “apt-get install synaptic”. After doing that successfully, I don’t want to type that command anymore. It’s so tedious to me.
8.get more tools with the help of synaptic
synaptic is my GOD in the linux world. Without it, I will become crazy. But now, I have owned it, so I can fly very freely in the internet sky. Just to search any tools and to update your system. And now, the CD used to install debian can be discarded, if you will never reinstall or rescure the system with it in future.
Now, the sun has raise up, and you have found the road to reback to civilization. Why? Just to ask your google and synaptic. :)
debian重要指令
〔來源〕《APT and Dpkg 快速參考表》http://i18n.linux.net.cn/others/APT_and_Dpkg.php
Apt 不止是 apt-get
http://www.erwinwang.com/node/10
中文環境設定
debian的鍵盤設定更改
預設安裝的debian,鍵盤的設定可能有問題。比如“|”打不出來。值得一提的是,這個設定甚至是和qemu的monitor模式相關聯的。也就是說,qemu下有的字元也打不出來。如果有這個問題,按下面步驟設定
System→Preferences→Keyboard→Layouts
然後通過“Add”增加China,并設定它為預設,或者同時把其他的删除掉。
英文Locale下使用中文輸入法
說明,中文環境比英文環境有很多缺點。比如編譯時編譯器的提示都給漢化了,有如,minicom的中文漢化界面是錯亂的,而且minicom無法設定。本人一般是英文環境+中文輸入法。先安裝好好中文環境,系統中就有了中文輸入法和其他一些和中文有關的東西。然後轉到英文環境下,按照下面做法更改scim的配置檔案即可。
來自:http://wiki.ubuntu.org.cn/index.php?title=%E8%8B%B1%E6%96%87Locale%E4%B8%8B%E4%BD%BF%E7%94%A8%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5%E6%B3%95&variant=zh-cn
編輯 /etc/gtk-2.0/gtk.immodules(如果存在的話) 或者 /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules 檔案,在xim 的 local 增加 en 也就是說:
"xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:th:zh"
改成:
"xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:th:zh"
注意,一定要重新開機一下機器。
pdf亂碼的解決
$sudo apt-get install xpdf-chinese-simplified xpdf-chinese-traditional poppler-data
參考:
http://wiki.ubuntu.org.cn/PDF%E6%96%87%E6%A1%A3%E7%9A%84%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98
建立編譯環境
$ sudo apt-get install build-essential autoconf automake1.9 cvs subversion libncurses5-dev git rar unrar p7zip-full cabextract
其餘的根據出錯的提示,利用“立新得”搜尋,然後進行安裝。沒有“立新得”界面程式的可以在終端下利用以下指令來搜尋和安裝。
$ sudo apt-get update
$ apt-cache search XXX
$ sudo apt-get install XXX
雙硬碟系統切換設定, 私人備忘用
title Microsoft Windows XP Professional
root (hd1,0)
savedefault
makeactive
map (hd0) (hd1)
map (hd1) (hd0)
chainloader +1
安裝交叉編譯工具
交叉編譯工具下載下傳網址
下面是幾個交叉編譯工具下載下傳網址,需要手動安裝時,對比一下編譯器的名稱可以找到合适的下載下傳位址。debian維護有自己的已經打包成.deb形式安裝包,在debian軟體庫中。
http://www.codesourcery.com/gnu_toolchains/arm/download.html
(據說是arm公司推薦的)
Download Sourcery G++ Lite Edition for ARM
Target OS Download
EABI Sourcery G++ Lite 2008q1-126
All versions...
uClinux Sourcery G++ Lite 2008q1-152
All versions...
GNU/Linux Sourcery G++ Lite 2008q1-126
All versions...
SymbianOS Sourcery G++ Lite 2008q1-126
All versions...
到底是選EABI還是GNU/LINUX呢?應該是後者....
點GNU/LINUX的連接配接進去,可看到
Download MD5 Checksum
IA32 GNU/Linux Installer 93eee13a08dd739811cd9b9b3e2b3212
IA32 Windows Installer fac5b0cee1d9639c9f15e018e6d272ad
Documentation
Title Format
Assembler (PDF) PDF
Binary Utilities (PDF) PDF
C Library (GLIBC) (PDF) PDF
Compiler (PDF) PDF
Debugger (PDF) PDF
Getting Started Guide (PDF) PDF
Linker (PDF) PDF
Preprocessor (PDF) PDF
Profiler (PDF) PDF
Advanced Packages
Expert users may prefer packages in these formats.
Download MD5 Checksum
IA32 GNU/Linux TAR 4f11b0fa881864f220ab1bd84666108b
IA32 Windows TAR ed6d25fd68301e728a1fba4cd5cb913f
Source TAR 2db28fb2aa80134e7d34d42b7039d866
名字辨別不是很明顯,進去看才知道。比如,IA32 GNU/Linux Installer對應的安裝包
名字叫arm-2008q1-126-arm-none-linux-gnueabi.bin
為什麼有個none?迷茫中..
---------------------------------
http://ftp.snapgear.org:9981/pub/snapgear/tools/arm-linux/
[DIR] Parent Directory 30-Sep-2003 15:44 -
[ ] arm-linux-tools-20031127.tar.gz 26-Nov-2007 16:56 141M
[ ] arm-linux-tools-20051123.tar.gz 24-Nov-2005 00:50 228M
[ ] arm-linux-tools-20061213.tar.gz 13-Dec-2006 13:31 230M
[ ] arm-linux-tools-20070808.tar.gz 30-Nov-2007 03:21 271M
[ ] binutils-2.16.tar.gz 16-Nov-2005 15:44 15.6M
[ ] binutils-2.17.tar.gz 06-Dec-2007 10:24 17.4M
[ ] build-arm-linux-3.4.4 02-Aug-2006 14:32 6k
[ ] build-arm-linux-4.2.1 30-Jul-2008 10:13 7k
[ ] elf2flt-20060707.tar.gz 17-Jan-2008 22:23 101k
[ ] elf2flt-20060708.tar.gz 30-Jul-2008 10:14 110k
[ ] gcc-3.4.4.tar.bz2 16-Nov-2005 15:39 26.3M
[ ] gcc-4.2.1.tar.bz2 06-Dec-2007 10:11 42.0M
[ ] genext2fs-1.3.tar.gz 03-Sep-2003 10:23 19k
[ ] glibc-2.3.3.tar.gz 16-Nov-2005 15:49 16.7M
[ ] glibc-2.3.6.tar.gz 06-Dec-2007 10:39 17.9M
[ ] glibc-linuxthreads-2.3.3.tar.gz 16-Nov-2005 15:49 303k
[ ] glibc-linuxthreads-2.3.6.tar.gz 06-Dec-2007 10:39 320k
--------------------------
http://www.handhelds.org/download/projects/toolchain/
[DIR] Parent Directory -
[ ] README 28-Jul-2004 17:37 788
[DIR] archive/ 28-Jul-2004 17:34 -
[ ] arm-linux-gcc-3.3.2.tar.bz2 03-Nov-2003 10:23 71M
[ ] arm-linux-gcc-3.4.1.tar.bz2 29-Jul-2004 14:01 41M
[DIR] beta/ 28-Jul-2004 17:36 -
[ ] crosstool-0.27-gcc3.4.1.tar.gz 28-Jul-2004 17:21 2.0M
[ ] gcc-build-cross-3.3 31-Oct-2003 15:43 5.1K
[DIR] jacques/ 24-Jul-2001 18:45 -
[ ] kernel-headers-sa-2.4.19-rmk6-pxa1-hh5.tar.gz 12-Mar-2003 17:42 4.7M
[DIR] monmotha/ 13-Aug-2002 17:54 -
[DIR] osx/ 14-Dec-2003 11:45 -
[DIR] pb/ 22-Nov-2002 20:10 -
[DIR] source/ 18-Mar-2004 16:12 -
------------------------------------
http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/
[DIR] Parent Directory -
[ ] Oerlikon-DevKit-XScalev2.tar.gz 07-Feb-2003 22:30 3.7K
[ ] cross-2.95.3.tar.bz2 20-Jul-2001 21:12 35M
[ ] cross-3.0.tar.bz2 20-Jul-2001 22:27 39M
[ ] cross-3.2.tar.bz2 23-Aug-2002 11:04 81M
[ ] cross-3.2.tar.gz 23-Aug-2002 10:01 93M
[DIR] src-2.95.3/ 14-Jan-2002 17:52 -
[DIR] src-3.2/ 23-Aug-2002 10:53 -
--------------------------------------------
http://linux.omap.com/pub/toolchain/
[DIR] Parent Directory -
[ ] obsolete-gcc-3.3.2.t..> 15-May-2004 12:18 76M
---------------------------
http://www.uclinux.org/pub/uClinux/arm-elf-tools/
To install the Linux binaries, login as root and run "sh ./XXX-elf-tools-20030314.sh".
m68k-elf-20030314/arm-elf-20030314
Get the m68k binaries or the ARM binaries. The source is here.
m68k-elf-20020410/arm-elf-20011219
Get the m68k binaries or the ARM binaries. The source is here.
m68k-elf-20020218/arm-elf-20011219
Get the m68k binaries or the ARM binaries. The source is here.
m68k/arm-elf-20011219
Get the m68k binaries or the ARM binaries. The source is here.
You can also get Bernhard Kuhn's RPMs here.
m68k-elf-20010716
Get the binaries here and the source from here.
m68k-elf-20010712
Get the binaries here and the source from here.
m68k-elf-20010610
Get the binaries here and the source from here.
m68k-elf-20010228
The binaries are in two files, the compilers and the g++ headers. The source is here.
安裝arm-linux-gnueabi-XXX 工具集
debian有自己維護的一套交叉編譯工具集
[參考]http://www.emdebian.org/tools/crosstools.html
工具庫: http://www.emdebian.org/debian/pool/main/
步驟:
1. 往/etc/apt/sources.list檔案加入下面軟體源
deb http://buildd.emdebian.org/debian/ unstable main
deb-src http://buildd.emdebian.org/debian/ unstable main
deb http://buildd.emdebian.org/debian/ testing main
deb-src http://buildd.emdebian.org/debian/ testing main
然後:
安裝 emdebian-archive-keyring package
$ sudo apt-get install emdebian-archive-keyring
更新
$ sudo apt-get update
2. 安裝交叉編譯器
$ sudo apt-get install libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-4.3-arm-linux-gnueabi g++-4.3-arm-linux-gnueabi
注意,在ubuntu8.04下,隻能安裝4.2版。把上面文字中的4.3全部換為4.2即可。
3. 安裝交叉調試器
$sudo apt-get install gdb-arm-linux-gnueabi
注意:
a. 安裝時使用名稱:gdb-arm-linux-gnueabi,調用時使用指令名是:arm-linux-gnueabi-gdb
b. ubuntu下,arm-linux-gnueabi-gdb和gdb有沖突。
解決方法:
需要使用arm-linux-gnueabi-gdb時先解除安裝gdb,記下解除安裝gdb時與gdb一起被解除安裝的軟體名,然後安裝arm-linux-gnueabi-gdb。 想換回gdb時,在反操作。apt-install remove arm-linux-gnueabi-gdb 然後 apt-get install gdb以及之前和gdb一起被解除安裝包。可以寫個腳本自動完成這些操作。本人環境下的腳本是:
腳本1. install-armgdb.sh
#! /bin/sh
sudo apt-get remove gdb
sudo apt-get install gdb-arm-linux-gnueabi
腳本2. install-gdb.sh
#! /bin/sh
sudo apt-get remove gdb-arm-linux-gnueabi
sudo apt-get install apport apport-gtk apport-qt bug-buddy cgdb gdb python-apport xxgdb
什麼是EABI
答: 來自AAPCS
ABI: Application Binary Interface:
1). The specifications to which an executable must conform in order to execute in a specific execution environment. For example, the Linux ABI for the ARM Architecture.
2). A particular aspect of the specifications to which independently produced relocatable files must conform in order to be statically linkable and executable. For example, the C++ ABI for the ARM Architecture, the Run-time ABI for the ARM Architecture, the C Library ABI for the ARM Architecture.
ARM-based … based on the ARM architecture …
EABI: An ABI suited to the needs of embedded (sometimes called free standing) applications.
參考:
ABI/EABI/OABI http://blog.csdn.net/hongjiujing/archive/2008/07/21/2686556.aspx
Re: 關于kernel ARM_EABI http://zh-kernel.org/pipermail/linux-kernel/2008-January/002793.html
Why ARM’s EABI matters http://www.linuxdevices.com/articles/AT5920399313.html
Why switch to EABI? http://www.applieddata.net/forums/topic.asp?TOPIC_ID=2305
ArmEabiPort http://wiki.debian.org/ArmEabiPort
安裝arm-elf-XXX 工具集
注:arm-elf-XXX 工具集是用于uclinux的
1. 依據要求搜尋下載下傳相應的arm-elf-tools安裝包。比如arm-elf-tools-20030315.sh
2. 安裝: $ ./arm-elf-tools-20030315.sh
3. 如果,該安裝包年代過老,比如arm-elf-tools-20030315.sh,會出現下面的錯誤提示 “tail: 無法打開“ 43” 讀取資料: 沒有那個檔案或目錄。”。 這時需要修改安裝包源碼。方法:vi arm-elf-tools-20030315.sh, 搜尋tail,在它後面加 -n .比如 把tail ${SKIP} ${SCRIPT} | gunzip | tar xvf -改成如下:tail -n ${SKIP} ${SCRIPT} | gunzip | tar xvf -
4.如何解除安裝已安裝的arm-elf-tools? 答,重新安裝一次,注意看終端提示。或直接vi arm-elf-tools-20030315.sh,看腳本的内容,
bin工具集的使用
〔該怎麼稱呼這類工具?待詳述〕
arm-elf-addr2line arm-elf-elf2flt arm-elf-gdb arm-elf-objdump arm-elf-size
arm-elf-ar arm-elf-flthdr arm-elf-ld arm-elf-protoize arm-elf-strings
arm-elf-as arm-elf-g++ arm-elf-ld.real arm-elf-ranlib arm-elf-strip
arm-elf-c++ arm-elf-gasp arm-elf-nm arm-elf-readelf arm-elf-unprotoize
arm-elf-c++filt arm-elf-gcc arm-elf-objcopy arm-elf-run
arm-linux-gnueabi-addr2line arm-linux-gnueabi-g++ arm-linux-gnueabi-gprof arm-linux-gnueabi-readelf
arm-linux-gnueabi-ar arm-linux-gnueabi-g++-4.2 arm-linux-gnueabi-ld arm-linux-gnueabi-size
arm-linux-gnueabi-as arm-linux-gnueabi-gcc arm-linux-gnueabi-nm arm-linux-gnueabi-strings
arm-linux-gnueabi-c++filt arm-linux-gnueabi-gcc-4.2 arm-linux-gnueabi-objcopy arm-linux-gnueabi-strip
arm-linux-gnueabi-cpp arm-linux-gnueabi-gdb arm-linux-gnueabi-objdump
arm-linux-gnueabi-cpp-4.2 arm-linux-gnueabi-gdbtui arm-linux-gnueabi-ranlib
如何擷取這些工具的指令選項? 看章節“知識從哪裡來” 一般是用命 xxxxxx –help就能得到簡單的指令選項清單
下載下傳arm-linux-gnueabi- 手冊位址http://www.codesourcery.com/gnu_toolchains/arm/portal/release324
然後搜尋”arm”,便能找到處理器相關的特殊指令選項
arm-linux-gnueabi-gcc
檢視arm處理器相關的編譯選項
$ vi arch/arm/Makefile
閱讀Makefile檔案,并聯系源碼根目錄下的.config檔案,便能知道arm-linux-gnueabi-gcc用了哪些編譯選項。再到手冊中查找,便能知道這些選項是幹什麼用的,但手冊中說的不是很詳細。另外查找有用解釋的方法的是,利用make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig,找到與指令選項有關聯的CONFIG_XXX的菜單項,看它的幫助說明.比如
$ vi arch/arm/Makefile
....
ifeq ($(CONFIG_AEABI),y)
CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork
else
CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
endif
..
再檢視CONFIG_AEABI的幫助文檔 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig 找到CONFIG_AEABI相關的菜單,看它的幫助文檔,便能知道選項-mabi=aapcs-linux -mno-thumb-interwork的整體效果怎樣的。
┌————————————————————— Use the ARM EABI to compile the kernel ——————————————————————┐
│ CONFIG_AEABI: │
│ │
│ This option allows for the kernel to be compiled using the latest │
│ ARM ABI (aka EABI). This is only useful if you are using a user │
│ space environment that is also compiled with EABI. │
│ │
│ Since there are major incompatibilities between the legacy ABI and │
│ EABI, especially with regard to structure member alignment, this │
│ option also changes the kernel syscall calling convention to │
│ disambiguate both ABIs and allow for backward compatibility support │
│ (selected with CONFIG_OABI_COMPAT). │
│ │
│ To use this you need GCC version 4.0.0 or later. │
│ │
│ Symbol: AEABI [=n] │
│ Prompt: Use the ARM EABI to compile the kernel │
│ Defined at arch/arm/Kconfig:554 │
│ Location: │
│ -> Kernel Features
arm-linux-gnueabi-gcc的主要編譯選項有如下幾個。但是在編譯核心時,這些選項是不需要手工去寫的,而是通過make menuconfig生成包含了編譯選項配置資訊的.config檔案。在make編譯核心時,再利用Makefile檔案中的規則結合.config檔案提取出那些選項。
太多了,手冊吧
arm-linux-gnueabi-gdb
注意它的預設選項設定
$ arm-linux-gnueabi-gdb
(gdb) show arm
abi: The current ARM ABI is "auto" (currently "APCS").
apcs32: Usage of ARM 32-bit mode is on.
disassembler: The disassembly style is "std".
fpu: The current ARM floating point model is "auto" (currently "fpa").
(gdb)
但是,如果如果在指令後有參數vmlinux的話,它會自動識别出核心的abi,進而自動設定了gdb的abi。比如,在編譯核心時,如果選了CONFIG_AEABI,則gdb的提示如下
$ arm-linux-gnueabi-gdb vmlinux
...
(gdb) show arm
abi: The current ARM ABI is "auto" (currently "AAPCS"). <--注意
apcs32: Usage of ARM 32-bit mode is on.
disassembler: The disassembly style is "std".
fpu: The current ARM floating point model is "auto" (currently "softvfp").
qemu的使用
參考手冊
http://bellard.org/qemu/user-doc.html
http://wiki.debian.org.tw/index.php/QEMU
http://www.h7.dion.ne.jp/~qemu-win/
http://bellard.org/qemu/
郵件清單
http://lists.gnu.org/archive/html/qemu-devel/
參考文章
“QEMU安裝使用全攻略” http://forum.ubuntu.org.cn/viewtopic.php?p=248267&sid=f4e95025bdaf6a24a218315d03ad9933
〔補充指令〕引用自http://bbs.chinaunix.net/viewthread.php?tid=779540
安裝過程中,要求換盤:
在qemu中按ctrl+alt+2切換到qemu monitor模式 輸入?或help可以檢視可用指令及使用說明。
(在其他版本的qemu中,運作qemu加載OS後,這個shell就會自動變成qemu monitor模式)
change device filename -- change a removable media
看來它就是用來換盤的了 : change cdrom /rhel4/EL_disc2.iso
切換回安裝界面ctrl+alt+1
monitor下還有幾個常用的指令:
savevm filename 将整個虛拟機目前狀态儲存起來
loadvm filename 恢複 (最初我沒用change換盤時,就是先savevm->重新運作qemu->loadvm )
sendkey keys 向VM中發送按鍵,例如你想在虛拟機裡切換到另一個終端,按下了ctrl-alt-F2
不幸的是,切換的卻是你的主系統,是以就需要用 sendkey了 sendkey ctrl-alt-f2
還有其他幾個指令,自己看看啦。
經過N久終于裝好了,現在可以啟動試試:
[[email protected] distro]#qemu redhat.img -enable-audio -user-net -m 64
-user-net 相當于VMware的nat,主系統可以上,虛拟機就可以
-m 64 使用64M記憶體,預設下使用128M
ctrl-alt-f 全屏
ctrl-alt 主機/虛拟機滑鼠切換
qemu還有一些其他參數,輸入qemu可以檢視其相關說明
initrd.img的原理與制作
〔擴充,原理,相關指令。下面的skyeye可能需要這部分知識〕
“Linux2.6 核心的 Initrd 機制解析” http://www.ibm.com/developerworks/cn/linux/l-k26initrd/
“Introducing initramfs, a new model for initial RAM disks”http://www.linuxdevices.com/articles/AT4017834659.html
””深入了解 Linux 2.6 的 initramfs 機制 (上)“http://blog.linux.org.tw/~jserv/archives/001954.html
MKINITRAMFS http://www.manpage.org/cgi-bin/man/man2html?8+mkinitramfs
安裝與使用
$ sudo apt-get install initramfs-tools
$ mkinitramfs /lib/modules/2.6.26/ -o initrd.img-2.6.26
x86虛拟調試環境的建立
參考
“debugging-linux-kernel-without-kgdb”http://memyselfandtaco.blogspot.com/2008/06/debugging-linux-kernel-without-kgdb.html
“使用 KGDB 調試 Linux 核心” http://blog.chinaunix.net/u/8057/showart_1087126.html
“透過虛拟化技術體驗 kgdb (1)” http://blog.linux.org.tw/~jserv/archives/002045.html
基于qemu和核心内置kgdb
缺點:相對于下節的“基于qemu和qemu内置gdbstub”,這個方法配置麻煩。
優點:真機遠端調試時隻能使用内置kgdb這個方法。
〔等待擴充,,,,〕
終極參考
“Using kgdb and the kgdb Internals”http://www.kernel.org/pub/linux/kernel/people/jwessel/kgdb/index.html
參考文章
“使用 KGDB 調試 Linux 核心” http://blog.chinaunix.net/u/8057/showart_1087126.html
基于qemu和qemu内置gdbstub
參考文章
“Debugging Linux Kernel Without KGDB Patch (Qemu + GDB)”http://memyselfandtaco.blogspot.com/2008/06/debugging-linux-kernel-without-kgdb.html
優缺點
優點:相對上節,優點是操作簡單,幾乎不需要什麼配置
缺點:真機的遠端調試,就隻能利用核心的内置kgdb了
說明:
如果長時間調試固定版本的核心,采取下面的把調試用核心安裝的虛拟機内部就可以了。但是如果是要頻繁地更換新核心或修改被調試核心,就需要采取把核心挂在虛拟機外部的形式。也就是用 -kernel 在虛拟機外面挂個核心, 再利用-append 傳遞起核心啟動參數等。〔待研究〕
〔太概過了,待擴充...〕
調試用核心的安裝過程:
1. 利用qemu安裝一個系統.
2. 在真機中配置并編譯一個用于安裝到虛拟系統中的新核心,注意配置時的選擇
* 配置和啟動
1. 核心選項
同時,為了能在系統運作時中斷系統并出發遠端 gdb,必須打開核心 Magic Sys-Rq 鍵選項 :[後記,沒實驗去掉會怎樣,估計沒影響]
CONFIG_MAGIC_SYSRQ=y
打開核心符号調試:
CONFIG_DEBUG_INFO=y
3. 在真機下編譯好虛拟機新核心的源碼
4. 結束qemu,用以下指令在真機上挂載虛拟硬碟。然後把編譯好的整個源碼目錄都拷貝到挂載好的虛拟硬碟上(真機上保留一份源碼)。
$ sudo mount -o loop,offset=32256 debian.img /mnt
拷貝完後,在真機上解除安裝虛拟硬碟
$ sudo umount /mnt
5.啟動虛拟機,進入舊系統,在新核心源碼根目錄下用以下指令給qemu的虛拟系統安裝一個新的核心
拷貝子產品
$ make modules_install
安裝核心
$ make install
制作initrd.img
$ cd /boot
$ mkinitramfs /lib/modules/2.6.26/ -o initrd.img-2.6.26
檢查/boot/grub/menu.lst 檔案内容是否妥當
6.用以下指令重新開機虛拟系統,并選擇進入新系統,确認新系統是否安裝成功。
$ shutdown -r now
調試:
1. 在真機新核心源碼目錄下建立一個檔案 .gdbinit 内容是
target remote localhost:1234
b start_kernel
#c
注意我把c注釋掉是因為ddd和gdb有切換的需要。見”gdb技巧”
2. 用以下指令啟動虛拟機
qemu -hda debian.img -cdrom ../debian-testing-i386-CD-1.iso -m 500 -S -s
3. 在真機新核心源碼目錄下運作
gdb ./vmlinux
[實驗記錄]
實驗過了,.config中不選擇kgdb,利用qemu照樣能調試。也不能調試start_kernel以前的代碼。比如head_32.S中的代碼。
CONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not set
但是不知CONFIG_HAVE_ARCH_KGDB是在menuconfig菜單的哪裡。想試試把這項去了qemu還能不能調試。
經測試,取消CONFIG_HAVE_ARCH_KGDB後,qemu也能進行調試。情況不變。看來qemu能完全脫離核心中的kgdb就能調試核心。
調試截圖
步驟2:
[email protected]:/new/myqemu/debian-x86$ qemu -hda debian.img -cdrom ../debian-testing-i386-CD-1.iso -m 500 -S -s
步驟3:
由下圖我們注意到:“基于qemu和qemu内置gdbstub”這個方法的調試,最早隻能從函數 start_kernel () 開始進行。
核心在start_kernel ()之前的初始化過程就無法觀察了。這就是這個方法的最大缺點。但下節利用skyeye調試arm-linux的
方法就可以從第一個機器指令開始進行。
[email protected]:/storage/myqemu/new/linux-2.6.26$ gdb ./vmlinux
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
0x0000fff0 in ?? ()
Breakpoint 1 at 0xc037f5ca: file init/main.c, line 535.
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:535
535 {
(gdb)
調試示意圖:
給sys_read下斷點
(gdb) b sys_read
Breakpoint 2 at 0xc017585e: file fs/read_write.c, line 360.
(gdb)
用快捷鍵 ctrl+x+2 打開tui,并按c繼續運作,而後攔截到sys_read
┌——fs/read_write.c————————————————————————————————————————————————————————————————————————————————————————————————————————┐
│354 { │
│355 struct file *file; │
│356 ssize_t ret = -EBADF; │
│357 int fput_needed; │
│358 │
│359 file = fget_light(fd, &fput_needed); │
B+>│360 if (file) { │
│361 loff_t pos = file_pos_read(file); │
│362 ret = vfs_read(file, buf, count, &pos); │
│363 file_pos_write(file, pos); │
│364 fput_light(file, fput_needed); │
│365 } │
│366 │
│367 return ret; │
┌—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————┐
│0xc017585a <sys_read> push %ebp │
│0xc017585b <sys_read+1> mov %esp,%ebp │
│0xc017585d <sys_read+3> push %esi │
B+>│0xc017585e <sys_read+4> mov $0xfffffff7,%esi │
│0xc0175863 <sys_read+9> push %ebx │
│0xc0175864 <sys_read+10> sub $0xc,%esp │
│0xc0175867 <sys_read+13> mov 0x8(%ebp),%eax │
│0xc017586a <sys_read+16> lea -0xc(%ebp),%edx │
│0xc017586d <sys_read+19> call 0xc0175f65 <fget_light> │
│0xc0175872 <sys_read+24> test %eax,%eax │
│0xc0175874 <sys_read+26> mov %eax,%ebx │
│0xc0175876 <sys_read+28> je 0xc01758b1 <sys_read+87> │
│0xc0175878 <sys_read+30> mov 0x24(%ebx),%edx │
│0xc017587b <sys_read+33> mov 0x20(%eax),%eax │
└—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————┘
remote Thread 42000 In: sys_read Line: 360 PC: 0xc017585e
(gdb) c
Continuing.
Breakpoint 2, sys_read (fd=3, buf=0xbfc781a4 "", count=512) at fs/read_write.c:360
(gdb)
arm虛拟調試環境的建立
利用qemu
利用qemu安裝debian linux
目标:
本節在qemu虛拟機上安裝一個基于arm的“桌面“系統,可以有X桌面,該虛拟系統能利用apt-get從debian的軟體庫下載下傳數不完的用交叉編譯已經編譯好的arm下的程式和工具。除了虛拟處理器是arm外,簡直就是PC機。可以進行應用程式的本機(在虛拟機内進行)調試。但是,本人裝的時候,如果選了安裝桌面環境,核心就啟動失敗,好像是提示檔案系統出錯。〔成功的麻煩把過程貼出來〕
過程是:
Debian on an emulated ARM machinehttp://www.aurel32.net/info/debian_arm_qemu.php
下面是過程的提煉步驟,友善檢視。
1.建立虛拟硬碟
$ qemu-img create -f qcow hda.img 40G
2.下載下傳必要檔案
$ wget http://people.debian.org/~aurel32/arm-versatile/vmlinuz-2.6.18-6-versatile
$ wget http://people.debian.org/~aurel32/arm-versatile/initrd.img-2.6.18-6-versatile
$ wget http://ftp.de.debian.org/debian/dists/etch/main/installer-arm/current/images/rpc/netboot/initrd.gz
2.安裝系統
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.18-6-versatile -initrd initrd.gz -hda hda.img -append "root=/dev/ram"
在安裝過程中,為了節省時間,在這步choose a mirror of the debian archive
選http 回車 ;
debian archive mirror country 選taiwan 回車;
debian archive mirror 選ftp.tw.debian.org
安裝好基本系統後,不要選擇安裝Desktop environment
安裝完成後,它提示你把CD光牒拿掉并重新開機系統時,終止掉qemu。并用下一步的指令啟動qemu.不要回車,否則又重新安裝。
3. 第一次啟動系統
$ qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.18-6-versatile -initrd initrd.img-2.6.18-6-versatile -hda hda.img -append "root=/dev/sda1"
4. 把舊的核心,intrd.img制作工具安裝到虛拟機的系統内(操作在虛拟機内)
$ apt-get install initramfs-tools
$ wget http://people.debian.org/~aurel32/arm-versatile/linux-image-2.6.18-6-versatile_2.6.18.dfsg.1-18etch1+versatile_arm.deb
$ su -c "dpkg -i linux-image-2.6.18-6-versatile_2.6.18.dfsg.1-18etch1+versatile_arm.deb"
5.其他更多的玩法請看原文http://www.aurel32.net/info/debian_arm_qemu.php
參考:
Debian ARM Linux on Qemu
http://909ers.apl.washington.edu/~dushaw/ARM/#SYSTEM
Running Linux for ARM processors under QEMU
http://iomem.com/index.php?archives/2-Running-Linux-for-ARM-processors-under-QEMU.html&serendipity[entrypage]=2
Debian on an emulated ARM machine
http://www.aurel32.net/info/debian_arm_qemu.php
利用qemu安裝能進行核心調試的系統
〔暫時沒法子,期待擴充。下面這個例子可以,但沒嘗試。估計這個方法與下節的利用skyeye的方法相比,沒有優勢。因為這個方法可能也是不能進行全程調試。但是下面網站的資料還是有一定參考價值的。〕
使用qemu-jk2410做為學習環境:
http://wiki.jk2410.org/wiki/%E4%BD%BF%E7%94%A8qemu-jk2410%E5%81%9A%E7%82%BA%E5%AD%B8%E7%BF%92%E7%92%B0%E5%A2%83
另外:看看下面這個站點,
Firmware Linux: http://landley.net/code/firmware/
利用skyeye
skyeye虛拟機的核心調試
相對于利用qemu的方式,用skyeye虛拟機調試核心有個很重要的
優點是:
調試可以從第一條機器指令開始。這對研究系統啟動過程提供了極大的便利。
skyeye的安裝與使用
該文非常好,好像沒啥要擴充的
SkyEye硬體模拟平台,第二部分: 安裝與使用
http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/
SkyEye User Manual http://www.skyeye.org/wiki/UserManual
http://skyeye.wiki.sourceforge.net/
參考文檔:
Linux-2.6.20 on XXX platform
http://skyeye.wiki.sourceforge.net/Linux
uClinux-dist-20070130 on XXX platform
http://skyeye.wiki.sourceforge.net/uClinux
http://www.linuxfans.org/bbs/thread-182101-1-1.html
安裝:
1. 安裝主程式
在ubuntu系統能進行線上安裝,但版本是v1.2,不是最新的
$sudo apt-get install skyeye
2. 測試套件
測試套件下載下傳後解壓開即可
位址:http://sourceforge.net/project/showfiles.php?group_id=85554
快速試玩
目的:
盡可能快的成功運作一個arm linux虛拟機。如果您化了很長時間也無法編譯出一個能運作的核心,或寫不出一個恰當的skyeye.conf時,在你的熱情受到打擊之前,我想這節是你急需的。
操作步驟:
1.依照上節說明安裝好主程式,下載下傳并解壓好測試套件
2.進入測試套件的目錄 skyeye-testsuite-1.2.5/linux/s3c2410/s3c2410x-2.6.14
可以看到有三個檔案initrd.img skyeye.conf vmlinux
3.運作虛拟機
$skyeye -e vmlinux
注意下面的提示,說明平時要注意在啟動指令前加上sudo
NOTICE: you should be root at first !!!
NOTICE: you should inmod linux kernel net driver tun.o!!!
NOTICE: if you don't make device node, you should do commands:
NOTICE: mkdir /dev/net; mknod /dev/net/tun c 10 200
NOTICE: now the net simulation function can not support!!!
NOTICE: Please read SkyEye.README and try again!!!
4.可以看到,一個2.6.14 版本的linux跑起來了,還帶有一個lcd.
快速配置能調試的環境
參考:
http://skyeye.wiki.sourceforge.net/linux_2_6_17_lubbock
環境條件:
1. ubuntu hardy 8.04
2. 安裝了debian提供的交叉編譯工具套件 arm-linux-gnueabi- (4.2版本)
目标:
這小節能得到基于pxa平台(類似s3c2410,也基于arm核心)的linux2.6.20核心的虛拟系統,具備調試功能。相比“基于qemu和qemu内置gdbstub”該節,利用skyeye的調試有那節所沒有的優點:調試時可以從核心運作的第一條指令開始〔這就是模拟硬體調試?〕。
參考手冊:
XScale PXA250開發手冊 http://soft.laogu.com/download/intelpxa250.pdf
ARMv5 體系結構參考手冊 http://www.arm.com/community/university/eulaarmarm.html
操作步驟:
1. 下載下傳linux-2.6.20 (由于交叉編譯器太新,如果利用linux-2.6.17則編譯不過)
2. 修改檔案include/asm-arm/arch-pxa/memory.h 第18行
#define PHYS_OFFSET UL(0xa0000000)
為
#define PHYS_OFFSET UL(0xc0000000)
3. 下載下傳核心配置選項,放置于linux-2.6.20源碼的根目錄下http://skyeye.wiki.sourceforge.net/space/showimage/skyeye_2.6.17_lubbock.config
這個下載下傳好的配置檔案已經幫我們做了的兩件事
首先,在block device菜單下配置了ramdisk和initrd的支援
其次,把核心原來的啟動參數改為
root=/dev/ram0 console=ttyS0 initrd=0xc0800000,0x00800000 rw mem=64M
4. 把下載下傳到的skyeye_2.6.17_lubbock.config更名為.config
5. 編譯核心
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
6. 建立檔案 skyeye.conf,内容如下:
cpu: pxa25x
mach: pxa_lubbock
mem_bank: map=I, type=RW, addr=0x40000000, size=0x0c000000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00800000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc1000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc1800000, size=0x02800000
7. 從skyeye的測試套件中拷貝initrd.img到linux-2.6.20源碼根目錄下。該initrd.img的路徑是:
skyeye-testsuite-1.2.5/linux/pxa/2.6.x/
8. 運作核心看看,在linux-2.6.20源碼根目錄下運作下面的指令。可以看到,核心成功運作
sudo skyeye -e vmlinux
調試:
1. 在linux-2.6.20源碼根目錄下運作指令:
sudo skyeye -d -e vmlinux
2. 在源碼根目錄下新開一個終端,并運作:
arm-linux-gnueabi-gdb ./vmlinux
gdb界面出來後
(gdb) target remote:12345
之後可以看到,下斷點,檢視彙編等一切調試功能和x86下都一樣。
3. ddd下如何調用arm-linux-gnueabi-gdb ? 答
$ ddd --debugger arm-linux-gnueabi-gdb ./vmlinux
為s3c2410配置2.6.26核心
〔啟動過程中有若幹錯誤提示,但核心能啟動成功并運作。有待研究〕
目标:
得到一個基于s3c2410cpu的2.6.26最新穩定核心的虛拟系統,能進行全程的核心調試,即調試能從第一條機器指令開始進行。
參考:
http://skyeye.wiki.sourceforge.net/Linux
http://www.linuxfans.org/bbs/thread-182101-1-1.html
環境條件:
1. ubuntu hardy 8.04
2. 安裝了debian提供的交叉編譯工具套件 arm-linux-gnueabi- (4.2版本)
操作步驟:
1.依據“安裝交叉編譯工具”這節,安裝好交叉編譯工具
2.修改源碼
将include/asm-arm/arch-s3c2410/map.h裡的
#define S3C2410_CS6 (0x30000000)
改為
#define S3C2410_CS6 (0xc0000000)
将include/asm-arm/arch-s3c2410/memory.h裡的
#define PHYS_OFFSET UL(0x30000000)
改為
#define PHYS_OFFSET UL(0xc0000000)
3.把預設.config替換為s3c2410版本
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- s3c2410_defconfig
3.修改配置檔案
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
進入[Device Driver] ->[ Character Driver] -> [Serial Driver] 等菜單下 ,
取消8250/16550 and compatible serial support的選擇
4.修改核心啟動指令
在Boot option --> Default kernel command string 裡輸入
mem=32M console=ttySAC0 root=/dev/ram initrd=0xc0800000,0x00800000 ramdisk_size=2048 rw
5.編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
6.從skyeye的測試套件中拷貝相應的檔案initrd.img和skyeye.conf到linux-2.6.26源碼根目錄下。這兩個檔案的位于
skyeye-testsuite-1.25/linux/s3c2410/s3c2410x-2.6.14/中
7.啟動虛拟機
[email protected]:~/dt/linux-2.6.26$ sudo skyeye -e vmlinux
8.啟動完成後那激動人心的logo如下
Welcome to
_ _____ __ __ _ _
/ / / __ / / /_/ / | | |_|
/ _ / | | | | / // // / | | _ ____ _ _ _ _
/ /_/ / | |__| | / / /_/ / /| | | | _ /| | | |/ // /
/ /___/ / | |__/ / | | | || |___ | | |_| | |_| |/ /
/_/ /_/| | /_/|_| |_||_____||_|_| |_|/____|/_//_/
ARMLinux for Skyeye
For further information please check:
http://www.skyeye.org/
BusyBox v1.4.1 (2007-02-10 01:19:06 CST) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
/bin/ash: can't access tty; job control turned off
/ $ uname -a
Linux skyeye 2.6.26 #2 Sun Oct 5 19:56:57 CST 2008 armv4tl unknown
/ $
調試:
1. 在linux-2.6.26源碼根目錄下建立檔案”.gdbinit”,内容是:
(gdb) target remote:12345
2. 在linux-2.6.26源碼根目錄下指令:
sudo skyeye -d -e vmlinux
3. 在源碼根目錄下新開一個終端,并運作:
arm-linux-gnueabi-gdb ./vmlinux
之後可以看到,下斷點,檢視彙編等一切調試功能和x86下都一樣。
4. ddd下如何調用arm-linux-gnueabi-gdb ? 答
$ ddd --debugger arm-linux-gnueabi-gdb ./vmlinux
截圖:
步驟2:
[email protected]:~/桌面/test/linux-2.6.26_s3c2410$ sudo skyeye -d -e vmlinux
big_endian is false.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x805f030
lcd_mod:1
dbct info: Note: DBCT not compiled in. This option will be ignored
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM ./initrd.img
start addr is set to 0xc0008000 by exec file.
debugmode= 1, filename = skyeye.conf, server TCP port is 12345
------------------------
步驟3:
[email protected]:~/桌面/test/linux-2.6.26_s3c2410$ arm-linux-gnueabi-gdb vmlinux
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i486-linux-gnu --target=arm-linux-gnueabi"...
stext () at arch/arm/kernel/head.S:80
80 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
Current language: auto; currently asm
(gdb) source extendinstr //載入輔助的gdb宏
--------------
用快捷鍵 ctrl+x+2 打開tui模式後的圖示,可看到調試是從第一條指令開始的。這對研究系統啟動過程提供了極大的便利。
┌——arch/arm/kernel/head.S————————————————————————————————————————————————————————————————————————————┐
>│80 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode │
│81 @ and irqs disabled │
│82 mrc p15, 0, r9, c0, c0 @ get processor id │
│83 bl __lookup_processor_type @ r5=procinfo r9=cpuid │
│84 movs r10, r5 @ invalid processor (r5=0)? │
│85 beq __error_p @ yes, error 'p' │
│86 bl __lookup_machine_type @ r5=machinfo │
│87 movs r8, r5 @ invalid machine (r5=0)? │
│88 beq __error_a @ yes, error 'a' │
│89 bl __vet_atags │
│90 bl __create_page_tables │
└————————————————————————————————————————————————————————————————————————————————————————————————————┘
>│0xc0008000 <stext> msr CPSR_c, #211 ; 0xd3 │
│0xc0008004 <stext+4> mrc 15, 0, r9, cr0, cr0, {0} │
│0xc0008008 <stext+8> bl 0xc00082f8 <__lookup_processor_type> │
│0xc000800c <stext+12> movs r10, r5 │
│0xc0008010 <stext+16> beq 0xc0008190 <__error_p> │
│0xc0008014 <stext+20> bl 0xc0008358 <__lookup_machine_type> │
│0xc0008018 <stext+24> movs r8, r5 │
│0xc000801c <stext+28> beq 0xc00081e8 <__error_a> │
│0xc0008020 <stext+32> bl 0xc00083a0 <__vet_atags> │
│0xc0008024 <stext+36> bl 0xc0008078 <__create_page_tables> │
│0xc0008028 <stext+40> ldr sp, [pc, #240] ; 0xc0008120 <__switch_data> │
└————————————————————————————————————————————————————————————————————————————————————————————————————┘
remote Thread 42000 In: stext Line: 80 PC: 0xc0008000
(gdb) b sys_read //下斷點
Breakpoint 1 at 0xc008cc4c: file fs/read_write.c, line 354.
(gdb) c
----------------
調試示意圖
效果可能與你機器上看到的不一樣。這個例子中,每個gdb單步指令都會自動顯示backtrace。這是因為本人使用了章節“gdb宏”中的extendinstr宏。
┌——include/asm/thread_info.h——————————————————————————————————————————————————————————————————————————————————————————————┐
│91 */ │
│92 static inline struct thread_info *current_thread_info(void) __attribute_const__; │
│93 │
│94 static inline struct thread_info *current_thread_info(void) │
│95 { │
│96 register unsigned long sp asm ("sp"); │
>│97 return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); │
│98 &