Giter Site home page Giter Site logo

Comments (5)

phil-opp avatar phil-opp commented on May 19, 2024

Some observations:

  • The weird interrupt frame stack in the output above indicates that the x86-interrupt calling convention is currently broken on the latest LLVM version. The values are all shifted by one field. For example, 0x8 is the code segment, not the instruction pointer. And 518 are the CPU flags, 0x10000201f48 is the stack pointer and the stack segment is 0.
  • Cause of the double fault:
    • Using QEMU's -d int flag, I saw that the double fault occurs directly, without any other exception before.
    • By disassembling the kernel binary and grepping for the VirtAddr, I discovered that the double fault occurs on the hlt instruction.
    • This indicates that the double fault is not a CPU expection at all, but a misinterpreted interrupt from the PIC.
      • If I keep interrupts disabled, the double fault disappears.
      • If I remove the PIC remapping, the same double fault occurs. Now the fault is expected because the PIC is mapped to the same IDT entries as the CPU exceptions by default.
    • So the issue seems to be that the PIC remapping doesn't work as expected.

from blog_os.

phil-opp avatar phil-opp commented on May 19, 2024

It looks like the issue is that the .data section is not correctly loaded. It is all zero after loading for some reason.

As a result, the PIC initialization fails, which cause the double fault once interrupts are enabled. Re-initializing the PIC at runtime before initialization seems to fix the issue:

    let mut pics = interrupts::PICS.lock();
    *pics =
        unsafe { pic8259::ChainedPics::new(interrupts::PIC_1_OFFSET, interrupts::PIC_2_OFFSET) };
    unsafe { pics.initialize() };

So the issue seems to be the loading of the static, which is part of the .data section.

from blog_os.

phil-opp avatar phil-opp commented on May 19, 2024

I found the issue and fixed it in rust-osdev/bootloader#424.

If you're affected by this, run cargo update -p bootloader.

from blog_os.

Wencong50714 avatar Wencong50714 commented on May 19, 2024

I change the older nightly version but still got this problems.

$ rustc --version --verbose
rustc 1.77.0-nightly (11f32b73e 2024-01-31)
binary: rustc
commit-hash: 11f32b73e0dc9287e305b5b9980d24aecdc8c17f
commit-date: 2024-01-31
host: x86_64-unknown-linux-gnu
release: 1.77.0-nightly
LLVM version: 17.0.6

image

I use the WSL2 in the ubuntu 22.04 in x86 computer.

from blog_os.

Wencong50714 avatar Wencong50714 commented on May 19, 2024

I change the older nightly version but still got this problems.

$ rustc --version --verbose
rustc 1.77.0-nightly (11f32b73e 2024-01-31)
binary: rustc
commit-hash: 11f32b73e0dc9287e305b5b9980d24aecdc8c17f
commit-date: 2024-01-31
host: x86_64-unknown-linux-gnu
release: 1.77.0-nightly
LLVM version: 17.0.6

image

I use the WSL2 in the ubuntu 22.04 in x86 computer.

Sorry, it turn out that i keep x86_64::instructions::interrupts::int3(); in my _start function, and i think it cause the double fault. Everything works well when i remove this statement.

from blog_os.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.