Skip to content

Commit 5d53831

Browse files
committed
内核编号修改, 增加CPU速度统计
1 parent 163bc2c commit 5d53831

File tree

8 files changed

+47
-16
lines changed

8 files changed

+47
-16
lines changed

src/x86_64/core/cpu/cpusp.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include "cpusp.h"
2+
#include "kprint.h"
3+
#include "timer.h"
4+
5+
uint64_t ips = 0;
6+
7+
uint64_t get_cpu_speed(){
8+
return ips;
9+
}
10+
11+
_Noreturn void cpu_speed_test(){
12+
infinite_loop{
13+
size_t _start_t = nanoTime();
14+
for (volatile uint64_t i = 0; i < 1000; i++);
15+
size_t _end_t = nanoTime() - _start_t;
16+
ips = _end_t / 1000;
17+
}
18+
}

src/x86_64/core/cpu/smp.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ smp_cpu_t cpus[MAX_CPU];
2222
uint32_t bsp_processor_id;
2323
uint64_t cpu_count = 0;
2424

25-
static int16_t cpu_done_count = 0;
25+
static uint64_t cpu_done_count = 0;
2626

2727
static void apu_hlt() {
2828
cpu_hlt;
@@ -127,7 +127,7 @@ void apu_entry() {
127127
cpu->current_pcb = apu_idle;
128128
cpu->flags = 1;
129129
apu_idle->queue_index = queue_enqueue(cpu->scheduler_queue, apu_idle);
130-
if (apu_idle->queue_index == -1) {
130+
if (apu_idle->queue_index == (size_t)-1) {
131131
logkf("Error: scheduler null %d\n", get_current_cpuid());
132132
cpu_hlt;
133133
}
@@ -175,7 +175,7 @@ void apu_startup(struct limine_smp_request smp_request) {
175175
if (cpu == NULL) { return; }
176176
cpu->idle_pcb = kernel_head_task;
177177
kernel_head_task->queue_index = queue_enqueue(cpu->scheduler_queue, kernel_head_task);
178-
if (kernel_head_task->queue_index == -1) {
178+
if (kernel_head_task->queue_index == (size_t)-1) {
179179
logkf("Error: scheduler null %d\n", get_current_cpuid());
180180
}
181181

src/x86_64/core/main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "vdisk.h"
3131
#include "vfs.h"
3232
#include "pcnet.h"
33+
#include "cpusp.h"
3334

3435
// 编译器判断
3536
#if defined(__clang__)
@@ -55,7 +56,7 @@ LIMINE_REQUEST LIMINE_BASE_REVISION(2);
5556
LIMINE_REQUEST struct limine_stack_size_request stack_request = {
5657
.id = LIMINE_STACK_SIZE_REQUEST,
5758
.revision = 0,
58-
.stack_size = 131072 // 128K
59+
.stack_size = KERNEL_ST_SZ // 128K
5960
};
6061

6162
extern void error_setup(); // error_handle.c
@@ -123,6 +124,7 @@ void kmain(void) {
123124

124125
create_kernel_thread(terminal_flush_service, NULL, "TerminalFlush");
125126
create_kernel_thread((void *)shell_setup, NULL, "KernelShell");
127+
create_kernel_thread((void *)cpu_speed_test,NULL,"CPUSpeed");
126128
kinfo("Kernel load Done!");
127129
// beep();
128130
enable_scheduler();

src/x86_64/core/task/scheduler.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ int add_task(pcb_t new_task) {
3636
smp_cpu_t *cpu0 = get_cpu_smp(bsp_processor_id);
3737
uint32_t cpuid = bsp_processor_id;
3838

39-
for (int i = 0; i < cpu_count; i++) {
39+
for (size_t i = 0; i < cpu_count; i++) {
4040
smp_cpu_t *cpu = get_cpu_smp(i);
4141
if (cpu == NULL) continue;
4242
if (cpu->flags == 1 && cpu->scheduler_queue->size < cpu0->scheduler_queue->size) {
@@ -53,13 +53,12 @@ int add_task(pcb_t new_task) {
5353
}
5454
new_task->cpu_id = cpuid;
5555
new_task->queue_index = queue_enqueue(cpu0->scheduler_queue, new_task);
56-
if (new_task->queue_index == -1) {
56+
if (new_task->queue_index == (size_t)-1) {
5757
logkf("Error: scheduler null %d\n", get_current_cpuid());
5858
return -1;
5959
}
6060

6161
//pivfs_update(kernel_head_task);
62-
ret:
6362
ticket_unlock(&scheduler_lock);
6463
return new_task->queue_index;
6564
}

src/x86_64/driver/pci/ide.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void ide_write(uint8_t channel, uint8_t reg, uint8_t data) {
142142
}
143143

144144
uint8_t ide_read(uint8_t channel, uint8_t reg) {
145-
uint8_t result;
145+
uint8_t result = 0;
146146
if (reg > 0x07 && reg < 0x0C)
147147
ide_write(channel, ATA_REG_CONTROL, 0x80 | channels[channel].nIEN);
148148
if (reg < 0x08)
@@ -151,8 +151,7 @@ uint8_t ide_read(uint8_t channel, uint8_t reg) {
151151
result = io_in8(channels[channel].base + reg - 0x06);
152152
else if (reg < 0x0E)
153153
result = io_in8(channels[channel].ctrl + reg - 0x0A);
154-
else if (reg < 0x16)
155-
result = io_in8(channels[channel].bmide + reg - 0x0E);
154+
else result = io_in8(channels[channel].bmide + reg - 0x0E);
156155
if (reg > 0x07 && reg < 0x0C) ide_write(channel, ATA_REG_CONTROL, channels[channel].nIEN);
157156
return result;
158157
}
@@ -181,7 +180,7 @@ uint8_t ide_ata_access(uint8_t direction, uint8_t drive, uint32_t lba, uint8_t n
181180
uint16_t selector, uint64_t edi) {
182181
uint8_t lba_mode /* 0: CHS, 1:LBA28, 2: LBA48 */, dma /* 0: No DMA, 1: DMA */, cmd;
183182
uint8_t lba_io[6];
184-
uint32_t channel = ide_devices[drive].Channel; // Read the Channel.
183+
uint8_t channel = ide_devices[drive].Channel; // Read the Channel.
185184
uint32_t slavebit = ide_devices[drive].Drive; // Read the Drive [Master/Slave]
186185
uint32_t bus = channels[channel].base; // Bus Base, like 0x1F0 which is also data port.
187186
uint32_t words = 256; // Almost every ATA drive has a sector-size of 512-byte.
@@ -276,7 +275,7 @@ uint8_t ide_ata_access(uint8_t direction, uint8_t drive, uint32_t lba, uint8_t n
276275
uint16_t *word_ = (uint16_t *)edi;
277276
for (i = 0; i < numsects; i++) {
278277
klog("read %d", i);
279-
if ((err = ide_polling(channel, 1)) != NULL)
278+
if ((err = ide_polling(channel, 1)) != 0)
280279
return err; // Polling, set error and exit if there is.
281280

282281
klog("words=%d bus=%d", words, bus);

src/x86_64/include/cpusp.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
#include "ctype.h"
4+
5+
_Noreturn void cpu_speed_test();
6+
7+
uint64_t get_cpu_speed();

src/x86_64/include/krlibc.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#pragma once
22

33
/**
4-
* 定义CP_Kernel的各种属性
4+
* 定义cpinl内核的各种属性
55
*/
6-
#define KERNEL_NAME "CP_Kernel-x86_64-0.1.1" // 内核编号
7-
#define MAX_CPU (256 * 2) // 最大支持CPU核心数 256
6+
#define KERNEL_NAME "cpinl-x86_64-0.1.2" // 内核编号
7+
#define MAX_CPU (256) // 最大支持CPU核心数 256
88
#define STACK_SIZE 32768 // 栈大小(byte)
9+
#define KERNEL_ST_SZ 131072 // 内核栈大小 128k
910
#define MAX_WAIT_INDEX 100000 // 阻塞最大循环数
1011

1112
// 常用工具宏

src/x86_64/sysapp/shell.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "sprintf.h"
1616
#include "timer.h"
1717
#include "vfs.h"
18+
#include "cpusp.h"
1819

1920
extern void cp_shutdown();
2021
extern void cp_reset();
@@ -101,6 +102,7 @@ static void reboot_os() {
101102
}
102103

103104
static void cd(int argc, char **argv) {
105+
UNUSED(argv);
104106
if (argc == 1) {
105107
printk("If there are too few parameters.\n");
106108
return;
@@ -182,11 +184,13 @@ void ps() {
182184
}
183185
}
184186
}
185-
printk(" --- CPU Usage: %d%% | Memory Usage: %d%s/%dMB ---\n", idle_time * 100 / all_time,
187+
printk(" --- CPU Usage: %d%% IPS: %d | Memory Usage: %d%s/%dMB ---\n", idle_time * 100 / all_time,
188+
get_cpu_speed(),
186189
mem_use + memory, bytes > 10485760 ? "MB" : "KB", memory_size / 1024 / 1024);
187190
}
188191

189192
static void ls(int argc, char **argv) {
193+
UNUSED(argv);
190194
vfs_node_t p;
191195
if (argc == 1) {
192196
p = vfs_open(shell_work_path);
@@ -228,6 +232,7 @@ static void pkill(int argc, char **argv) {
228232
}
229233

230234
static void echo(int argc, char **argv) {
235+
UNUSED(argv);
231236
if (argc == 1) {
232237
printk("[Shell-ECHO]: If there are too few parameters.\n");
233238
return;

0 commit comments

Comments
 (0)