我有以下汇编代码:
global _start
section .text
_start:
add byte [eax], al
Run Code Online (Sandbox Code Playgroud)
编译和链接后,我尝试看到操作码:
$ objdump -d eax.o
eax.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start>:
...
$
Run Code Online (Sandbox Code Playgroud)
为什么我得到一个空操作码?
我可以更改EFLAGS寄存器中的VM标志吗?如果是这样,怎么样?
请注意,我不能只使用pushf,操纵堆栈上的值,然后popf.根据英特尔手册:
第2卷,第4.3章PUSHF:
"将整个EFLAGS寄存器复制到堆栈时,不会复制VM和RF标志(位16和17);而是在存储在堆栈中的EFLAGS映像中清除这些标志的值."
第2卷,第4.3章POPF:
"在特权级别0(或实地址模式,相当于特权级别0)的受保护,兼容性或64位模式下运行时,EFLAGS寄存器中的所有非保留标志(RF1,VIP,VIF除外) ,VM可能会被修改.VIP,VIF和VM不受影响."
我正在编写MBR并使用QEMU进行测试.
当将读取扇区用于内存(int 0x13, ah=0x02)时,该int指令似乎阻止了我的程序的执行,并且它继续挂起.我已经用各种打印语句对此进行了测试,以确认这是特定的指令阻塞.
什么可以使中断阻止?我认为这只能通过cli指令完成,即使这样也不会阻止int指令.
对于上下文,这是导致阻塞中断的代码read_sectors_16:
[bits 16]
[ORG 0x7C00]
jmp 0x000:start_16 ; ensure cs == 0x0000
reset_failure_str db 'error: boot disk reset', 13, 10, 0
read_failure_str db 'error: boot disk read', 13, 10, 0
boot_segaddr dw 0x7E00
read_attempt_str db 'read attempt', 13, 10, 0
end_read_attempt_str db 'end read attempt', 13, 10, 0
start_16:
;; Initialize segment registers
mov ax, cs
mov ds, ax
mov es, …Run Code Online (Sandbox Code Playgroud) 我的过滤器如下:
@Component
@Order(1)
public class MDCFilter implements Filter {
.....
Run Code Online (Sandbox Code Playgroud)
和应用程序属性
security.filter-order=0
Run Code Online (Sandbox Code Playgroud)
在上面的设置中 - 我的过滤器首先出现,然后是安全过滤器。但我在 Spring Security 过滤器之后需要 mdcFilter 。
最近,我们将应用程序从在tomcat中运行的Web应用程序移植到了具有嵌入式tomcat的spring boot应用程序。
在运行该应用程序几天后,内存和CPU使用率已达到100%。在堆转储分析中,发现有一堆未删除的http会话对象。
我可以在调试中看到使用配置的超时值创建的会话(比如说5分钟)。但是在此时间之后,无效不会触发。仅当我在超时时间段后再次请求时才调用它。
我已经将此行为与在Tomcat中运行的应用进行了比较,并且可以看到会话无效是由ContainerBackgroungProcessor线程[StandardManager(ManagerBase).processExpires()]触发的
我在Spring Boot应用程序中看不到该后台线程。
根据发现的一些建议进行了什么操作:
在application.properties:server.session.timout = 300或EmbeddedServletContainerCustomizer @Bean中设置的会话超时:factory.setSessionTimout(5,TimeUnit.MINUTES)
添加了HttpSessionEventPublisher和SessionRegistry bean
没有任何帮助,会话不会在到期时失效。
关于这个的一些线索?
我正在编写一个包含我的32位内核的Multiboot兼容的ELF可执行文件.我的主要问题是我在生成可执行文件时收到一系列链接器错误:
重定位被截断以适合:R_386_16对``.text'
链接器脚本,代码和构建脚本如下
我决定尝试在我的操作系统中实现VESA VBE图形.我在OSDev论坛中发现了一个现有的VESA驱动程序,我试图将它集成到我自己的操作系统中.我尝试将它添加到我的源目录,用NASM组装并将其链接到LD的最终可执行文件中.我收到的具体错误是:
vesa.asm:(.text+0x64): relocation truncated to fit: R_386_16 against `.text'
obj/vesa.o: In function `svga_mode':
vesa.asm:(.text+0x9d): relocation truncated to fit: R_386_16 against `.text'
vesa.asm:(.text+0xb5): relocation truncated to fit: R_386_16 against `.text'
obj/vesa.o: In function `done':
vesa.asm:(.text+0xc7): relocation truncated to fit: R_386_16 against `.text'
Run Code Online (Sandbox Code Playgroud)
导致错误的行(按顺序)如下:
mov ax,[vid_mode]
mov cx,[vid_mode]
mov bx,[vid_mode]
jmp 0x8:pm1
Run Code Online (Sandbox Code Playgroud)
我还评论了"链接器错误"的行
这是文件(vesa.asm):
BITS 32
global do_vbe
save_idt: dd 0
dw 0
save_esp: dd 0
vid_mode: dw 0
do_vbe: …Run Code Online (Sandbox Code Playgroud) 我想在下面的问题中了解AX寄存器的内容,我不明白我怎么知道示例中的[5000h]或[DI]是什么.
寄存器和存储器的状态定义为:
CS=3000 [53000]=BBBB [33000]=6666 [13000]=1111
DS=1000 [54000]=CCCC [34000]=7777 [14000]=2222
SS=5000 [55000]=DDDD [35000]=8888 [15000]=3333
DI=7000 [56000]=EEEE [36000]=9999 [16000]=4444
BP=4000 [57000]=FFFF [37000]=AAAA [17000]=5555
Run Code Online (Sandbox Code Playgroud)
AX中的每个指令的值是多少
MOV AX, [DI]MOV AX, [5000h]MOV AX, [BP+2000h]LEA AX, [BP+1000h]还是我,我的idt.S文件(使用gcc编译的Intel语法)出现了新问题。当我尝试编译以下代码时:
load_idt:
mov edx, (esp + 4) ; On this line
lidt (edx)
sti
ret
Run Code Online (Sandbox Code Playgroud)
我收到一个我真的不知道如何解决的错误:
Error: too many memory references for `mov'
Run Code Online (Sandbox Code Playgroud) 考虑该程序:
主程序
#include <stdlib.h>
void my_asm_func(void);
__asm__(
".global my_asm_func;"
"my_asm_func:;"
"call abort;"
"ret;"
);
int main(int argc, char **argv) {
if (argv[1][0] == '0') {
abort();
} else if (argv[1][0] == '1') {
__asm__("call abort");
} else {
my_asm_func();
}
}
Run Code Online (Sandbox Code Playgroud)
我编译为:
gcc -ggdb3 -O0 -o main.out main.c
Run Code Online (Sandbox Code Playgroud)
然后我有:
$ ./main.out 0; echo $?
Aborted (core dumped)
134
$ ./main.out 1; echo $?
Aborted (core dumped)
134
$ ./main.out 2; echo $?
Segmentation fault (core dumped)
139
Run Code Online (Sandbox Code Playgroud)
为什么我只在最后一次运行时收到分段错误,而不是预期的中止信号?
man 7 …
我想初始化堆栈上的本地结构。
Records STRUCT
data1 DWORD ?
data2 DWORD ?
data3 DWORD ?
data4 DWORD ?
Records ENDS
.CODE
main:
mov ebp, esp
sub esp, SIZEOF Records
Run Code Online (Sandbox Code Playgroud)
如何创建一个命名实例,struct Records然后用它来初始化数据成员?我想将该struct指令与点运算符一起使用,而不是指针加法。
我一开始为结构体分配了空间,那么我应该做什么呢?