int 0x15 探测内存

转载自https://www.jianshu.com/p/703402070090

INT15h BIOS 中断的详细调用参数:
eax:e820h:INT 15 的中断调用参数;
edx:534D4150h (即 4 个 ASCII 字符―SMAP‖) ,这只是一个签名而已;
ebx:如果是第一次调用或内存区域扫描完毕,则为 0。 如果不是,则存放上次调用之后的计数值;
ecx:保存地址范围描述符的内存大小,应该大于等于 20 字节;
es:di:指向保存地址范围描述符结构的缓冲区,BIOS 把信息写入这个结构的起始地址。

此中断的返回值为:
cflags 的 CF 位:若 INT 15 中断执行成功,则不置位,否则置位;
eax:534D4150h (‘SMAP’) ;
es:di:指向保存地址范围描述符的缓冲区,此时缓冲区内的数据已由 BIOS 填写完毕
ebx:下一个地址范围描述符的计数地址
ecx :返回 BIOS 往 ES:DI 处写的地址范围描述符的字节大小
ah:失败时保存出错代码

通过调用 INT 15h BIOS 中断,递增 di 的值(20 的倍数),让 BIOS 帮我们查找出一个一个的内存布局 entry,并放入到一个 保存 地址范围描述符 结构的缓冲区中,供后续.
struct e820map {
int nr_map;
struct {
long long addr;
long long size;
long type;
} map[E820MAX];
};

probe_memory:
//对 0x8000 处的 32 位单元清零,即给位于 0x8000 处的struct e820map 的结构域 nr_map 清零
movl $0, 0x8000
xorl %ebx, %ebx
//表示设置调用 INT 15h BIOS 中断后,BIOS 返回的映射地址描述符的起始地址
movw $0x8004, %di
start_probe:
movl $0xE820, %eax    // INT 15 的中断调用参数
//设置地址范围描述符的大小为 20 字节,其大小等于 struct e820map 的结构域 map 的大小
movl $20, %ecx
//设置 edx 为 534D4150h (即 4 个 ASCII 字符“SMAP”),这是一个约定
movl $SMAP, %edx
//调用 int 0x15 中断,要求 BIOS 返回一个用地址范围描述符表示的内存段信息
int $0x15
//如果 eflags 的 CF 位为 0,则表示还有内存段需要探测
jnc cont
//探测有问题,结束探测
movw $12345, 0x8000
jmp finish_probe
cont:
//设置下一个 BIOS 返回的映射地址描述符的起始地址
addw $20, %di
//递增 struct e820map 的结构域 nr_map
incl 0x8000
//如果 INT0x15 返回的 ebx 为零,表示探测结束,否则继续探测
cmpl $0, %ebx
jnz start_probe
finish_probe :

上述代码正常执行完毕后,在 0x8000 地址处保存了从 BIOS 中获得的内存分布信息,此信息按照 struct e820map 的设置来进行填充。这部分信息将在 bootloader 启动 ucore 后,由ucore 的 page_init 函数来根据 struct 820map 的 memmap(定义了起始地址为 0x8000)来完成对整个机器中的物理内存的总体管理。

作者:101dog
链接:https://www.jianshu.com/p/703402070090
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python中可以使用scapy库来实现端口扫描探测。scapy是一个强大的网络包处理工具,可以用于构建、发送和解析网络数据包。 下面是使用scapy实现端口扫描探测的基本步骤: 1. 导入必要的模块和库: ```python from scapy.all import * import sys ``` 2. 定义一个函数来发送TCP SYN包并接收响应: ```python def scan_port(target_ip, port): src_port = RandShort() # 随机选择源端口号 response = sr1(IP(dst=target_ip)/TCP(sport=src_port, dport=port, flags="S"), timeout=1, verbose=0) if response is None: return "Closed" elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12: send_rst = sr(IP(dst=target_ip)/TCP(sport=src_port, dport=port, flags="AR"), timeout=1, verbose=0) return "Open" elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x14: return "Closed" ``` 3. 定义一个函数来扫描指定范围的端口: ```python def scan_ports(target_ip, start_port, end_port): for port in range(start_port, end_port+1): result = scan_port(target_ip, port) print(f"Port {port}: {result}") ``` 4. 在主程序中调用函数进行端口扫描: ```python if __name__ == "__main__": target_ip = sys.argv[1] # 从命令行参数获取目标IP地址 start_port = int(sys.argv[2]) # 从命令行参数获取起始端口号 end_port = int(sys.argv[3]) # 从命令行参数获取结束端口号 scan_ports(target_ip, start_port, end_port) ``` 这样,你就可以通过运行Python脚本,并传入目标IP地址、起始端口号和结束端口号来实现端口扫描探测了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值