0

我希望学习用于编写驱动程序和固件以及其他操作系统的裸机编程,但我终其一生都找不到任何好的学习材料来学习这些语言。我为 asm 找到的宝石很少而且相差甚远,而且我找不到任何关于直接十六进制编程的东西。当我说直接的十六进制时,我的意思是你可以在 Linux 内核的固件部分找到的那种东西。这是我在两个月的搜索中得到的最接近的结果:http ://www.omnimaga.org/index.php?topic=6272.0并且本教程的信息太少,并且没有根据我的知识进行跟进。

TL;DR:我想学习十六进制。在哪里?

注意:我确实意识到这将是一项多么困难、具有纪念意义和受虐狂的努力。你不必告诉我。在这个自我鞭笞的旅程中,我会比没有学习材料做得更好。

第二点:我已经对操作系统、内核和 I/O 设备的内部工作原理以及内存的工作原理和分配方式有了很多了解,并且我已经对平面组装有基本的了解。

我内心的极客是不安分的!

4

4 回答 4

3

好吧,如果您想知道如何以十六进制编程 x86 处理器,您需要的所有信息都在英特尔软件开发人员手册中。最具体地说,您需要第 2 卷中的所有信息。第 2 章涵盖一般指令编码,第 3 章和第 4 章涵盖所有特定指令。

于 2013-02-08T23:49:57.583 回答
3

如果这让你内心不安的极客感到失望,我很抱歉,但我认为你误解了这些固件 blob 的目的以及它们的创建路径。

Linux 中存在的固件文件是需要上传到接口适配器的大量内容,并将由该适配器上存在的任何智能执行。通常这些是高度特定的 ASIC,需要将固件作为二进制 blob 上传有几个潜在原因:ASIC 生产商不想透露芯片的确切内部工作原理,或者不愿意(或能够) 与用户共享源代码或必要的工具。

但是,这并不意味着固件 blob 是某些 übergeek 整天疯狂地输入十六进制代码的结果,这些文件通常在工具链中开始它们的生命,这些工具链支持与常规编程相当的工作流:源代码是以某种高级语言(但不一定是 C 或 C++ 等常见语言之一)生成,并且该代码被编译为二进制文件 - 固件文件。

所以,虽然这可能是一个让人们在夏天的第一次烧烤时惊叹的巧妙技巧,但“编程十六进制”的实际应用几乎不存在,如果你真的想深入,汇编已经足够深入了。由于当今编译器技术的改进,即使大多数微控制器开发不再以汇编方式完成,所以最好的办法可能是挖掘旧的 DOS 软件,在那里你会发现很多用汇编代码编写的应用程序。

于 2013-02-09T00:26:25.730 回答
1

去查找你正在研究的 CPU 的处理器操作码。这些代码是将汇编 pnumonics 转换为“十六进制”值的罗塞塔石碑,并且是汇编器所做的大量工作。然后绝望地使用它。我在汇编方面有很强的背景,并且在调试发布版本时仍然偶尔会使用它。但是直接操作码读写不再那么有用了。我最后一次做这种事情是在 Color Gameboy 上编写自我修改代码,以便在 HBlanks 期间有效地填充调色板。正如我所说,非常、非常专业化,在现代没有用,因为讨厌的缓存会挡道。

于 2013-02-09T00:34:27.273 回答
0

您是否尝试过这个名为“Linux Assembly Tutorial”的文档

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 )

于 2013-02-08T23:52:56.303 回答