用户态进程:如何创建,如何销毁

如何创建 分为两个步骤: fork()/clone() 创建新内核线程 execve() 执行新用户态程序 新 forked 出来的线程如何开始工作 在 fork()/clone() 的过程中: 由 copy_process() 调用体系结构相关的 copy_thread() 来构造新线程的上下文; 由 wake_up_new_task() 将新线程的 task_struct 挂到某个 CPU 的 run queue 上,待调度器调度执行。 x86_64 1copy_thread(p, args) { 2 struct pt_regs *childregs = task_pt_regs(p); 3 struct fork_frame …

关于 SELinux 策略的点滴

具体规则的查询 关于 SELinux 策略,我们时常要去了解:关于系统中的一个操作,为什么 SELinux 会允许/拒绝;其背后具体的规则是怎样的。此时我们可以使用 sesearch 来查询策略中具体的规则: 1# 探究【主体 A】对【客体 B】是否有【类型 C】的【权限 D】: 2# sesearch -A -s A -t B -c C -p D 3sesearch -A -s kernel_t -t unconfined_t -p setsched 4sesearch -A -s kernel_t -t unconfined_t -c key -p view 在查出对应的规则后,可以配合 seinfo 进一步了解规则中主、客体的 …

SELinux:系统启动时通过用户态配置动态关闭的流程

要在系统启动时彻底关闭 SELinux(即设为 Disabled 状态),已知有几种办法: 内核启动参数 selinux=0 配置 /etc/selinux/config 关于 /etc/selinux/config,我们知道可以通过它来对 SELinux 进行初始设置,包括运行状态以及要加载的策略文件。那么,这是怎么做到的呢?又是谁实际执行了这些操作?在开闭 SELinux 上,通过它与通过内核启动参数有何不同? 首先,内核对该文件完全是不感知的:查遍 security/selinux 下的所有代码,都没有关于该文件的内容。随后在 Fedora 的 Wiki 上查到: When booting up the machine, …

Slab Merging 特性

该特性在条件允许的情况下可以实现将属性相近的 slab caches(即 struct kmem_cache)合并,以提高内存利用效率,减少内存碎片的产生。该特性最初独属于 SLUB 分配器(见补丁:81819f0fc828 (“SLUB core”) 的 G 小节),随后被拓展到了 SLAB 分配器:423c929cbbec (“mm/slab_common: commonize slab merge logic”) 。 然而从系统安全的角度,该特性带来一个问题:若由某子系统或模块创建的专用 slab cache 与通用的 slab caches(即 kmalloc() 使用的那些) …

ARM64 虚拟地址长度判别

ARM64 支持多种虚拟地址长度,在运行时可通过 vabits_actual 变量判别。 vabits_actual 由 5383cc6efed1 (“arm64: mm: Introduce vabits_actual”) 于 v5.4 引入(patchwork 链接 ),由 67e7fdfcc682 (“arm64: mm: introduce 52-bit userspace support”) 引入的 vabits_user 演进而来。 在 v5.10 中,该变量的赋值位于 arch/arm64/kernel/head.S 的 __create_page_tables: …