用户程序 - 练习题

练习 1:添加更多系统调用

实现以下系统调用:

  • SYS_SLEEP(ms): 进程休眠指定毫秒数
  • SYS_TIME(): 返回系统运行时间
  • SYS_MALLOC(size): 分配用户内存

练习 2:ELF加载器

实现一个简单的ELF文件加载器:

int load_elf(const uint8_t *elf_data, uint32_t size) {
    // 1. 解析ELF头
    // 2. 验证魔数 (0x7F, 'E', 'L', 'F')
    // 3. 加载各个段到正确的虚拟地址
    // 4. 返回入口点地址
}

练习 3:进程间通信(IPC)

实现简单的消息传递:

#define SYS_SEND    10
#define SYS_RECV    11
 
// 发送消息给目标进程
int sys_send(uint32_t to_pid, const char *msg, uint32_t len);
 
// 接收消息(阻塞)
int sys_recv(char *buf, uint32_t max_len);

练习 4:真正的Ring 3

修改GDT(改用C语言GDT而非汇编),添加用户态段和TSS段,然后使用IRET真正切换到Ring 3运行user_main。

练习 5:用户态库

创建一个简单的用户态库(libc雏形):

// userlib.h
void printf(const char *fmt, ...);
void *malloc(size_t size);
void free(void *ptr);
void exit(int code);
int getpid(void);

思考题

  1. SYSENTER/SYSEXIT 与 INT 0x80 相比有什么优势?
  2. Linux中系统调用的开销大约是多少时钟周期?
  3. 为什么现代OS使用 vDSO 机制?
  4. 如果用户程序执行了特权指令(如 cli),会发生什么?