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

进程与线程

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

task_struct与thread_struct

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

thread_struct是与体系强相关的,存放了一些进程切换时的 上下文。

早期内核代码中,在X86体系并且CONFIG_THREAD_INFO_IN_TASK设置为N时,进程的thread_struct存放在进程的内核栈。如果是向上增长的栈,thread_struct则在栈顶。在thread_struct中,有一个struct task_struct *task变量。后来内核代码把X86的thread_struct结构体中的task指针给去掉了(Move thread_info into task_struct),因为这个变量本来是为了寄存器在不够多的体系上,可以通过内核栈与偏移找到进程描述符。但是X86一直使用的是per_cpu的变量来保存正在使用cpu的进程的进程描述符:

1
DECLARE_PER_CPU(struct task_struct *, current_task);

所以thread_struct中的task变量可有可无,就去掉了。

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

1
this_cpu_write(current_task, next_p);
Read more

Linux内核设计与实现总结(2) —— 内核数据结构

内核数据结构

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

内核的数据结构包括:

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

链表

链表头文件

位于include/linux/link.h

Read more

Linux内核设计与实现总结(1) —— qemu内核调试环境搭建(macOS)

宿主机系统

  1. macOS 12.4 (x86)

安装qemu

qemu相比于vmware,简单、轻便,可以直接指定linux内核,再指定一个文件系统,即可调试。硬盘、网络设备可以后加。

首先我尝试了utmapp/UTM,这是个适用于iOS/macOS的虚拟机,基于qemu。但是在指定内核启动镜像bzImage和initramfs后,遇到了问题,一直报错:

1
The bootindex 0 has already been used

搞了一会没搞出来,索性不用UTM了,直接上qemu。

使用homebrew可以直接安装qemu。

1
➜  ~ brew install qemu

目前安装的是7.0.0_2。

安装完成之后验证一下:

1
2
3
4
5
6
7
➜  ~ qemu-system-x86_64 --help
QEMU emulator version 7.0.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
usage: qemu-system-x86_64 [options] [disk_image]

'disk_image' is a raw hard disk image for IDE hard disk 0
....
Read more

魔改解决超级雕rgb fusion鼠标卡顿问题

前言

仅供学习研究。

上个星期在海鲜市场收了一块技嘉超级雕6800XT,准备用来组黑苹果。

系统是Windows 11,到手之后安装了安装显卡驱动和技嘉rgb控制软件rgb fusion 2.0(B22.0414.1,官网最新版),小屏幕倒是挺好看的,但鼠标滑动总觉得时有点卡顿,用鼠标连续画圈最为明显(眼睛比较敏感)。

大约1秒卡顿一次。如下图所示,第一张图正常,第二张图第一个鼠标位置到第二个鼠标位置滑动距离过长,卡顿:

Read more

记一次luac分析

前言

某mips架构的路由器上的lua脚本a.lua,被编译成了luac二进制格式。初步分析发现指定lua使用固件中的共享库liblua.so.5.1.5可运行该luac文件,同架构的官方openwrt则不能运行该luac,所以判断出lialua.so.5.1.5被魔改了。

Read more

折腾:无线宝鲁班openwrt 21.02.1

免责声明

  1. 仅用于测试与学习研究,作者没有对该设备进行任何形式的“破解”,所有信息都是通过正常的方式获取。
  2. 如果任何单位或个人认为本文内容可能涉嫌侵犯其权利,则应及时联系作者并要求删除相关内容。
  3. 作者对本文带来的潜在问题概不负责,包括但不限于由任何错误导致的任何损失或损害。

前言

前几天在京东上买了个京东云无线宝鲁班,硬件配置如下:

1
2
3
4
5
CPU:MT7621A
内存:南亚512MB
闪存:XM25QH128C 128Mit/16MB
无线:MT7975DN + MT7905DAN
网口:全千兆LLLW

本来天天放那边跑分换京豆的,但是这官方固件实在有点用不下去,所以给它搞个适配个openwrt吧。

Read more

pwnable.kr ELF writeup

0x01 分析

首先ssh上去看看。

elf.py:

1
2
3
4
5
6
7
8
9
10
...
libc = CDLL('libc.so.6')
flag = CDLL('./libflag.so')

...
for i in xrange(25):
sys.stdout.write('addr?:')
sys.stdout.flush()
addr = int(raw_input(), 16)
libc.write(1, c_char_p(addr), 32)

有25次机会,每次可以读进程地址空间的32字节…

再看看gen.py。

Read more