歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用 Visual Studio 2013 編譯調試 linux-0.11【附相關文件下載】

使用 Visual Studio 2013 編譯調試 linux-0.11【附相關文件下載】

日期:2017/3/1 9:47:04   编辑:Linux編程

強烈推薦學習 Linux 源碼從 0.11 版開始入手,原因嘛,見下面推薦兩本 Linux 0.11 源碼分析書籍前言。

《Linux 內核完全注釋》 http://www.linuxidc.com/Linux/2009-12/23225.htm
《Linux內核設計的藝術》 http://www.linuxidc.com/Linux/2014-03/98417.htm

為什麼用 Visual Studio 2013 就不用多說了吧,絕對比任何專用的源代碼閱讀軟件都強悍。
查看函數調用層次一類的功能,為分析源代碼提供最大的方便。
而且 MASM Intel 格式的匯編代碼,可比 GCC AT&T 格式的便於閱讀多了。
編輯匯編代碼,推薦使用 Notepad++,完美支持 MASM 語法高亮。

首先下載我修改好的 VS 版 Linux 0.11 源碼,解壓後打開解決方案。
右鍵點擊 Image 項目,重新生成,按 Ctrl + F5 運行即可。
會啟動調試版的 Bochs 虛擬機,加載新編譯的軟盤鏡像運行。
虛擬硬盤內,帶 gcc 1.40 編譯環境,可以自己寫程序測試各個系統調用功能。
閱讀代碼中有不明白的,直接插入 printk,重新生成運行,幾秒鐘的事。

關於 rm, chmod 一類命令提示 Not owner 的問題,是由於 0.11 版無 lstat 系統調用。
可以直接從 0.12 版復制新加的系統調用,補完即可,相信看過這部分代碼後,大家都能做到。
#define __NR_sigsuspend 72
#define __NR_sigpending 73
#define __NR_sethostname 74
#define __NR_setrlimit 75
#define __NR_getrlimit 76
#define __NR_getrusage 77
#define __NR_gettimeofday 78
#define __NR_settimeofday 79
#define __NR_getgroups 80
#define __NR_setgroups 81
#define __NR_select 82
#define __NR_symlink 83
#define __NR_lstat 84
#define __NR_readlink 85
#define __NR_uselib 86

linux-0.12 下載地址:見本文最後

Bochs 的調試技巧
h 查看各命令幫助,一目了然,就不多說了,簡單說下常用的。
b 斷點
c 繼續
s 逐語句
p 逐過程
r 寄存器

調試指定函數的方法
打開 Release 目錄下 system.map 文件,搜索函數名,如:
0001:0000ca00 _main 0000da00 f main.obj
地址是取符號名後面那個,即 Rva+Base 地址。在 Bochs 控制台輸入 b 0x0000da00 即可在 main 函數處中斷。

和原版配置文件的區別
修改根文件系統設備號
在 bootsect.asm 以下行設置
ROOT_DEV = 0301h

修改鍵盤布局方案
在 keyboard.asm 以下行設置
KBD_US EQU

Linux 在 VS 下的實現
由於 PE 文件在內存中,會把 PE 頭也載入,PE 頭最大 4096,既 Rva 值。
也就是說,鏈接時,即使基地址設置成0,代碼的偏移也會是 4096。
所以,直接給 system 模塊載入到內存 1000h 處,原版是 0。
1000h 剛好是 pg0 的地址,所以給 pg_dir 手工定義成 0。
然後 pg0 定義在程序入口處,其它頁 pg1 之類的 ORG 依次減 1000h。

由於 MASM 無 ljmp 指令,實現段間跳轉使用 retf 指令,如下:
push 代碼段
push 地址
retf

VS 下最大的問題是不能鏈接 16 位代碼,LINK 沒有 /TINY 參數選項。
解決的方法就是不使用絕對定位,給絕對定位改成固定內存地址,直接使用 32 位模式鏈接即可。
利用 ORG 固定變量地址後,定義下面這樣的宏來操作變量,可讀性也非常強,基本不受影響。
sread = ds:[01C0h]
head = ds:[01C2h]
track = ds:[01C4h]

關於 GCC 內嵌匯編,語法原因,用宏無法實現,基本上都改寫成了內聯函數的形式,效率上應該沒啥差別。
對指定內存地址讀寫和除法取模的匯編代碼,都用 C 重寫了,調用又不頻繁,用匯編沒啥意義,重寫後更易閱讀。

VS 版 Linux 0.11 與 linux-0.12 下載地址:

------------------------------------------分割線------------------------------------------

FTP地址:ftp://ftp1.linuxidc.com

用戶名:ftp1.linuxidc.com

密碼:www.linuxidc.com

在 2014年LinuxIDC.com\3月\使用 Visual Studio 2013 編譯調試 linux-0.11【附相關文件下載】

下載方法見 http://www.linuxidc.com/Linux/2013-10/91140.htm

------------------------------------------分割線------------------------------------------

運行截圖:

Copyright © Linux教程網 All Rights Reserved