我希望学习用于编写驱动程序和固件以及其他操作系统的裸机编程,但我不能为我的生活找到学习这些语言的任何好的学习材料。我为asm找到的宝石很少而且很远,我在直接十六进制的编程中找不到任何东西。当我直接说十六进制时,我指的是你在Linux内核的固件部分找到的东西。这是我在两个月的搜索中最接近的:http://www.omnimaga.org/index.php?topic=6272.0,本教程的信息太少,根据我的知识没有跟进。
TL; DR:我想学习十六进制。在哪里?
注意:我确实意识到这将是一项艰难,具有纪念意义和自虐的努力。你没必要告诉我。我会在学习材料的自我跋涉之旅中表现得比我没有的好。
第二个注释:我已经了解了很多关于操作系统,内核和I / O设备的内部工作方式,如果是抽象的,以及内存如何工作和分配,我已经掌握了扁平装配的基本知识。
我内心的怪人是不安的!
答案 0 :(得分:3)
好吧,如果你想知道如何用十六进制编程x86处理器,你需要的所有信息都在Intel Software Developer Manuals。最具体地说,您需要第2卷中的所有信息。第2章介绍了一般指令编码,第3章和第4章介绍了所有具体说明。
答案 1 :(得分:3)
如果这令你不安分的内心极客失望,我很抱歉,但我认为你误解了这些固件blob的目的以及它们的创建路径。
Linux中存在的固件文件是需要上传到接口适配器的大量内容,并且将通过该适配器上的任何智能执行。这些都是非常具体的ASIC,并且有几个可能的原因导致固件需要作为二进制blob上传:ASIC生产商不想泄露芯片的确切内部工作,或者不愿意(或者不能) )与用户共享源代码或必要的工具。
然而,这并不意味着固件blob是一些übergeek整天用十六进制代码猛烈抨击的结果,这些文件通常在工具链中开始,这些工具链支持与常规编程相当的工作流程:源代码是以某种更高级的语言生成的(但不一定是C或C ++之类的常见语言),并且代码被编译为二进制文件 - 固件文件。
所以,尽管这可能是一个让人们在夏天的第一次烧烤时惊叹的巧妙技巧,但是“编程十六进制”的实际应用几乎不存在,如果你真的想要深入,那么装配就足够深了。由于现在编译器技术的改进,即使大多数微控制器的开发都不再用于组装,所以你最好的选择是挖掘旧的DOS软件,你会发现很多用汇编代码编写的应用程序。
答案 2 :(得分:1)
查找正在学习的CPU的查找处理器操作码。这些代码是将组装pnumonics转换为“hex”值的rosetta stone,并且是汇编器所做的很好的事情。然后绝望地使用它。我有很强的装配背景,并且在调试版本构建时偶尔也会偶尔使用它。但直接的操作码读写并不再那么有用了。我最后一次做这种事情的是在Color Gameboy上编写自修改代码,以便在HBlanks期间有效地调整填充。正如我所说的那样,非常,非常特别,在现代时候用讨厌的缓存阻碍它们。
答案 3 :(得分: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)