Linux102系列会详细讲解Linux0.11版本中的102个文件,本文讲解linux0.11的第39个文件
【Linux102】39-include/asm/io.h的文件源码。
1. include/asm/io.h的主要作用
io.h定义了一系列宏,这些宏是 x86 架构下直接操作硬件 I/O 端口的底层工具:
| inb/outb 用于基本的端口读写,带_p后缀的版本(inb_p/outb_p)增加了延迟,适配慢速设备 |
| 通过内联汇编直接控制 CPU 寄存器(AL、DX 等),实现了最高效的硬件交互 |
| 通常用于操作系统内核、设备驱动等需要直接操作硬件的场景 |
2.源码用到的文件
NO
3.源码版
#define outb(value, port) \
__asm__("outb %%al,%%dx" ::"a"(value), "d"(port))
#define inb(port) ({ \
unsigned char _v; \
__asm__ volatile("inb %%dx,%%al" : "=a"(_v) : "d"(port)); \
_v; \
})
#define outb_p(value, port) \
__asm__("outb %%al,%%dx\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \
"1:" ::"a"(value), \
"d"(port))
#define inb_p(port) ({ \
unsigned char _v; \
__asm__ volatile("inb %%dx,%%al\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \
"1:" : "=a"(_v) : "d"(port)); \
_v; \
})
4.源码注释版本
// 向指定端口输出一个字节数据
// value: 要输出的数据(8位)
// port: 目标端口地址(16位)
#define outb(value, port) \
__asm__ ("outb %%al, %%dx" /* 汇编指令: 将AL寄存器的值输出到DX寄存器指定的端口 */ \
:: "a" (value), "d" (port) /* 约束条件:
* "a" (value): 将value放入EAX寄存器(AL是EAX的低8位)
* "d" (port): 将port放入EDX寄存器
*/ \
)
// 从指定端口输入一个字节数据并返回
// port: 要读取的端口地址(16位)
// 返回值: 从端口读取的8位数据
#define inb(port) ({ \
unsigned char _v; /* 声明临时变量存储读取的值 */ \
__asm__ volatile ( /* volatile确保汇编不会被编译器优化掉 */ \
"inb %%dx, %%al" /* 汇编指令: 从DX寄存器指定的端口读取数据到AL寄存器 */ \
: "=a" (_v) /* 输出约束: 将EAX寄存器(AL)的值存入变量_v */ \
: "d" (port) /* 输入约束: 将port放入EDX寄存器 */ \
); \
_v; /* 返回读取到的值 */ \
})
// 向指定端口输出一个字节数据,并加入短暂延迟
// 用于需要等待的硬件设备,确保数据已被处理
#define outb_p(value, port) \
__asm__ ( \
"outb %%al, %%dx\n" /* 输出数据到端口 */ \
"\tjmp 1f\n" /* 跳转到标签1f (1:) */ \
"1:\tjmp 1f\n" /* 再次跳转,创建短暂延迟 */ \
"1:" /* 延迟结束的标签 */ \
:: "a" (value), "d" (port) /* 与outb相同的寄存器约束 */ \
)
// 从指定端口输入一个字节数据,加入短暂延迟并返回
// 用于需要等待的硬件设备,确保数据已准备好
#define inb_p(port) ({ \
unsigned char _v; /* 临时变量存储读取的值 */ \
__asm__ volatile ( \
"inb %%dx, %%al\n" /* 从端口读取数据 */ \
"\tjmp 1f\n" /* 跳转延迟 */ \
"1:\tjmp 1f\n" /* 再次跳转增加延迟 */ \
"1:" /* 延迟结束标签 */ \
: "=a" (_v) /* 输出约束: 结果存入_v */ \
: "d" (port) /* 输入约束: 端口地址存入EDX */ \
); \
_v; /* 返回读取到的值 */ \
})
5.源码图像版

6.源码注释版图像


本系列将带领大家从0开始循序渐进学习汇编语言,直至完全掌握这门底层语言。同时给出学习平台DOSBox的使用教程。
本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。
专注讲解Linux中的常用命令,共计发布100+文章。
本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。
😉【Linux102】11-kernel/vsprintf.c
😉【Linux102】12-include/stdarg.h
😉【Linux102】14-kernel/system_call.s
😉【Linux102】15-include/linux/sched.h
😉【Linux102】18-include/signal.h
😉【Linux102】19-include/sys/types.h
😉【Linux102】20-include/linux/kernel.h
😉【Linux102】21-include/asm/segment.h
😉【Linux102】22-include/linux/head.h
😉【Linux102】23-include/linux/mm.h
😉【Linux102】24-include/linux/fs.h
😉【Linux102】26-include/sys/wait.h
😉【Linux102】27-include/inux/tty.h
😉【Linux102】28-include/termios.h
😉【Linux102】30-include/sys/times.h
😉【Linux102】31-include/sys/utsname.h
😉【Linux102】32-include/stddef.h
😉【Linux102】33-include/linux/sys.h
和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。
😉【Linux】Linux概述1-linux对物理内存的使用
关于小希
😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言、汇编等知识。
我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦
小希的座右铭:
别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:
下一期想看什么?在评论区留言吧!我们下期见!


被折叠的 条评论
为什么被折叠?



