Forráskód Böngészése

完成中断处理

simon 1 éve
szülő
commit
9aaa4a58ed
5 módosított fájl, 119 hozzáadás és 9 törlés
  1. 64 7
      build.sh
  2. 2 1
      clean.sh
  3. 44 0
      device/timer.c
  4. 6 0
      device/timer.h
  5. 3 1
      kernel/init.c

+ 64 - 7
build.sh

@@ -1,10 +1,32 @@
 #!/bin/sh
 
+directory="build/bin"
+if [ ! -d "$directory" ]; then
+    mkdir -p $directory
+fi
+
 echo "Compiling mbr..."
-nasm -I boot/include/ -o build/mbr.bin boot/mbr.S
+nasm -I boot/include/ -o $directory/mbr.bin boot/mbr.S
+if [ $? -eq 0 ]; then
+    echo "MBR compiled successfully."
+else
+    echo "MBR compiled failed."
+    exit
+fi
 echo "Compiling loader..."
-nasm -I boot/include/ -o build/loader.bin boot/loader.S
+nasm -I boot/include/ -o $directory/loader.bin boot/loader.S
+if [ $? -eq 0 ]; then
+    echo "Bootloader compiled successfully."
+else
+    echo "Bootloader compiled failed."
+    exit
+fi
 echo "Compiling kernel..."
+directory="build"
+if [ ! -d "$directory" ]; then
+    mkdir $directory
+fi
+i386-elf-gcc -I lib/ -I lib/kernel/ -c -fno-builtin -o build/timer.o device/timer.c
 i386-elf-gcc -I ./lib/ -I lib/kernel/ -I kernel/ -c -fno-builtin -o build/main.o kernel/main.c
 nasm -f elf -o build/print.o lib/kernel/print.S
 nasm -f elf -o build/kernel.o kernel/kernel.S
@@ -12,19 +34,54 @@ nasm -f elf -o build/kernel.o kernel/kernel.S
 i386-elf-gcc -I lib/kernel/ -I ./lib/ -I kernel/ -c -fno-builtin -o build/interrupt.o kernel/interrupt.c
 i386-elf-gcc -I lib/kernel/ -I ./lib/ -I kernel/ -c -fno-builtin -o build/init.o kernel/init.c
 
-i386-elf-ld -Ttext 0xc0001500 -e main -o build/kernel.bin build/main.o build/init.o build/interrupt.o build/print.o build/kernel.o
+directory="build/bin"
+if [ ! -d "$directory" ]; then
+    mkdir $directory
+fi
+i386-elf-ld -Ttext 0xc0001500 -e main -o $directory/kernel.bin build/main.o build/init.o build/interrupt.o build/print.o build/kernel.o build/timer.o
+
+if [ $? -eq 0 ]; then
+    echo "Kernel compiled successfully."
+else
+    echo "Kernel compiled failed."
+    exit
+fi
 
 echo "Creating disk image..."
 bximage -q -func=create -hd=30M hd30M.img
+if [ $? -eq 0 ]; then
+    echo "Disk image created successfully."
+else
+    echo "Disk image created failed."
+    exit
+fi
 
 echo "Installing to disk image..."
 echo " 0. Writing mbr to disk..."
-dd if=build/mbr.bin of=hd30M.img bs=512 count=1 conv=notrunc
+dd if=$directory/mbr.bin of=hd30M.img bs=512 count=1 conv=notrunc
+if [ $? -eq 0 ]; then
+    echo "Install mbr to disk image successfully."
+else
+    echo "Install mbr to disk image failed."
+    exit
+fi
 echo " 1. Writing loader to disk..."
-dd if=build/loader.bin of=hd30M.img bs=512 count=4 seek=2 conv=notrunc
+dd if=$directory/loader.bin of=hd30M.img bs=512 count=4 seek=2 conv=notrunc
+if [ $? -eq 0 ]; then
+    echo "Install loader to disk image successfully."
+else
+    echo "Install loader to disk image failed."
+    exit
+fi
 echo " 2. Writing kernel to disk..."
-dd if=build/kernel.bin of=hd30M.img bs=512 count=200 seek=9 conv=notrunc
-echo "Disk image created successfully."
+dd if=$directory/kernel.bin of=hd30M.img bs=512 count=200 seek=9 conv=notrunc
+
+if [ $? -eq 0 ]; then
+    echo "Install kernel to disk image successfully."
+else
+    echo "Install kernel to disk image failed."
+    exit
+fi
 
 echo "Now starting bochs ..."
 bochs -f bochsrc -q

+ 2 - 1
clean.sh

@@ -1,3 +1,4 @@
 #!/bin/sh
 
-rm -rf bochs_log.txt hd30M.img *.bin build/*.o build/*.bin
+rm -rf bochs_log.txt hd30M.img *.bin
+rm -rf build

+ 44 - 0
device/timer.c

@@ -0,0 +1,44 @@
+#include "timer.h"
+#include "../lib/kernel/io.h"
+#include "../lib/kernel/print.h"
+
+/**
+ * 8253定时器初始化 计数器的工作频率均是 1.19318MHz
+ * 通过控制字指定使用计数器 0,工作方式 2,
+ * 然后写入初始值 1193180/ 中断信号的频率=计数器的初始值
+ * 设置 中断信号的频率=100Hz
+ */
+
+#define IRQ0_FREQUENCY 100
+#define INPUT_FREQUENCY 1193180
+#define COUNTER0_VALUE INPUT_FREQUENCY / IRQ0_FREQUENCY
+#define COUNTER0_PORT 0x40
+#define COUNTER0_NO 0
+#define COUNTER_MODE 2
+#define READ_WRITE_LATCH 3
+#define PIT_CONTROL_PORT 0x43
+
+/// @brief 设置计数器
+/// @param counter_port 操作的计数器端口
+/// @param counter_no  计数器编号
+/// @param rwl 读写锁属性
+/// @param counter_mode 模式
+/// @param counter_value  初始化值
+static void frequency_set(uint8_t counter_port, uint8_t counter_no, uint8_t rwl, uint8_t counter_mode, uint16_t counter_value)
+{
+    // 先往控制字寄存器端口写入控制字
+    outb(PIT_CONTROL_PORT, (uint8_t)(counter_no << 6 | rwl << 4 | counter_mode << 1));
+    // 先写入计数器的低8位
+    outb(counter_port, (uint8_t)counter_value);
+    // 再写入计数器的高8位
+    outb(counter_port, (uint8_t)counter_value >> 8);
+}
+
+/* 初始化 PIT 8235 */
+void timer_init(void)
+{
+    put_str("timer_init start\n");
+    // 设置计数器 0,工作方式 2,初始值 1193180/100=11931,即每 10ms 发送一次时钟中断
+    frequency_set(COUNTER0_PORT, COUNTER0_NO, READ_WRITE_LATCH, COUNTER_MODE, COUNTER0_VALUE);
+    put_str("timer_init done\n");
+}

+ 6 - 0
device/timer.h

@@ -0,0 +1,6 @@
+#ifndef __DEVICE_TIMER_H
+#define __DEVICE_TIMER_H
+
+void timer_init(void);
+
+#endif // __DEVICE_TIMER_H

+ 3 - 1
kernel/init.c

@@ -1,9 +1,11 @@
 #include "init.h"
 #include "../lib/kernel/print.h"
 #include "interrupt.h"
+#include "../device/timer.h"
 
 void init_all()
 {
     put_str("init_all\n");
-    itd_init(); // 初始化中断
+    itd_init();   // 初始化中断
+    timer_init(); // 初始化定时器
 }