无法使用类型命令连接文件,说语法不正确
Unable to use type command to concatenate files, says syntax is not correct
我正在构建自己的内核并在我的项目中有 2 个 .bin 文件 boot.bin 和 kernel.bin,我想将它们连接成一个名为 [=52] 的 .img 文件=].我正在使用 makefile 执行此操作。
我在下面包含了我的 makefile 的代码:
all: bootloader
bootloader:
mkdir boot\bin
nasm boot/boot.asm -f bin -o boot/bin/boot.bin
nasm boot/kernel_entry.asm -f elf -o boot/bin/kernel_entry.bin
gcc -m32 -ffreestanding -c boot/main.c -o boot/bin/kernel.o
ld -m i386pe -o boot/bin/kernel.img -Ttext 0x1000 boot/bin/kernel_entry.bin boot/bin/kernel.o
objcopy -O binary -j .text boot/bin/kernel.img boot/bin/kernel.bin
type boot/bin/boot.bin boot/bin/kernel.bin > os.img
clear:
rm -f boot/boot.img
run:
qemu-system-x86_64.exe -drive format=raw,file=os.img
然而,当我运行这个脚本使用make命令时,它说type命令的语法是不正确的。这可能是一个简单的问题,但是我在网上查了很多资源,语法应该没问题。
我在 运行 执行 make 命令时遇到了下面提到的错误:
type boot/bin/boot.bin,boot/bin/kernel.bin > os.img
The syntax of the command is incorrect.
我已经测试了我的 .asm 和 .c 文件,它们工作得很好。
如果可能需要,下面是我的 .asm 和 .c 文件的代码:
boot.asm
[org 0x7c00]
[bits 16]
section code
.switch:
mov bx, 0x1000 ; location of the code being loaded from the hard disk
mov ah, 0x02
mov al, 30 ; number of sectors to read from the hard disk
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
cli ; turn off interrupts
lgdt [gdt_descriptor] ; load GDT table
mov eax, cr0
or eax, 0x1
mov cr0, eax ; make the switch
jmp code_seg:protected_start
startupmsg: db 'Welcome to Wyvern!', 0
[bits 32]
protected_start:
mov ax, data_seg
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
; update stack pointer
mov ebp, 0x90000
mov esp, ebp
call 0x1000
jmp $
gdt_begin:
gdt_null_descriptor:
dd 0x00
dd 0x00
gdt_code_seg:
dw 0xffff
dw 0x00
db 0x00
db 10011010b
db 11001111b
db 0x00
gdt_data_seg:
dw 0xffff
dw 0x00
db 0x00
db 10010010b
db 11001111b
db 0x00
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_begin - 1
dd gdt_begin
code_seg equ gdt_code_seg - gdt_begin
data_seg equ gdt_data_seg - gdt_begin
times 510 - ($ - $$) db 0x00 ; pads the file with 0s, making it the right size
db 0x55
db 0xaa
kernel.asm
[bits 32]
START:
[extern _start]
call _start
jmp $
main.c
char* video_memory;
int start() {
video_memory = (char*) 0xb8000;
for (int i = 0; i < 2 * 25 * 80; i += 2) {
*(video_memory + i) = 0;
*(video_memory + i + 1) = 0x0A;
}
}
我还在下面附上了我的项目的目录结构:
如果还有什么需要修改的,欢迎大家补充。
我设法弄清楚类型给出了这个错误,因为参数格式不正确。所以我对我的 makefile 进行了以下更改:
- 在 type 命令中,将所有 forward-slashes 替换为
反斜杠。
- 每个文件名用引号引起来
这帮我解决了问题。
我正在构建自己的内核并在我的项目中有 2 个 .bin 文件 boot.bin 和 kernel.bin,我想将它们连接成一个名为 [=52] 的 .img 文件=].我正在使用 makefile 执行此操作。
我在下面包含了我的 makefile 的代码:
all: bootloader
bootloader:
mkdir boot\bin
nasm boot/boot.asm -f bin -o boot/bin/boot.bin
nasm boot/kernel_entry.asm -f elf -o boot/bin/kernel_entry.bin
gcc -m32 -ffreestanding -c boot/main.c -o boot/bin/kernel.o
ld -m i386pe -o boot/bin/kernel.img -Ttext 0x1000 boot/bin/kernel_entry.bin boot/bin/kernel.o
objcopy -O binary -j .text boot/bin/kernel.img boot/bin/kernel.bin
type boot/bin/boot.bin boot/bin/kernel.bin > os.img
clear:
rm -f boot/boot.img
run:
qemu-system-x86_64.exe -drive format=raw,file=os.img
然而,当我运行这个脚本使用make命令时,它说type命令的语法是不正确的。这可能是一个简单的问题,但是我在网上查了很多资源,语法应该没问题。
我在 运行 执行 make 命令时遇到了下面提到的错误:
type boot/bin/boot.bin,boot/bin/kernel.bin > os.img
The syntax of the command is incorrect.
我已经测试了我的 .asm 和 .c 文件,它们工作得很好。
如果可能需要,下面是我的 .asm 和 .c 文件的代码:
boot.asm
[org 0x7c00]
[bits 16]
section code
.switch:
mov bx, 0x1000 ; location of the code being loaded from the hard disk
mov ah, 0x02
mov al, 30 ; number of sectors to read from the hard disk
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
cli ; turn off interrupts
lgdt [gdt_descriptor] ; load GDT table
mov eax, cr0
or eax, 0x1
mov cr0, eax ; make the switch
jmp code_seg:protected_start
startupmsg: db 'Welcome to Wyvern!', 0
[bits 32]
protected_start:
mov ax, data_seg
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
; update stack pointer
mov ebp, 0x90000
mov esp, ebp
call 0x1000
jmp $
gdt_begin:
gdt_null_descriptor:
dd 0x00
dd 0x00
gdt_code_seg:
dw 0xffff
dw 0x00
db 0x00
db 10011010b
db 11001111b
db 0x00
gdt_data_seg:
dw 0xffff
dw 0x00
db 0x00
db 10010010b
db 11001111b
db 0x00
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_begin - 1
dd gdt_begin
code_seg equ gdt_code_seg - gdt_begin
data_seg equ gdt_data_seg - gdt_begin
times 510 - ($ - $$) db 0x00 ; pads the file with 0s, making it the right size
db 0x55
db 0xaa
kernel.asm
[bits 32]
START:
[extern _start]
call _start
jmp $
main.c
char* video_memory;
int start() {
video_memory = (char*) 0xb8000;
for (int i = 0; i < 2 * 25 * 80; i += 2) {
*(video_memory + i) = 0;
*(video_memory + i + 1) = 0x0A;
}
}
我还在下面附上了我的项目的目录结构:
如果还有什么需要修改的,欢迎大家补充。
我设法弄清楚类型给出了这个错误,因为参数格式不正确。所以我对我的 makefile 进行了以下更改:
- 在 type 命令中,将所有 forward-slashes 替换为 反斜杠。
- 每个文件名用引号引起来
这帮我解决了问题。