我是学习OS开发的新手.从我读过的书中,它说启动加载器会将第一个MBR复制到0x7c00,然后从实模式开始.
并且,示例从16位汇编代码开始.但是,当我查看今天的linux内核时,arch/x86/boot有'header.S'和'boot.h',但实际代码是在main.c中实现的.
这似乎对"不编写汇编"很有用.但是,这是如何在Linux中专门完成的?我可以粗略地想象可能有特殊gcc
选项和链接策略,但我看不到细节.
我试图通过XBee Shield和XBee Explorer 启用Arduino的无线编程.我在网上看过两个教程,XBee无线电和ATmega168/ATmega328的无线启动,向您展示如何做到这一点.
但是,这两个教程都讨论了使用组件将接收器XBee连接到Arduino.那么XBee Shield处理接收器XBee和Arduino之间的通信,因此额外的组件不是必需的(或者是它们).他们谈论使用电容器或晶体管来无线复位Arduino.这是否已经可以使用XBee Shield,或者我可以对其进行一些修改以使其成为可能吗?
如何使用现有的Arduino IDE无线编程我的Arduino?
引导加载程序无论如何都会在该地址加载它?为什么要在程序中指定这个?
我一直在尝试设计一个简单的操作系统,只是引导扇区,以及带有中断的16位实模式.我终于能够制作OS/bootloader,我在虚拟盒中进行了测试,并且它有效.
然后我将图像刻录到CD上,并将其启动到我的旧桌面,使用Pentium 4,BIOS修订版A05和1GB内存,并且它工作得很好 - 一个简单的操作系统,在顶部打印一个"标题"屏幕,所有它允许您键入屏幕,注册几个键导航光标.
然后我将光盘插入我1年前的笔记本电脑,配备i5处理器,2.6 GB RAM和A05 BIOS Revision,光标似乎随机移动,高速打印随机字符,最后停在anscii字符处235(扩展字符表的一部分),此时键盘工作正常,指定移动光标的键工作正常,只是标题.这是我测试它的计算机,对其进行了编译,编写并将其刻录成CD.(我使用Linux Mint 12 OS)
我已经跳过了我认为需要做的所有"箍":制作了一个iso图像,遵循El Torito'无仿真'启动标准,启动签名,512字节,并写入正确的扇区.
这是我的代码的问题,我没有做某事,或者这是正常的吗?
这是我的代码(NASM x86语法):
;**************************
; Note OS, Experimental OS
;**************************
[org 0x7C00]
[bits 16]
start:
jmp loader ;jump to the actual start of bootloader
times 8 - ($ - $$) db 0 ;pad eight bytes
;*********************
;El Torito Boot Info Table
;*********************
;in nasm, I couldn't figure out how to reserve bytes, in the middle of .text
;so I zeroed it out.
times 56 db …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在汇编中编写引导加载程序和内核以用于学习目的.当我组装代码并使用它启动虚拟机时,引导加载程序似乎正常工作,但内核永远不会启动.我想我正在跳错了指令,但不知道我需要做些什么更正才能解决我的问题.还有可能我试图使软盘不正确,但我认为这不是问题.当我在十六进制编辑器中查看图像文件时,似乎它们被正确附加.另一个原因可能是从软盘读取错误的扇区.我正试图让内核在引导加载程序之后立即进入扇区.
要构建和运行此代码,我在Windows Vista x64中执行以下操作:
nasm bootloader_2.asm -f bin -o bootloader_2.bin
nasm kernel_2.asm -f bin -o kernel.bin
partcopy bootloader_2.bin bootloader_2.img 0d 511d
partcopy kernel_2.bin kernel_2.img 0d 511d
copy bootloader.img /b + kernel.img POS_2.img
Run Code Online (Sandbox Code Playgroud)
然后我使用Oracle VM Virtual Box将POS_2.img挂载为软盘驱动器,并在来宾系统上运行它.
结果是
帕特里克的Bootloader开始了.软盘已重置.读取内核扇区内核扇区
.内核永远不会启动.
这是我的代码
bits 16
org 0x7C00
boot: jmp loader
; OEM Parameter block / BIOS Parameter block (wtf is this for?)
times 0Bh-$+boot DB 0
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: …
Run Code Online (Sandbox Code Playgroud) 我最近有一个想法开始开发自己的操作系统.在阅读了我认为可以帮助我完成这项任务的不同网站上的许多文章后,我想我现在可以开始了.(顺便说一句,我使用的是Ubuntu 14.10 x64)
由于软盘是开发操作系统最简单的存储介质,我购买了3.5英寸软盘驱动器.
我使用NASM作为汇编编译器,qemu作为模拟器.使用dd命令,我将一个现有的和空的(就文件而言)软盘克隆到一个名为floppy.img.bak的文件中.
之后,我在x86程序集中编写了一个简单的bootloader:
bootloader.asm
org 7C00h
jmp 0x0000:start ;go
msg db 'Loading Kernel...', 0
start:
;update the segment registers
mov ax, cs
mov ds, ax
mov es, ax
mov si, msg
print: ;prints a string
lodsb ;load next char
cmp al, 0 ;if null terminator...
je reset ;...jump to reset:
mov ah, 0Eh ;print AL
mov bx, 7
int 10h
jmp print ;if not null terminator, continue printing
reset: ;resets the floppy drive
mov ax, …
Run Code Online (Sandbox Code Playgroud) 我将编写我的第一个"hello world"bootloader程序.我在CodeProject网站上找到了一篇文章.这里是它的链接.
http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part
Up-to assembly level编程很顺利,但是当我用c编写程序时,与本文中给出的相同,我遇到了运行时错误.我的.c
文件中写的代码如下.
__asm__(".code16\n");
__asm__("jmpl $0x0000,$main\n");
void printstring(const char* pstr)
{
while(*pstr)
{
__asm__ __volatile__("int $0x10": :"a"(0x0e00|*pstr),"b"(0x0007));
++pstr;
}
}
void main()
{
printstring("Akatsuki9");
}
Run Code Online (Sandbox Code Playgroud)
我使用创建了图像文件floppy.img
并检查输出bochs
.它显示的是这样的东西
Booting from floppy...
S
Run Code Online (Sandbox Code Playgroud)
它应该是Akatsuki9
.我不知道我在哪里弄错了?任何人都可以帮我找到为什么我会遇到这个运行时错误?
我尝试创建一个打印"hello world"的简单引导程序.
当我调用一个只打印"hello world"的函数时,我可以这样做,但是当我调用一个函数来打印一个特定的字符串时,什么也没发生.
为此,我使用两个文件.第一个是boot.ld,第二个是boot.cpp(它也可以在C中使用boot.c).
首先,我从终端创建软盘:
dd if =/dev/zero of = floppy.img bs = 512 count = 2880
其次,我编译代码(boot.cpp和boot.ld):
gcc -c -g -Os -m64 -ffreestanding -Wall -Werror boot.cpp -o boot.o
ld -static -Tboot.ld -nostdlib --nmagic -o boot.elf boot.o
objcopy -O binary boot.elf boot.bin
最后,我将boot.bin添加到floppy.img中:
dd if = boot.bin of = floppy.img
现在我们只需要从VirtualBox的存储面板添加软盘并启动我们的虚拟机.
源代码
来自:http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part
boot.ld
ENTRY(main);
SECTIONS
{
. = 0x7C00;
.text : AT(0x7C00)
{
*(.text);
}
.sig : AT(0x7DFE)
{
SHORT(0xaa55);
}
}
Run Code Online (Sandbox Code Playgroud)
boot.cpp(或boot.c)
void cout(); …
Run Code Online (Sandbox Code Playgroud) 我是UEFI应用程序开发的新手.
我的要求是,
我需要从我的UEFI应用程序(app.efi
)源代码运行UEFI shell命令.需要有关如何做到这一点的指导.
例,
cp
UEFI shell中的命令用于将文件从一个路径复制到另一个路径.我想在我的application(app.efi
)源代码中以编程方式执行此操作.
编辑:我正在寻找类似于system("command");
Linux中的功能.
怎么做到这一点?
我闪烁着Sparkfun边缘板与SparkFun串行基本突围- CH340G使用一些的例子是,IDE中提供了公报教程。
尽管它已经正常运行了很多次,主要是针对具有TensorFlow Lite和SparkFun Edge的微控制器上的示例example1_edge_test和AI,有时在闪烁时会收到此消息:
Connecting with Corvette over serial port /dev/ttyUSB0...
Sending Hello.
Received response for Hello
Received Unknown Message
msgType = 0x131
Length = 0x5800
['0x80', '0x6', '0xf0', '0xa5', '0x31', '0x1', '0x0', '0x58', '0x0', '0x3', '0x0', '0x0', '0x0', '0xa0', '0xff', '0x4', '0x0', '0x2', '0x0', '0x0', '0x0', '0x7', '0x0', '0x0', '0x0', '0x1', '0x0', '0x0', '0x0', '0xff', '0xa3', '0x2d', '0xff', '0xff', '0x5f', '0x5', '0x0', '0x1', '0x0', '0x0', '0x0', …
Run Code Online (Sandbox Code Playgroud) bootloader ×10
assembly ×5
c ×3
linux ×2
16-bit ×1
arduino ×1
c++ ×1
command ×1
entry-point ×1
gcc ×1
ide ×1
kernel ×1
linux-kernel ×1
nasm ×1
shell ×1
tensorflow ×1
uart ×1
uefi ×1
x86-16 ×1
xbee ×1