• 基于OpenWRT使用Tailscale+自建Derper进行组网

    前言

    在南京使用联通宽带接近2年了,上行40Mbps,下行200Mbps。南京联通是可以申请公网IPV4的,使用起来体验还是很不错的。恰逢家里领导有办公室远程回家的需求,有公网当然很简单,但我一般用Termius SSH本地转发然后RDP(Windows)或者VNC(MacOS)回家,这样虽然比较安全但比较麻烦,不适合给领导用。然后又一开始想着Parsec将就将就,但是没想到她办公室死活连不上。所以了解了一下tailscale,并在自己的HomeLab中加入了tailscale组网,于是有了这篇博客。

  • macOS kernel syscall hook

    0x01 Before startLast year, I spent most of my time developing on macOS. However, I’m not going on anymore on it. So I decide...
  • 我的13700K分核心超频

    配置

    CPU: 13700K
    主板:技嘉z690 Aorus Elite AX DDR4

  • Arch Linux单显卡直通教程(一、Windows直通)

    KVM单显卡直通系列教程 (一、Windows直通)

    我的配置

    1. CPU 13700k
    2. 主板 技嘉z690 aorus elite ax ddr4
    3. 显卡 技嘉6800xt超级雕
    4. 以太网卡 瑞昱RTL8125

    BIOS设置

    1. 打开:VT-X
    2. 关闭:Resize Bar
  • 在qemu中调试RISC-V

    有时通过qemu调试RISC-V指令集的程序还是挺有趣的,qemu-system-riscv32可以选择几个机型,一般使用的最多的是virt。 这是一个不对应任何真实硬件的平台,专为在虚拟机中使用而设计。virt需要使用合适的配置编译Linux...
  • hackgame-2022-wp

    0x01 总结

    第二次打ctf,4250分:

    image

    大概是最后一次参加ctf比赛了,太肝了,每天下班都肝到3点。

    这里记录一部分write up。

  • Linux内核设计与实现总结(8) —— I/O子系统

    I/O子系统

    本人觉得I/O子系统是Linux内核中最难的东西,因为它需要兼容横跨物理介质、文件系统、空间位置(网络),为上层提供统一接口,还需要保持高性能,这简直amazing。

    image

    I/O子系统的架构图如上图所示。

    这里将Linux I/O子系统分为VFS(虚拟文件系统)、块I/O、高速缓存这三个部分总结。

  • Linux内核设计与实现总结(7) —— 内存管理与进程地址空间

    [TODO]

  • Linux内核设计与实现总结(3) —— 进程管理与进程调度

    进程与线程

    Linux内核是不区分线程与进程的,线程只是一种特殊的进程,被视为与其他进程共享地址空间的进程。与windows这种在内核专门提供线程支持的操作系统不一样。

    task_struct与thread_info

    image

    task_struct(进程描述符)描述了一个进程的所有信息,是一个体系无关的结构,位于include/linux/sched.h。它包含进程打开的文件、挂起的信号、进程的状态、进程的pid等。保存在tasks双向循环链表中(见上一节的链表结构体总结),因此可以从一个进程结构体出发,索引到任何其他进程结构体。目前内核中,进程描述符是用slab分配器动态生成的,task_struct有一个void *stack成员变量指向进程的内核栈。

    thread_info是体系相关的,位于arch/xxx/include/asm/thread_info.h,它存放了线程上下文,包括是否可以抢占、当前进程是属于哪一种规范的可执行程序等。

    早期内核配置中,在X86体系并且CONFIG_THREAD_INFO_IN_TASK没有被时,进程的thread_info存放在进程的内核栈。如果是向下增长的栈,则thread_info在栈顶低地址;向上增长的栈,thread_info还是在低地址,只不过在栈底了。因此,可以通过内核栈的地址快速获得thread_info的地址。

    在thread_info中有一个struct task_struct *task变量指向task_struct。后来内核把X86的thread_info结构体中的这个task指针给去掉了(Move thread_info into task_struct),并且将thread_info放到了task_struct中。这个task指针,是为了寄存器在不够多的体系上,可以通过内核栈地址加偏移,找到thread_info,然后快速找到task_struct的。但是X86一直使用的是per_cpu的变量来保存正在使用cpu的进程的进程描述符:

    1
    DECLARE_PER_CPU(struct task_struct *, current_task);

    所以thread_info中的task变量是可有可无的。

    在进程调度时,会更新这个变量:

    1
    this_cpu_write(current_task, next_p);
  • Linux内核设计与实现总结(2) —— 内核数据结构

    内核数据结构

    Linux内核中实现了一些常见的数据结构,而且内核要求代码越高效越好,所以这些数据结构的实现极为优雅!因此,千万不要自己实现山寨的数据结构。

    内核的数据结构包括:

    1. 链表(双向循环)
    2. 队列
    3. IDR & IDA
    4. 红黑树

    链表

    链表头文件

    位于include/linux/link.h

/5