检测处理器核心数量

This commit is contained in:
fslongjin 2022-04-04 18:42:22 +08:00
parent e667fff256
commit 60dc9f4932
10 changed files with 103 additions and 35 deletions

View File

@ -19,9 +19,9 @@ all: kernel
objcopy -I elf64-x86-64 -O elf64-x86-64 -R ".comment" -R ".eh_frame" kernel ../bin/kernel/kernel.elf
#
kernel: head.o entry.o main.o printk.o trap.o mm.o slab.o irq.o pic.o process.o syscall.o multiboot2.o cpu.o acpi.o ps2_keyboard.o ps2_mouse.o ata.o pci.o ahci.o
kernel: head.o entry.o main.o printk.o trap.o mm.o slab.o irq.o pic.o process.o syscall.o multiboot2.o cpu.o acpi.o ps2_keyboard.o ps2_mouse.o ata.o pci.o ahci.o smp.o
ld -b elf64-x86-64 -z muldefs -o kernel head.o exception/entry.o main.o common/printk.o exception/trap.o exception/irq.o mm/mm.o mm/slab.o process/process.o syscall/syscall.o driver/multiboot2/multiboot2.o \
common/cpu.o \
common/cpu.o smp/smp.o \
driver/acpi/acpi.o driver/interrupt/pic.o driver/keyboard/ps2_keyboard.o driver/mouse/ps2_mouse.o driver/disk/ata.o driver/pci/pci.o driver/disk/ahci/ahci.o \
-T link.lds
@ -64,7 +64,8 @@ process.o: process/process.c
syscall.o: syscall/syscall.c
gcc $(CFLAGS) -c syscall/syscall.c -o syscall/syscall.o
smp.o: smp/smp.c
gcc $(CFLAGS) -c smp/smp.c -o smp/smp.o
cpu.o: common/cpu.c
gcc $(CFLAGS) -c common/cpu.c -o common/cpu.o

View File

@ -7,6 +7,7 @@
//引入对bool类型的支持
#include <stdbool.h>
#include <stdint.h>
#define NULL 0

View File

@ -22,6 +22,8 @@ static uint acpi_XSDT_Entry_num = 0;
static ul acpi_RSDT_entry_phys_base = 0; // RSDT中的第一个entry所在物理页的基地址
static uint64_t acpi_madt_vaddr = 0; // MADT的虚拟地址
// static ul acpi_XSDT_entry_phys_base = 0; // XSDT中的第一个entry所在物理页的基地址
/**
@ -54,7 +56,6 @@ void acpi_iter_SDT(bool (*_fun)(const struct acpi_system_description_table_heade
sdt_header = (struct acpi_system_description_table_header_t *)(acpi_get_RSDT_entry_vaddr((ul)(*(ent + i))));
if (_fun(sdt_header, _data) == true)
return;
}
@ -79,10 +80,11 @@ bool acpi_get_MADT(const struct acpi_system_description_table_header_t *_iter_da
//*(struct acpi_Multiple_APIC_Description_Table_t *)_data = *(struct acpi_Multiple_APIC_Description_Table_t *)_iter_data;
// 返回MADT的虚拟地址
*(ul *)_data = (ul)_iter_data;
acpi_madt_vaddr = _iter_data;
return true;
}
/**
* @brief acpi模块
*

View File

@ -162,15 +162,6 @@ void acpi_iter_SDT(bool (*_fun)(const struct acpi_system_description_table_heade
bool acpi_get_MADT(const struct acpi_system_description_table_header_t *_iter_data, void *_data);
/**
* @brief (Interrupt Controller Structure)ACPI标准文件的Table 5-45
* @param _fun
* @param _data
*/
void acpi_iter_Interrupt_Controller_Structure(bool (*_fun)(const struct apic_Interrupt_Controller_Structure_header_t *, void *),
void *_data);
// 初始化acpi模块
void acpi_init();

View File

