相关疑难解决方法(0)

x86内核中的键盘IRQ

我正在尝试编写一个非常简单的内核用于学习目的.在阅读了大量有关x86架构中PIC和IRQ的文章后,我发现这IRQ1是键盘处理程序.我正在使用以下代码打印正在按下的键:

#include "port_io.h"

#define IDT_SIZE 256
#define PIC_1_CTRL 0x20
#define PIC_2_CTRL 0xA0
#define PIC_1_DATA 0x21
#define PIC_2_DATA 0xA1

void keyboard_handler();
void load_idt(void*);

struct idt_entry
{
    unsigned short int offset_lowerbits;
    unsigned short int selector;
    unsigned char zero;
    unsigned char flags;
    unsigned short int offset_higherbits;
};

struct idt_pointer
{
    unsigned short limit;
    unsigned int base;
};

struct idt_entry idt_table[IDT_SIZE];
struct idt_pointer idt_ptr;

void load_idt_entry(char isr_number, unsigned long base, short int selector, char flags)
{
    idt_table[isr_number].offset_lowerbits = base & 0xFFFF;
    idt_table[isr_number].offset_higherbits …
Run Code Online (Sandbox Code Playgroud)

c x86 kernel irq osdev

6
推荐指数
1
解决办法
1841
查看次数

试图从软盘驱动器读取扇区时,INT 13、2挂在x86实模式下

我正在为学校项目编写DOS克隆,并尝试使用BIOS INT 13、2从软盘驱动器(主要是FAT12文件系统的根目录,扇区19)读取某些扇区。我将参数设置正确-或至少我认为是这样做的-然后用AH = 2调用INT 0x13。然后,系统挂起。我不知道为什么。

我正在使用以下代码来调用中断:

mov ah, 0x2   ;Read sectors function
mov al, 1     ;I want to read one sector
mov ch, 0     ;From track 0
mov cl, 2     ;Sector 2
mov dh, 1     ;Head 1
mov dl, [device_number] ;Obtained from BIOS during boot
mov bx, 0x7C0 ;Buffer located at 0x7C00:0x0000*
mov es, bx
mov bx, 0
stc           ;Set carry for older BIOSes that just unset it.
int 0x13      ;Call BIOS INT 0x13
jc .error     ;If there's an …
Run Code Online (Sandbox Code Playgroud)

x86 assembly bios osdev x86-16

3
推荐指数
1
解决办法
528
查看次数

标签 统计

osdev ×2

x86 ×2

assembly ×1

bios ×1

c ×1

irq ×1

kernel ×1

x86-16 ×1