mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 04:56:30 +00:00
signal相关数据结构&代码结构优化 (#84)
* 解决由于spinlock.h中包含preempt_enable()带来的循环include问题 * new: 初步实现signal的数据结构
This commit is contained in:
@ -1,10 +1,22 @@
|
||||
|
||||
CFLAGS += -I .
|
||||
|
||||
all: x86_64_ipi.o ia64_msi.o
|
||||
kernel_arch_x86_64_subdirs:= asm
|
||||
|
||||
x86_64_ipi.o: x86_64_ipi.c
|
||||
$(CC) $(CFLAGS) -c x86_64_ipi.c -o x86_64_ipi.o
|
||||
kernel_arch_x86_64_objs:= $(shell find ./*.c)
|
||||
|
||||
ia64_msi.o: ia64_msi.c
|
||||
$(CC) $(CFLAGS) -c ia64_msi.c -o ia64_msi.o
|
||||
ECHO:
|
||||
@echo "$@"
|
||||
|
||||
|
||||
$(kernel_arch_x86_64_objs): ECHO
|
||||
$(CC) $(CFLAGS) -c $@ -o $@.o
|
||||
|
||||
$(kernel_arch_x86_64_subdirs): ECHO
|
||||
$(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)" PIC="$(PIC)"
|
||||
|
||||
all: $(kernel_arch_x86_64_objs) $(kernel_arch_x86_64_subdirs)
|
||||
|
||||
|
||||
clean:
|
||||
echo "Done."
|
22
kernel/src/arch/x86_64/asm/Makefile
Normal file
22
kernel/src/arch/x86_64/asm/Makefile
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
CFLAGS += -I .
|
||||
|
||||
# kernel_arch_x86_64_asm_subdirs:=
|
||||
|
||||
kernel_arch_x86_64_asm_objs:= $(shell find ./*.c)
|
||||
|
||||
ECHO:
|
||||
@echo "$@"
|
||||
|
||||
|
||||
$(kernel_arch_x86_64_asm_objs): ECHO
|
||||
$(CC) $(CFLAGS) -c $@ -o $@.o
|
||||
|
||||
# $(kernel_arch_x86_64_asm_subdirs): ECHO
|
||||
# $(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)" PIC="$(PIC)"
|
||||
|
||||
all: $(kernel_arch_x86_64_asm_objs)
|
||||
|
||||
|
||||
clean:
|
||||
echo "Done."
|
56
kernel/src/arch/x86_64/asm/spinlock.c
Normal file
56
kernel/src/arch/x86_64/asm/spinlock.c
Normal file
@ -0,0 +1,56 @@
|
||||
#include <common/spinlock.h>
|
||||
#include <process/preempt.h>
|
||||
|
||||
void __arch_spin_lock(spinlock_t *lock)
|
||||
{
|
||||
__asm__ __volatile__("1: \n\t"
|
||||
"lock decb %0 \n\t" // 尝试-1
|
||||
"jns 3f \n\t" // 加锁成功,跳转到步骤3
|
||||
"2: \n\t" // 加锁失败,稍后再试
|
||||
"pause \n\t"
|
||||
"cmpb $0, %0 \n\t"
|
||||
"jle 2b \n\t" // 若锁被占用,则继续重试
|
||||
"jmp 1b \n\t" // 尝试加锁
|
||||
"3:"
|
||||
: "=m"(lock->lock)::"memory");
|
||||
preempt_disable();
|
||||
}
|
||||
|
||||
void __arch_spin_unlock(spinlock_t *lock)
|
||||
{
|
||||
preempt_enable();
|
||||
__asm__ __volatile__("movb $1, %0 \n\t" : "=m"(lock->lock)::"memory");
|
||||
}
|
||||
|
||||
void __arch_spin_lock_no_preempt(spinlock_t *lock)
|
||||
{
|
||||
__asm__ __volatile__("1: \n\t"
|
||||
"lock decb %0 \n\t" // 尝试-1
|
||||
"jns 3f \n\t" // 加锁成功,跳转到步骤3
|
||||
"2: \n\t" // 加锁失败,稍后再试
|
||||
"pause \n\t"
|
||||
"cmpb $0, %0 \n\t"
|
||||
"jle 2b \n\t" // 若锁被占用,则继续重试
|
||||
"jmp 1b \n\t" // 尝试加锁
|
||||
"3:"
|
||||
: "=m"(lock->lock)::"memory");
|
||||
}
|
||||
|
||||
void __arch_spin_unlock_no_preempt(spinlock_t *lock)
|
||||
{
|
||||
__asm__ __volatile__("movb $1, %0 \n\t" : "=m"(lock->lock)::"memory");
|
||||
}
|
||||
|
||||
long __arch_spin_trylock(spinlock_t *lock)
|
||||
{
|
||||
uint64_t tmp_val = 0;
|
||||
preempt_disable();
|
||||
// 交换tmp_val和lock的值,若tmp_val==1则证明加锁成功
|
||||
asm volatile("lock xchg %%bx, %1 \n\t" // 确保只有1个进程能得到锁
|
||||
: "=q"(tmp_val), "=m"(lock->lock)
|
||||
: "b"(0)
|
||||
: "memory");
|
||||
if (!tmp_val)
|
||||
preempt_enable();
|
||||
return tmp_val;
|
||||
}
|
10
kernel/src/arch/x86_64/include/asm/irqflags.h
Normal file
10
kernel/src/arch/x86_64/include/asm/irqflags.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
// 保存当前rflags的值到变量x内并关闭中断
|
||||
#define local_irq_save(x) __asm__ __volatile__("pushfq ; popq %0 ; cli" \
|
||||
: "=g"(x)::"memory")
|
||||
// 恢复先前保存的rflags的值x
|
||||
#define local_irq_restore(x) __asm__ __volatile__("pushq %0 ; popfq" ::"g"(x) \
|
||||
: "memory")
|
||||
#define local_irq_disable() cli();
|
||||
#define local_irq_enable() sti();
|
Reference in New Issue
Block a user