2013-02-08 78 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中进行高效的调色板填充。正如我所说,非常非常专业化,并且在现代困难的高速缓存阻碍了它的发展。