fix: change default optimization level to O1 as temp workaround.
本项目支持的make命令:
| 命令 | 用途 |
|---|---|
-| `make all` | 构建镜像(`-O2`) |
+| `make all` | 构建镜像(`-O1`) |
+| `make instable` | 构建镜像(`-O2`)**※** |
| `make all-debug` | 构建适合调试用的镜像(`-Og`) |
| `make run` | 使用QEMU运行build目录下的镜像|
| `make debug-qemu` | 构建并使用QEMU进行调试 |
| `make debug-qemu-vscode` | 用于vscode整合 |
| `make clean` | 删除build目录 |
+**※:由于在`-O2`模式下,GCC会进行大量的优化,这导致LunaixOS会出现一些非常奇怪、离谱的bug,从而影响到基本运行。调试这些bug需要大量的汗水与时间,属于日后维护的任务。所以,在目前,LunaixOS将默认最大的优化程度设置为比较安全的`-O1`。`make instable`仅用于方便日后的对该问题的进一步调试。**
+
## 运行以及Issue
运行该操作系统需要一个虚拟磁盘镜像,可以使用如下命令快速创建一个:
ARCH_OPT := -D__ARCH_IA32
-O := -O2
+O := -O1
W := -Wall -Wextra -Wno-unknown-pragmas \
-Wno-unused-function \
-Wno-unused-but-set-variable \
reg32 fs;
reg32 gs;
reg32 esp;
- } registers;
+ } __attribute__((packed)) registers;
unsigned int vector;
unsigned int err_code;
;
}
-#ifdef __LUNAIXOS_DEBUG__
+#ifndef __LUNAIXOS_NASSERT__
#define assert(cond) \
if (!(cond)) { \
__assert_fail(#cond, __FILE__, __LINE__); \
#else
#define assert(cond) (void)(cond); // assert nothing
#define assert_msg(cond, msg) (void)(cond); // assert nothing
-#endif
+
+#endif // __LUNAIXOS_NASSERT__
void
panick(const char* msg);
}
#define __LXSYSCALL2_VARG(rettype, name, t1, p1, t2, p2) \
- static rettype name(__PARAM_MAP2(t1, p1, t2, p2), ...) \
+ __attribute__((noinline)) static rettype name( \
+ __PARAM_MAP2(t1, p1, t2, p2), ...) \
{ \
+ /* No inlining! This depends on the call frame assumption */ \
void* _last = (void*)&p2 + sizeof(void*); \
asm("\n" ::"b"(p1), "c"(p2), "d"(_last)); \
___DOINT33(__SYSCALL_##name, rettype) \
#include <lunaix/fs.h>
#include <lunaix/mm/valloc.h>
#include <lunaix/process.h>
+#include <lunaix/spike.h>
#include <lunaix/types.h>
struct llist_header all_mnts = { .next = &all_mnts, .prev = &all_mnts };
llist_append(&all_mnts, &mnt->list);
mutex_init(&mnt->lock);
- mnt_mkbusy(parent);
mnt->parent = parent;
mnt->mnt_point = mnt_point;
mnt->super_block = mnt_point->super_block;
if (parent) {
+ mnt_mkbusy(parent);
mutex_lock(&mnt->parent->lock);
llist_append(&parent->submnts, &mnt->sibmnts);
mutex_unlock(&mnt->parent->lock);
int
vfs_mount_root(const char* fs_name, struct device* device)
{
+ extern struct v_dnode* vfs_sysroot;
int errno = 0;
if (vfs_sysroot->mnt && (errno = vfs_unmount_at(vfs_sysroot))) {
return errno;
static waitq_t lx_reader;
static volatile char ttychr;
-static pid_t fg_pgid = 0;
+static volatile pid_t fg_pgid = 0;
inline void
print_control_code(const char cntrl)
$(OBJECT_DIR)/%.S.o: %.S
@mkdir -p $(@D)
- @echo " BUILD: $<"
+ @echo " CC $<"
@$(CC) $(INCLUDES) -c $< -o $@
$(OBJECT_DIR)/%.c.o: %.c
@mkdir -p $(@D)
- @echo " BUILD: $<"
+ @echo " CC $<"
@$(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
$(BIN_DIR)/$(OS_BIN): $(OBJECT_DIR) $(BIN_DIR) $(SRC)
- @echo " LINK: $(BIN_DIR)/$(OS_BIN)"
+ @echo " LD $(BIN_DIR)/$(OS_BIN)"
@$(CC) -T link/linker.ld -o $(BIN_DIR)/$(OS_BIN) $(SRC) $(LDFLAGS)
$(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
all: clean $(BUILD_DIR)/$(OS_ISO)
+instable: O := -O2
+instable: all
+
all-debug: O := -Og
all-debug: CFLAGS := -g -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT) -D__LUNAIXOS_DEBUG__
all-debug: LDFLAGS := -g -ffreestanding $(O) -nostdlib -lgcc