用户程序 - 练习题
练习 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);思考题
SYSENTER/SYSEXIT与INT 0x80相比有什么优势?- Linux中系统调用的开销大约是多少时钟周期?
- 为什么现代OS使用
vDSO机制? - 如果用户程序执行了特权指令(如
cli),会发生什么?