我必须为我可以运行计算器的操作系统编写代码.它就像一个桌面计算器.为此,我正在阅读我已经完成第二阶段bootloader的breaknthorn操作开发系列引导加载程序处于实模式.在此之后,作者正在解释保护模式.我不想使用保护模式.我没有时间.所以我想通过使用bios中断在实模式下编写计算器.可能吗?我认为它可以写在引导程序的第二阶段(我不确定.)意味着我不必使用内核(我不确定).我不知道如何使用BIOS中断来处理键盘.任何人都可以给我一个链接来帮助我吗?如果我认为上面的任何错误是错误的,请纠正我.谢谢.
我一直对编程操作系统感兴趣.通过一些不同的网站进行研究,我遇到了一个有趣的概念(换句话说):如果你开始用#include编写你的引导加载程序,你已经犯了一个致命的错误.
我已经通过了K&R,整本书都包含在每节课中.在整个学习C中使用它,我不知道我学到了什么,使用stdio,什么没有.在没有stdio的情况下,你可以用C做什么?
我使用gdb调试了小程序.
我有GRUB的源代码.GRUB的第二阶段是用C语言编写的.我可以使用gdb进行调试吗?
是否可以调试引导加载程序?如果是,那怎么样?
我在许多ose(和一些引导程序)中看到,它们cli在从实模式切换到保护模式之前都禁用了interrupt().为什么我们需要这样做?
如何使用小代码空间减少十六进制ASCII字符转换的代码空间?
在嵌入式应用程序中,我有非常有限的空间(注1).我需要将字节从串行I/O转换为ASCII值'0'到'9'和'A'到'F'到通常的十六进制值0到15.此外,所有其他240种组合,包括' a'到'f',需要被检测到(作为错误).
图书馆的功能,例如scanf(), atoi(), strtol()是远太大而不能使用.
速度不是问题.代码大小是限制因素.
我现在的方法将256字节代码重新映射成256个代码,使得"0"到"9"和"A"到"Z"具有0到35的值.关于如何减少或不同方法的任何想法都是值得 赞赏的.
unsigned char ch = GetData(); // Fetch 1 byte of incoming data;
if (!(--ch & 64)) { // decrement, then if in the '0' to '9' area ...
ch = (ch + 7) & (~64); // move 0-9 next to A-Z codes
}
ch -= 54; // -= 'A' - 10 - 1
if (ch > 15) {
; // handle error …Run Code Online (Sandbox Code Playgroud) 我正在尝试为PIC18制作一个引导程序,所以我需要了解如何正确处理hex文件.例如,我理解如何处理以下十六行.
:040C0000E2EFFFF030
Run Code Online (Sandbox Code Playgroud)
04:字节数
0C00 :十六进制数字的地址
00:数据记录
E2EFFFF0:数据序列
30:校验和
所以我会知道如何处理上面的行,但是下面的十六行怎么样.
:020000040001F9
Run Code Online (Sandbox Code Playgroud)
02 :字节数
0000: 地址
04:扩展线性地址记录
0001:数据
F9:校验和
但究竟我该怎么做呢?我是否将这些数据写入该地址?你能把它翻译成机器语言吗?
顺便说一下,我的应用程序从地址开始,0c00bootloader从地址开始,在0020它上面是中断向量.谢谢!
更新
如果hex文件的第三行是以下,地址会FFC0改变吗?
:10FFC000FF00FF00FF00FF00FF00FF000001E9EF5E
Run Code Online (Sandbox Code Playgroud)
我在想,因为hex文件的第二行有04(扩展线性地址记录),那么我应该添加0001到第三行的地址FFC0,所以新地址就是这样的.
$0001 + $FFC0将等于1FFC0,所以第3行的下一组数据字节应写入此地址1FFC0,这是正确的吗?
我正在阅读这篇关于操作系统编程的精彩剧本
http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
在第 12 页上有一个简单的引导加载程序。
如果我理解正确,显示的代码是您必须在 NASM 中编写的代码才能让 BIOS 打印出字符。
我不明白的是:
它说
we need interrupt 0x10 and to set ah to 0x0e (to indicate tele-type mode)
and al to the ASCII code of the character we wish to print.
Run Code Online (Sandbox Code Playgroud)
但第一条指令是:
mov ah , 0x0e ;int 10/ ah = 0eh -> scrolling teletype BIOS routine
Run Code Online (Sandbox Code Playgroud)
我不明白该行的评论。为什么第一行代码没有说:
mov ah, 0xeh
int 0x10
Run Code Online (Sandbox Code Playgroud)
如果那是你需要做的?
感谢帮助!
集会:
[BITS 16]
global _start
_start:
mov ax, 0x07C0
mov ds, ax
mov si, hw
call print_string
jmp $
print_string:
mov ah, 0x0E
.char:
lodsb
cmp al, 0
je .exit
int 0x10
jmp .char
.exit: ret
times 0x100-($-$$) db 0
hw: db "Hello, World!", 0
times 510-($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)
组装这个:
$ nasm file.asm -felf -o file.o
Run Code Online (Sandbox Code Playgroud)
然后将其与:
$ ld -melf_i386 -o file.bin file.o --oformat binary
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
file.asm:(.text+0x6): relocation truncated to fit: R_386_16 against `.text'
Run Code Online (Sandbox Code Playgroud)
在稍微摆弄代码后,我发现更改mov si, hw …
我们使用Raspberry Pi嵌入式计算机将客户网络上的IP摄像机连接到基于云的录制服务.我们使用Raspbian,约50%是Wheezy,50%是Jessie.
我们面临的挑战是如何远程更新这些IFU上运行的软件.
我们当前的方法涉及使用SSH和Ansible.我们有一个复杂的Ansible脚本,它对Raspberry Pi进行了所有更改,我们已经在一定程度上实现了自动化,因此我们可以一次更新大量的Raspberry Pi.
但问题是这是非原子更新.Raspberry Pi不一定总是具有完全相同的软件包版本,具体取决于它们何时更新.它也可能升级到中途失败等.
我知道有几种方法可以通过下载新的"软件映像"进行原子升级,然后使用引导程序交换使用它.我认为OpenWRT可以做到这一点以及swupdate:https://github.com/sbabic/swupdate
有没有人曾经在Raspberry Pi上做过这样的事情?
谢谢
我对装配很新,但我正试图深入了解低级计算的世界.我正在尝试学习如何编写将作为引导加载程序代码运行的汇编代码; 所以独立于任何其他操作系统,如Linux或Windows.在阅读了本页和其他几个x86指令集列表之后,我想出了一些汇编代码,它应该在屏幕上打印10 A然后是1 B.
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
mov cl, 10 ; Use this register as our loop counter
mov ah, 0Eh ; This register holds our BIOS instruction
.repeat:
mov al, 41h ; Put …Run Code Online (Sandbox Code Playgroud)