阅读赵炯博士的Linux内核分析0.12完全注释笔记(A heavily Commented Linux Kernel Source Code Linux Version 0.11)
Read the fucking source code -Linus Bendict Torvalds
基础:
具备一些基本的 C 语言知识和 Intel CPU 汇编语言知识 有关 C 语言最佳
参考资料仍是 Brain W. Kernighan 先生和 Dennis M. Ritchie 先生合著的《The C Programming Language》
一书。而汇编语言的资料则可以参考任意一本讲解与 Intel CPU 相关的汇编语言教材。另外还需要一些
嵌入式汇编语言的资料。有关嵌入式汇编的权威信息都包含在 GNU gcc 编译器手册中。
源码下载链接:http://www.oldlinux.org/Linux.old/Linux-0.12/sources/
80x86汇编语言程序设计教程 : https://pan.baidu.com/s/1kTC4Ldd
I/O 端口寻址和访问控制方式:统一编址和独立编址
在普通 Linux 系统下通过查看/proc/ioports 文件可以得到相关控制器或设置使用的 I/O 地址范围,见如下所示。
C编译的过程
如何在C语言中嵌入汇编代码
基本格式如下:
asm(“汇编语句”
: 输出寄存器
: 输入寄存器
: 会被修改的寄存器);
除第 1 行以外,后面带冒号的行若不使用就都可以省略。其中,“asm”是内联汇编语句关键词;“汇
编语句”是你写汇编指令的地方;“输出寄存器”表示当这段嵌入汇编执行完之后,哪些寄存器用于存放
输出数据。此地,这些寄存器会分别对应一 C 语言表达式值或一个内存地址;“输入寄存器”表示在开始
执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一 C 变量或常数值。“会
被修改的寄存器”表示你已对其中列出的寄存器中的值进行了改动,gcc 编译器不能再依赖于它原先对这些
寄存器加载的值。如果必要的话,gcc 需要重新加载这些寄存器。因此我们需要把那些没有在输出/输入寄
存器部分列出,但是在汇编语句中明确使用到或隐含使用到的寄存器名列在这个部分中。示例如下:
说明:
1. 干什么的 ? 嵌入一个汇编语言宏函数
2.怎么写? 写在({})中 __asm__ 表示开始 __res 表示 表达式输出的值 斜杠"\" 表示连成一行