我正试图从ASM中调用一个函数.我知道如何调用它,但我很难找到如何获得此函数的返回值.一个例子如下:
C代码:
int dummy() {
return 5;
}
Run Code Online (Sandbox Code Playgroud)
(N)ASM代码:
dummyFunction:
call dummy
;grab return into eax
inc eax ; eax should be 6 now
ret
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我花了很多时间开发一个操作系统并在我的低级引导加载程序上工作.但是现在我想从操作系统上抽出一些时间,而不是离开低级环境并做一些涉及安全的事情.
因此,我选择按照预启动身份验证方案构建自己的标准密码实用程序.由于我希望软件至少具有一点便携性,我希望它尽可能少地使用外部支持.我认为如果我以某种方式设法在运行的实模式操作系统内的自检和int 19引导程序之间"挂钩"到bios中,我会是最好的.
然而,找到关于如何修改bios代码的信息被证明是不可能的.我没有发现如何实现前面提到的.我只找到了描述如何刷新BIOS的页面.
有谁知道我如何读/写BIOS代码?或者有人可以提供描述这个的页面的链接?
我知道这不仅可能会破坏我的设备,但它也很可能,我知道风险并愿意接受它.
我想了解更多有关osdev的信息.所以我想从其他小内核中学习,以便在osdev上做得更好.学习osdev有什么好的内核吗?当然它需要是GPL所以我可以访问源代码并可以自由地修改它.
对于我正在研究的操作系统,我正在设计内核(我将实际上称之为"核心"只是为了与众不同,但它基本相同).如果我无法完成多任务,内存管理和其他基本操作,那么操作系统本身的细节就无关紧要了,所以我需要先解决这个问题.我有一些关于设计malloc例程的任务.
我认为malloc()要么是内核本身的一部分(我倾向于这个),要么是程序的一部分,但是我将不得不编写自己的C标准库实现方式,所以我写了一个malloc.在这方面我的问题实际上相当简单,C(或C++)如何管理它的堆?
我在理论类中一直被教导的是,堆是一个不断扩展的内存块,从指定的地址开始,并且在很多方面表现得像堆栈一样.通过这种方式,我知道在全局范围内声明的变量在开头,并且更多的变量被"推"到堆上,因为它们在各自的作用域中声明,超出作用域的变量只留在内存空间中,但是该空间被标记为空闲,因此如果需要,堆可以扩展更多.
我需要知道的是,C实际上如何以这种方式处理动态扩展堆?编译的C程序是否自己调用malloc例程并处理自己的堆,还是需要为它提供自动扩展的空间?另外,C程序如何知道堆的开始位置?
哦,我知道相同的概念适用于其他语言,但我希望任何示例都在C/C++中,因为我对这种语言最为满意.我也不想担心其他事情,比如堆栈,因为我认为我能够自己处理这样的事情.
所以我想我真正的问题是,除了malloc/free(处理获取和释放页面本身等)之外,程序是否需要操作系统提供其他任何东西?
谢谢!
编辑我更感兴趣的是C如何使用malloc与堆相关而不是在malloc例程本身的实际工作中.如果它有帮助,我在x86上这样做,但C是交叉编译器所以它应该没关系.^ _ ^
进一步编辑:我理解我可能会对术语感到困惑.我被教导说"堆"是程序存储诸如全局/局部变量之类的东西.我习惯于在汇编编程中处理"堆栈",我只是意识到我可能意味着相反.对我的一点研究表明,"堆"更常用于指代程序为自己分配的总内存,或者操作系统提供的内存页面的总数(和顺序).
那么,考虑到这一点,我如何处理不断扩大的堆栈?(看来我的C理论课有点......有缺陷.)
我已经坚持了好几个星期了,并且不知道我哪里出错了,因为NASM没有给我任何错误.由于评论,代码非常自我解释.
这是从BIOS加载的代码
;--------------------------------------------
; 'boot.asm'
; loaded from BIOS
[org 0x7C00]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
resetdisk:
mov ah, 0x00 ; reset function
mov dl, 0x00 ; drive
int 0x13 ; disk int
jc resetdisk
readdisk:
mov bx, 0x8000 ; segment
mov es, bx
mov bx, 0x0000 ; offset
mov ah, 0x02 ; read function
mov al, 0x03 ; sectors
mov ch, 0x00 ; …Run Code Online (Sandbox Code Playgroud) 我试图开发利用的bootloader 这个,但是当它时,它会显示:
disk read error!
Run Code Online (Sandbox Code Playgroud)
如果我忽略它,在后面的部分,它会显示我错误的内存映射.我也跟着其他一些消息来源但是徒劳无功.感觉就像我只是在复制他们正在做的事情.如果我做的甚至有点不同,每次都会产生一种新的错误.
我应该使用已经构建的引导加载程序还是该怎么做?
磁盘加载错误代码如下:
[org 0x7c00]
KERNEL_OFFSET equ 0x1000
mov [BOOT_DRIVE], dl
mov bp, 0x9000
mov sp, bp
mov bx, MSG_REAL_MODE
call print_string
call load_kernel
jmp $
print_string:
pusha
mov ah, 0x0e
loop:
mov al,[bx]
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
disk_load:
push dx
mov ah, 0x02
mov al, dh
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
jc disk_error
pop dx
cmp dh, …Run Code Online (Sandbox Code Playgroud) 我正在开发一个操作系统而不是编程内核,我正在设计内核.该操作系统面向x86架构,我的目标是现代计算机.估计所需的RAM数量为256Mb或更多.
使每个线程的堆栈在系统上运行的好大小是多少?我是否应该尝试以这样的方式设计系统:如果达到最大长度,堆栈可以自动扩展?
我想如果我没记错,RAM中的页面是4k或4096字节,这对我来说似乎不是很多.我绝对可以看到时间,特别是在使用大量递归时,我希望一次在RAM中有超过1000个积分.现在,真正的解决方案是让程序通过使用malloc和管理自己的内存资源来实现这一点,但实际上我想知道用户对此的意见.
4k足够大,可以用于现代计算机程序的堆栈吗?堆栈应该大于那个吗?堆栈是否应自动扩展以适应任何类型的大小?从实际开发人员的角度和安全角度来看,我对此感兴趣.
堆栈是4k太大了吗?考虑到正常的程序执行,特别是从C++中的类的角度来看,我注意到良好的源代码倾向于malloc/new创建类时所需的数据,以最小化函数调用中抛出的数据.
我甚至没有得到的是处理器缓存的大小.理想情况下,我认为堆栈将驻留在缓存中以加快速度,我不确定是否需要实现此目的,或者处理器是否可以为我处理它.我只是计划使用常规无聊的旧RAM进行测试.我无法决定.有什么选择?
我正在为我的内核做输入缓冲区的工作,我有一些问题.在双核机器上,我知道可以同时运行多个"进程".我不知道的是操作系统和各个程序如何保护数据中的冲突.
关于这个主题,我想知道两件事:
(1)中断发生在哪里?它们是否保证在一个核心而不是另一个核心上发生,并且可以用来确保一个核心上的实时操作不会被文件IO中断,这可以在另一个核心上处理吗?(我逻辑上假设中断会发生在第一个核心上,但总是如此,你会怎么说?或者每个核心都有自己的中断设置?这不会导致核心可以同时对同一个中断作出反应,可能以不同的方式?)
(2)双核处理器如何处理操作码内存冲突?如果一个内核正在读取内存中的地址,而另一个内核正在写入内存中同一个地址的同一时间,会发生什么?抛出异常,还是读取值?(我假设写入会以任何一种方式工作.)如果读取一个值,它是否保证在碰撞时是旧值还是新值?
我理解程序应该理想地编写以避免这些并发症,但操作系统肯定不能指望,并且需要能够处理此类事件而不会窒息.
在我的操作系统类中,我们希望使用我们自己在C中的一些简单系统调用来修改Linux内核.
什么是适合此目的的好发行版?我们不需要任何装饰,没有GUI,香草内核等.越基本越好.
这个问题是受r / osdev中的Reddit问题启发的,除了这个问题集中在SS寄存器上。可能有人说过RTFM(代表ISA条目MOV),但是当出现此问题时,即使在OS开发人员中,它也会得到不同的答案。
问题:使用MOV指令将SS设置为0x0000是否会#GP(0)在64位模式下引起一般性保护故障?例如:如果我处于64位模式,并且当前特权级别(CPL)为0,我应该期望看到#GP(0)带有以下代码段的:
NULL_SEL_RPL0 EQU 0
mov eax, NULL_SEL_RPL0 ; EAX = 0x0000 = NULL Selector with
; Requested Privilege Level (RPL) 0.
mov ss, eax ; Try to set SS with NULL selector 0x0000
; Should this cause a #GP(0) fault?
Run Code Online (Sandbox Code Playgroud)
《 Intel x86指令集参考》所说的MOV是:
Run Code Online (Sandbox Code Playgroud)Operation DEST ? SRC; Loading a segment register while in protected mode results in special checks and …