2013-02-08 79 views
0

我希望學習編寫驅動程序和固件以及其他操作系統的裸機編程,但是我不能在我的生活中找到用於學習這些語言的良好學習材料。我爲asm找到的寶石很少,而且在十六進制編程中找不到任何東西。當我說直十六進制時,我的意思是你會在Linux內核的固件部分找到的東西。這是我用兩個月的搜索得到的最接近的:http://www.omnimaga.org/index.php?topic=6272.0,本教程的信息太少,沒有跟進我的知識。尋找低級編程語言的學習材料

TL; DR:我想學習十六進制。哪裏?

注:我確實意識到這將是一個艱難的,不朽的和受虐狂的努力。你不必告訴我。通過學習材料,我會在這個自我鞭撻的旅程中變得更好,而不是我不會。

秒注意:我已經知道了很多關於操作系統的內部工作,內核和I/O設備,如果而是抽象,以及如何記憶的作品和分配,我已經有了一個基本的平面組裝的把握。

我內心的怪人是不安的!

+0

有一個原因,你不寫機器代碼 - 它是非常具體的個別處理器。快速谷歌出現:http://www.programmersheaven.com/mb/pharabee/344751/344751/how-to-write-a-assembler/ – 2013-02-08 23:50:07

+0

根據你想要去的方向,我建議或者osdev wiki或Linux內核模塊接口教程。 – Dougvj 2013-02-09 00:13:26

回答

3

那麼,如果你想知道如何以十六進制編程x86處理器,你需要的所有信息在Intel Software Developer Manuals。最具體地說,您需要第2卷中的所有信息。第2章介紹了常規指令編碼,第3章和第4章介紹了所有具體說明。

+0

Omg謝謝!我需要一個好的操作碼參考 – 2013-02-09 17:04:22

0

您是否嘗試過這個文檔,標題爲 「Linux的大會教程」

http://docs.cs.up.ac.za/programming/asm/derick_tut/

它,例如,一個 「Hello World」 曰(逐字複製):

section .data 
    hello:  db 'Hello world!',10 ; 'Hello world!' plus a linefeed character 
    helloLen: equ $-hello    ; Length of the 'Hello world!' string 
            ; (I'll explain soon) 

section .text 
    global _start 

_start: 
    mov eax,4   ; The system call for write (sys_write) 
    mov ebx,1   ; File descriptor 1 - standard output 
    mov ecx,hello  ; Put the offset of hello in ecx 
    mov edx,helloLen  ; helloLen is a constant, so we don't need to say 
        ; mov edx,[helloLen] to get it's actual value 
    int 80h    ; Call the kernel 

    mov eax,1   ; The system call for exit (sys_exit) 
    mov ebx,0   ; Exit with return code of 0 (no error) 
    int 80h 

(谷歌查詢我得到這個從:https://www.google.co.uk/search?q=how+to+write+drivers&oq=how+to+write+drivers

3

如果這讓你失去了你不安的內心怪胎我很抱歉,但我認爲你錯誤地解釋了這些固件blob的用途以及它們的創建路徑。

Linux中存在的固件文件是需要上傳到接口適配器的東西的大塊,並且將由該適配器上存在的任何智能執行。通常這些都是高度特定的ASIC,並且存在幾種可能的原因,爲什麼需要將固件作爲二進制塊來上傳:ASIC製造商不希望泄漏芯片的確切內部工作,或者不願意(或者不能)與用戶共享源代碼或必要的工具。

然而,這並不意味着固件blob是übergeek整天大肆渲染十六進制代碼的結果,這些文件通常在工具鏈中開始他們的生活,這些工具鏈支持與常規編程相當的工作流程:源代碼是用更高級的語言生成的(但不一定是像C或C++這樣常見的語言之一),代碼將被編譯爲二進制文件 - 固件文件。因此,雖然這可能是在夏季的第一次燒烤時給人們帶來驚喜的巧妙技巧,但是「編程十六進制」的實際應用幾乎是不存在的,如果你真的想深入,組裝不僅僅是深足夠。現在由於編譯器技術的改進,即使大多數微控制器的開發工作都不是在裝配中完成的,所以最好的辦法可能是挖掘舊的DOS軟件,你會發現許多用匯編代碼編寫的應用程序。

1

查找處理器您正在學習的CPU的Op-Codes。這些代碼是將裝配pnumonics轉換爲「十六進制」值的rosetta石頭,並且是彙編程序的一大優點。然後絕望永遠使用它。我在裝配時有很強的背景,並且在調試發佈版本時偶爾會偶爾使用它。但是直接的操作碼讀寫並不是那麼有用。我最後一次做這樣的事情是在Color Gameboy上寫自修改代碼,以便在HBlanks中進行高效的調色板填充。正如我所說,非常非常專業化,並且在現代困難的高速緩存阻礙了它的發展。