03.段寄存器

一、什么是段寄存器?

段寄存器是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用。在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但段寄存器只有16位,因此段寄存器中只能存储段号(segment selector,也译作“段选择符”),再由段号映射到存在内存中的GDT(global (segment) descriptor table,全局段号记录表),读取段的信息。

二、如何根据段寄存器查询段描述符?

1.使用windbg输入r gdtr可以查询到GDTR表的地址
2.使用dq命令已8字节读取GDTR表
3.根据段寄存器的值获取到当期段寄存器在GDTR表的下标,然后就可以获取到段描述符

实战步骤
1.在虚拟内获取一个DS段,值为0X0023,二进制为 100 0 11,如图
在这里插入图片描述
2. 拆解DS段的二进制,得到段选择子的, RPL为11,代表LEVEL是3坏,TI是0,代表这个段选择子是在GDT表中,index二进制为100,代表段选择子在GDT表中的下标为4
3. 如图在windbg中输入R GDTR查询到GDTR表的地址,在使用dq命令读取GDTR表
在这里插入图片描述
4. 在GDTR表中第4位为00cff300`0000ffff 这个就是我们要找的段描述符
5. 根据段描述符就可以知道,该段的所有信息
6. 高32位 0000 0000 1100 1111 1111 0011 0000 0000
7. 低32位 0000 0000 0000 0000 1111 1111 1111 1111
8. 段基地址:0000 0000 0000 0000 0000 0000 0000 0000
9. G :4KB单位 D/B: 32 位段 L:32位代码段标志 AVL:0 p:段存在位 DPL:3环 s:数据段或者代码段 type:0011
10.段界限 1111 1111 1111 1111 1111在这里插入图片描述
G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KB
D/B: 该位为 0 表示这是一个 16 位的段,1 表示这是一个 32 位段
L: 64位代码段标志
AVL: 该位是用户位,可以被用户自由使用
LIMIT: 段的界限,单位由 G 位决定。数值上(经过单位换算后的值)等于段的长度(字 节)- 1
P: 段存在位,该位为 0 表示该段不存在,为 1 表示存在。
DPL:段权限
S: 该位为 1 表示这是一个数据段或者代码段。为 0 表示这是一个系统段(比如调用门,中断门等)
TYPE: 根据 S 位的结果,再次对段类型进行细分。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 modbus.h 头文件示例: ```c #ifndef __MODBUS_H__ #define __MODBUS_H__ #include <stdint.h> /* Modbus function codes */ #define MODBUS_FC_READ_COILS 0x01 #define MODBUS_FC_READ_DISCRETE_INPUTS 0x02 #define MODBUS_FC_READ_HOLDING_REGISTERS 0x03 #define MODBUS_FC_READ_INPUT_REGISTERS 0x04 #define MODBUS_FC_WRITE_SINGLE_COIL 0x05 #define MODBUS_FC_WRITE_SINGLE_REGISTER 0x06 #define MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F #define MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10 /* Modbus error codes */ #define MODBUS_EXCEPTION_ILLEGAL_FUNCTION 0x01 #define MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS 0x02 #define MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE 0x03 #define MODBUS_EXCEPTION_SLAVE_DEVICE_FAILURE 0x04 #define MODBUS_EXCEPTION_ACKNOWLEDGE 0x05 #define MODBUS_EXCEPTION_SLAVE_DEVICE_BUSY 0x06 #define MODBUS_EXCEPTION_MEMORY_PARITY_ERROR 0x08 #define MODBUS_EXCEPTION_GATEWAY_PATH_UNAVAILABLE 0x0A #define MODBUS_EXCEPTION_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND 0x0B /* Modbus data types */ typedef uint8_t modbus_byte_t; typedef uint16_t modbus_word_t; /* Modbus register struct */ typedef struct { modbus_word_t address; modbus_word_t value; } modbus_register_t; /* Modbus context */ typedef struct { int socket; uint8_t *request; uint8_t *response; int request_length; int response_length; } modbus_t; /* Modbus function prototypes */ int modbus_read_coils(modbus_t *ctx, int address, int num_coils, uint8_t *coil_status); int modbus_read_discrete_inputs(modbus_t *ctx, int address, int num_inputs, uint8_t *input_status); int modbus_read_holding_registers(modbus_t *ctx, int address, int num_registers, modbus_register_t *registers); int modbus_read_input_registers(modbus_t *ctx, int address, int num_registers, modbus_register_t *registers); int modbus_write_single_coil(modbus_t *ctx, int address, int coil_status); int modbus_write_single_register(modbus_t *ctx, int address, int register_value); int modbus_write_multiple_coils(modbus_t *ctx, int address, int num_coils, uint8_t *coil_status); int modbus_write_multiple_registers(modbus_t *ctx, int address, int num_registers, modbus_register_t *registers); #endif /* __MODBUS_H__ */ ``` 该头文件定义了 Modbus 协议的相关常量、数据类型和函数声明。其中包括了 Modbus 的功能码、异常码、数据类型、寄存器结构体和 Modbus 上下文等。函数声明包括了常用的读写操作函数,如读线圈、读寄存器、写单个线圈等。该头文件保留了 debug 参数,用于方便调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值