Skip to content

Commit d9b4827

Browse files
committed
补充适用于多核CPU的页表切换
1 parent 53c3bc5 commit d9b4827

File tree

4 files changed

+21
-20
lines changed

4 files changed

+21
-20
lines changed

src/x86_64/core/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ void kmain(void) {
126126
// beep();
127127
enable_scheduler();
128128
open_interrupt;
129+
129130
// //
130131
// vfs_node_t node = vfs_open("/dev/sata0");
131132
// if (node != NULL) {

src/x86_64/core/mem/page.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ page_directory_t *get_kernel_pagedir() {
7474
}
7575

7676
page_directory_t *get_current_directory() {
77-
return current_directory;
77+
smp_cpu_t *cpu = get_cpu_smp(get_current_cpuid());
78+
return cpu != NULL ? cpu->directory : current_directory;
7879
}
7980

80-
static void copy_page_table_recursive(page_table_t *source_table, page_table_t *new_table,
81-
int level) {
81+
static void copy_page_table_recursive(page_table_t *source_table, page_table_t *new_table, int level) {
8282
if (level == 0) {
8383
for (int i = 0; i < 512; i++) {
8484
new_table->entries[i].value = source_table->entries[i].value;
@@ -127,7 +127,10 @@ void page_map_to(page_directory_t *directory, uint64_t addr, uint64_t frame, uin
127127
}
128128

129129
void switch_page_directory(page_directory_t *dir) {
130-
current_directory = dir;
130+
smp_cpu_t *cpu = get_cpu_smp(get_current_cpuid());
131+
if(cpu != NULL){
132+
cpu->directory = dir;
133+
} else current_directory = dir;
131134
page_table_t *physical_table = virt_to_phys((uint64_t)dir->table);
132135
__asm__ volatile("mov %0, %%cr3" : : "r"(physical_table));
133136
}

src/x86_64/driver/pci/rtl8169.c

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@ RTL8169_Regs *rtl8169;
99
RTL8169_Desc tx_desc[TX_DESC_COUNT] __attribute__((aligned(256)));
1010
RTL8169_Desc rx_desc[RX_DESC_COUNT] __attribute__((aligned(256)));
1111

12-
void rtl8169_reset() {
13-
rtl8169->Command = 0x10;
14-
while (rtl8169->Command & 0x10)
15-
__asm__ volatile("pause");
16-
}
17-
18-
void rtl8169_setup_descriptors() {
19-
rtl8169->TxDesc = (uint32_t)virt_to_phys((uint64_t)&tx_desc); // 设置 TX 描述符基地址
20-
rtl8169->RxDesc = (uint32_t)&rx_desc; // 设置 RX 描述符基地址
21-
}
22-
2312
void rtl8169_setup() {
2413
pcie_device_t *device = pcie_find_class(0x020000);
2514
if (device == NULL) {
@@ -50,10 +39,16 @@ void rtl8169_setup() {
5039
rtl8169 = phys_to_virt((uint64_t)rtl8169);
5140
}
5241

53-
rtl8169->Command = 0x0C;
54-
rtl8169_setup_descriptors();
42+
volatile uint32_t *rtl8169_mmio = (volatile uint32_t *)(((uint64_t)rtl8169) & ~0xF);
43+
44+
rtl8169_mmio[0x37 / 4] |= (1 << 4);
45+
while (rtl8169_mmio[0x37 / 4] & (1 << 4)) {
46+
__asm__("pause");
47+
}
48+
uint8_t mac[6];
49+
for (int i = 0; i < 6; i++) {
50+
mac[i] = (rtl8169_mmio[0x00 + i] & 0xFF);
51+
}
5552

56-
kinfo("Rtl8169 mac: %x:%x:%x:%x:%x:%x", rtl8169->MAC[0] & 0xFF, (rtl8169->MAC[0] >> 8) & 0xFF,
57-
(rtl8169->MAC[0] >> 16) & 0xFF, (rtl8169->MAC[0] >> 24) & 0xFF, rtl8169->MAC[1] & 0xFF,
58-
(rtl8169->MAC[1] >> 8) & 0xFF);
53+
kinfo("Rtl8169 mac: %x:%x:%x:%x:%x:%x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
5954
}

src/x86_64/include/smp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "limine.h"
99
#include "lock_queue.h"
1010
#include "pcb.h"
11+
#include "page.h"
1112

1213
typedef struct smp_cpu {
1314
uint8_t flags; // 标志位, CPU是否启用
@@ -18,6 +19,7 @@ typedef struct smp_cpu {
1819
tss_stack_t tss_stack;
1920
pcb_t idle_pcb;
2021
pcb_t current_pcb;
22+
page_directory_t *directory;
2123
lock_queue *scheduler_queue; // 该核心的进程调度队列
2224
lock_node *iter_node; // 该核心当前迭代的节点
2325
} __attribute__((packed)) smp_cpu_t;

0 commit comments

Comments
 (0)