arch linux 内核编译就像文章里说的那样 😂
https://resource.literalkernel.work/arch_linux_custom/
照这这篇 wiki 基本上就是编译 linux 内核了
https://wiki.archlinux.org/index.php/Kernel_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)/Arch_Build_System_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
我遇到的问题是,签名验证,公钥服务器老是返回错误,只好先跳过
freebsd i386 syscall
基本上打通了吧。
1. 标准 C 库塞入 syscall 就离谱
2. 几堆复杂的 weak_reference 是干什么的?
3. Makefile printf 源码就离谱(最后才发现,这一点最困扰)
4. 其他 syscall 从 int 80h 进入后就 call syscall ...
5. #include "../../kern/subr_syscall.c" // syscallenter
6. (sa->callp->sy_call)(td, sa->args);
7. sysent 貌似是一个注册机制
8. sys_openat -> kern_openat
感想: 飞跃无数文件,包括存在和暂时还不存在的。C 代码里头写汇编定义的符号,汇编也可以 call C语言函数。你猜你这个符号写在那个文件?全文搜不到?是不是自动生成的?
#define RSYSCALL(name)
ENTRY(__sys_##name)
SYSCALL(name);
KERNCALL:
ret;
END(__sys##name)
汇编宏是真的淦!
破案,freebsd libc 中系统调用
lib/libc/sys/open.c open -> openat -> __libc_interposing[INTERPOS_openat] -> __sys_openat
然后 Makefile 里写的,列出了系统调用名字,每个名字会生成 name.S 编译成 name.o
生成的代码在右边
代码里头会
#include <SYS.h>
其中 PSEUDO 展开就是
__sys_openat 定义,将 sys/syscalls.h 中定义的 SYS_openat 数值送入 eax
KERNELCALL -> int 0x80h
莉特雅 literal
写代码业余爱好者 amateur coder