@ -24,7 +24,6 @@ void apic_io_apic_init()
{
ul madt_addr;
kdebug("madt_addr = %#018lx", (ul)madt_addr);
acpi_iter_SDT(acpi_get_MADT, &madt_addr);
madt = (struct acpi_Multiple_APIC_Description_Table_t *)madt_addr;
@ -454,3 +453,37 @@ void apic_ioapic_edge_ack(ul irq_num) // 边沿触发
"wrmsr \n\t" ::
: "memory");
}
/**
* @brief Interrupt Control Structure
*
* @param type ics的类型
* @param ret_vaddr ICS的虚拟地址数组
* @param total
* @return uint
*/
uint apic_get_ics(const uint type, ul *ret_vaddr[], uint *total)
{
void *ent = (void *)(madt) + sizeof(struct acpi_Multiple_APIC_Description_Table_t);
struct apic_Interrupt_Controller_Structure_header_t *header = (struct apic_Interrupt_Controller_Structure_header_t *)ent;
bool flag = false;
uint cnt = 0;
while (header->length > 2)
{
header = (struct apic_Interrupt_Controller_Structure_header_t *)ent;
if (header->type == type)
{
*(ret_vaddr[cnt++]) = (ul)ent;
flag = true;
}
ent += header->length;
}
*total = cnt;
if (!flag)
return APIC_E_NOTFOUND;
else
return APIC_SUCCESS;
}

View File

@ -5,6 +5,9 @@
#include "../../../exception/irq.h"
#include "../../../mm/mm.h"
#define APIC_SUCCESS 0
#define APIC_E_NOTFOUND 1
#define APIC_IO_APIC_VIRT_BASE_ADDR SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + IO_APIC_MAPPING_OFFSET
#define APIC_LOCAL_APIC_VIRT_BASE_ADDR SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + LOCAL_APIC_MAPPING_OFFSET
@ -70,6 +73,8 @@
// 分频配置寄存器(定时器专用)
#define LOCAL_APIC_OFFSET_Local_APIC_CLKDIV 0x3e0
/*
1: LVT CMCI
@ -270,6 +275,16 @@ void apic_ioapic_write_rte(unsigned char index, ul value);
*/
void apic_init();
/**
* @brief Interrupt Control Structure
*
* @param type ics的类型
* @param ret_vaddr ICS的虚拟地址数组
* @param total
* @return uint
*/
uint apic_get_ics(const uint type, ul *ret_vaddr[], uint * total);
// =========== 中断控制操作接口 ============
void apic_ioapic_enable(ul irq_num);
void apic_ioapic_disable(ul irq_num);

View File

@ -165,11 +165,13 @@ void system_initialize()
syscall_init();
cpu_init();
//ps2_keyboard_init();
//ps2_mouse_init();
//ata_init();
// ps2_keyboard_init();
// ps2_mouse_init();
// ata_init();
pci_init();
ahci_init();
smp_init();
// test_slab();
// test_mm();
@ -180,10 +182,8 @@ void system_initialize()
//操作系统内核从这里开始执行
void Start_Kernel(void)
{
system_initialize();
/*
uint64_t buf[100];
ahci_operation.transfer(ATA_CMD_READ_DMA_EXT, 0, 1, (uint64_t)&buf, 0, 0);
@ -197,7 +197,7 @@ void Start_Kernel(void)
// show_welcome();
// test_mm();
/*
/*
while (1)
{
ps2_keyboard_analyze_keycode();
@ -211,7 +211,7 @@ void Start_Kernel(void)
// printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d, byte3:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y, (unsigned char)packet.byte3);
}
}
*/
*/
/*
while (1)
{

0
kernel/smp/boot_apu.S Normal file
View File

13
kernel/smp/smp.c Normal file
View File

@ -0,0 +1,13 @@
#include "smp.h"
#include "../common/kprint.h"
static struct acpi_Processor_Local_APIC_Structure_t *proc_local_apic_structs[MAX_SUPPORTED_PROCESSOR_NUM];
static uint32_t total_processor_num = 0;
void smp_init()
{
ul tmp_vaddr[MAX_SUPPORTED_PROCESSOR_NUM] = {0};
apic_get_ics(ACPI_ICS_TYPE_PROCESSOR_LOCAL_APIC, &tmp_vaddr, &total_processor_num);
kdebug("processor num=%d", total_processor_num);
}

12
kernel/smp/smp.h Normal file
View File

@ -0,0 +1,12 @@
#include "../common/glib.h"
#include "../common/asm.h"
#include "../driver/acpi/acpi.h"
#include "../driver/interrupt/apic/apic.h"
#define MAX_SUPPORTED_PROCESSOR_NUM 1024 // 操作系统支持的最大处理器数量
/**
* @brief
*
*/
void smp_init();