- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个简单的引导加载程序,其职责是加载内核,将内核重新定位到写入位置并跳转到内核。但切换到保护模式并跳转到内核后会无限重启。谁能指出我哪里错了,以及如何纠正它?谢谢!
bootsec.asm
[bits 16]
[org 0x7C00]
mov si, hello_string
_print:
mov al, [si] ;ASCII value is in register AL
cmp al, 0x00
jz print_ok
mov ah, 0x0E ;Tell BIOS that we need to print one charater on screen.
mov bh, 0x00 ;Page no.
mov bl, 0x07 ;Text attribute 0x07 is lightgrey font on black background
int 0x10
inc si
jmp _print
print_ok:
enable_a20:
mov ax, 0x2401
int 0x15
load_next_stage:
mov ah, 2
mov al, 4
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
;mov es, 0
mov bx, 0x9000
int 0x13
jc load_next_stage
load_done:
cli ; disable interrupts
lgdt [gdtr32] ; load GDT register with start address of Global Descriptor Table
lidt [idtr32]
;mov eax, cr0
;or al, 1
;mov cr0, eax
mov ax, 0x0001
lmsw ax ; set PE (Protection Enable) bit in CR0 (Control Register 0)
jmp 0x08:gdt32enable ; we need a jump like this to reload the CS.
align 8
gdt32enable:
[bits 32]
mov ax,0x0010 ; set the segment selector for data that we...
mov ds,ax ; ... set to DS
mov es,ax ; ... set to ES
mov fs,ax ; ... set to FS
mov gs,ax ; ... set to GS
mov ss,ax ; ... and set to SS
;mov esp,stack32+STACKSIZE ; and we create a stack
;----------------------------------------------------------------------------------------------
; load GDT ok, end enter protected mode
;----------------------------------------------------------------------------------------------
;mov edi,0xb8000 ; set the screen buffer location
;mov ecx,80*25 ; set the nbr of attr/char pairs to write
;xor eax,eax ; clear eax
;mov ax,0x0f20 ; set the attr/char pair to write
;rep stosw ; clear the screen
mov eax, load_gdt_ok
mov edi,0xb8000 ; go back to the first column
print_gdt:
mov cl, [eax]
cmp cl, 0x00
jz print_gdt_done
or cx, 0x9c<<8
mov [edi], cx
add edi,2 ; move to the next position on the screen
inc eax
jmp print_gdt
print_gdt_done:
;jmp done_move
cld
;mov eax, 0x100000
mov edi, 0x100000
mov esi, 0x9000
mov ecx, 512
move_kernel:
mov eax, [esi]
mov [edi], eax
add edi, 4
add esi, 4
dec ecx
jz done_move
jmp move_kernel
done_move:
mov esp, 0x200000
;sti
;jmp $
;jmp 0x9000
jmp 0x100000
hello_string:
db 'Hello World from bootsec...', 0 ;HelloWorld string ending with 0
load_gdt_ok:
db "Load GDT ok, and enter protected mode..................", 0
align 8
gdt32:
dq 0 ; GDT entry 0x00
dq 0x00cf9a000000ffff ; DGT entry 0x08
dq 0x00cf92000000ffff ; GDT entry 0x10
gdt32End:
gdtr32: ; this is out initial GDTR
dw gdt32End-gdt32-1
dd gdt32
idtr32:
dw 0
dd 0
times 510 - ($ - $$) db 0 ;Fill the rest of sector with 0
dw 0xAA55 ;Add boot signature at the end of bootloader
内核.c
#include <stdint.h>
#define __ISA_IO_base 0x0
#define __VGA_BASE (__ISA_IO_base + 0xb8000)
#define asm __asm__
typedef struct init_gdt32
{
uint64_t dummy;
uint64_t code;
uint64_t data;
}init_gdt32 __attribute__((align(8)));
init_gdt32 init_gdt32_desc = {0,0x00cf9a000000ffff,0x00cf92000000ffff};
void kentry()
{
asm volatile ("lgdt %0;"::"m"(init_gdt32_desc):);
asm (
"mov $0x0010, %ax;"
"mov %ax, %ds;"
"mov %ax, %es;"
"mov %ax, %fs;"
"mov %ax, %gs;"
"mov %ax, %ss;"
// "mov edi, 0xB8000;"
// "movl $500, %ecx;"
// "movl $0x1F201F20, %eax;"
// "rep stosd;"
// "movl $0x00b8000, %edi;"
// "movq 0x1F6C1F6C1F651F48, %eax;"
// "movq %rax, (%edi);"
// "movq $0x1F6F1F571F201F6F, %rax;"
// "movq %rax, 8(%edi);"
// "movq $0x1F211F641F6C1F72, %rax;"
// "movq %rax, 16(%edi);"
);
kmain();
}
void __writew(uint32_t addr, uint16_t val)
{
(*(uint16_t*) addr) = val;
}
int kmain()
{
int i = 0;
char* lint = "----------------------->hello in kernel...";
int offset = 80*10;
int len = 42;
for (i = 0; i < len; ++i)
{
__writew(__VGA_BASE + offset + i*2, (0x2c<<8) | lint[i]);
// __writew(__VGA_BASE + offset + i*2+1, 0x9c);
}
while(1);
return 0;
}
内核.test.ld
OUTPUT_FORMAT(elf64-x86-64)
ENTRY(kentry)
KERNEL_START = 0x100000;
SECTIONS {
. = 0x0 ;
kernel_lma = . ;
. = KERNEL_START;
__kernel_start = . ;
.text ALIGN(0x1000) : AT(kernel_lma) {
*(.text)
}
.data ALIGN(8) : AT(ADDR(.data) - KERNEL_START){
*(.data)
}
.bss ALIGN(8) : AT(ADDR(.bss) - KERNEL_START){
*(.bss)
}
__kernel_end = . ;
}
生成文件
TARGET-BIN=kernel.bin
LINK-SCRIPT=kernel.test.ld
AS=nasm
CC=gcc
LD=ld
CFLAGS=-ffreestanding -O2 -nostdlib -z max-page-size=0x1000
LD-SCRIPT=-T $(LINK-SCRIPT)
OBJCOPY=objcopy
OBJS = kernel.o
.PHONY: build
build: $(TARGET-BIN)
$(TARGET-BIN) : $(OBJS)
echo Linking...
$(LD) $(LD-SCRIPT) -o $@ $(OBJS)
$(OBJCOPY) -O binary $@ kernel.img
%.o : %.c
echo compiling...
$(CC) -c $(CFLAGS) $< -o $@
%.o : %.s
echo assembling...
$(AS) -f elf64 $< -o $@
disk:
cat boot.o kernel.img > OSImage
dd if=./OSImage of=./osdisk.img
boot:
nasm bootsec.asm -o boot.o
.PHONY: clean
clean:
echo Cleaning...
rm -fr *.o *.bin *.img
最佳答案
如果kmain()
运行,请检查WDT并禁用它(如果启用)。
关于c - 如何正确从bootloader跳转到内核(重启无限麻烦),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35122227/
我有一个 UWP 应用程序(在 Windows/Microsoft Store 中发布),我正在进行新的更新,我在我的应用程序中使用了 Template10,它具有深色和浅色主题,并且在 Window
我是 spring batch 的新手,有一些关于暂停/恢复的问题。看了spring batch的文档,好像没有内置的pause或者resume功能。但是,我从主站点找到了这个用例: http://d
我正在编写一个网络服务并有以下观察结果:即使我只是将一个文本文件添加到存储 web 服务引用的所有 dll 的目录 (bin),appdomain 也会刷新。 这会导致存储在字典(在其中一个 dll
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
Hadoop 1.0.3 工作 36 小时后说: INFO mapred.JobClient: map 42% reduce 0% mapred.JobClient: Job Failed
我使用 AVAssetWriter 将视频录制到文件中。所以我为此创建了类。 link to gist 然后在项目的某处我推送记录并开始录制视频。 func start() { assetWriter
我想要一个在后台运行的 python 脚本(无限循环)。 def main(): # inizialize and start threads [...] try:
我在重新启动 Activity 时感到困惑。我有两个功能可以很好地完成同一任务。请指导我哪个最好,为什么? public void restart() { Intent
重启sidekiq的正确方法是什么。它似乎在我启动它时缓存了我的 worker 代码,所以每次我对我的 worker 进行更改时我都需要重新启动它。我正在使用 Ctrl/C 执行此操作,但该过程需要很
我在我的 Android 模拟器上安装了新字体。说明说我必须重新启动设备。我尝试使用“关机”按钮,但它只显示“正在关机”并且什么也不做。即使我去 adb shell 并运行“重启”它也会挂起。 任何想
启动操作 ? 1
关闭 service nginx stop systemctl stop nginx 启动 service nginx start systemctl start n
正在学习Linux中。。。一边学一边记录着。。所有观点只是个人观点 Linux有个文件 /etc/inittab 复制代码 代码如下:
如果我运行 systemctl restart kubelet它会影响其他正在运行的节点吗?它会停止集群吗?你能预见任何影响吗? 任何帮助,将不胜感激! 最佳答案 在回答之前,小声明:重启不是由于对
嗯,问题是我有一个在 MATE 上完美运行的 Abyssus Razer,但是 在 Debian、Elementary、OpenSUSE 和其他平台上,默认 设置 super 慢。 我用 解决了这个问
我在 Ubuntu 16.04 上安装了 NGINX 并编辑了我的配置。 当我想用 sudo service nginx restart 重新启动时我得到错误: Job for nginx.servi
我已经在我的 Ubuntu 上安装了 Gearman Job Server(又名 Gearmand)1.0.6: Distributor ID: Ubuntu Description: Ubun
我有一个 WiX Burn使用 ManagedBootstrapperApplicationHost 的自定义安装程序。安装必备 Microsoft Windows Installer 之一后4.5
我已经使用 brew install mosquitto 在我的 mac 上安装了蚊子代理. 通常我不会给出任何命令来启动 mosquitto 服务器。当我打开我的 mac 时它会自动启动。 我已经使
我有一个带有 2 个容器的 pod test-1495806908-xn5jn。我想重新启动其中一个名为 container-test 的项目。是否可以重新启动 Pod 中的单个容器以及如何重新启动?
我是一名优秀的程序员,十分优秀!