同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
操作系统课是一门计算机专业的基础课,这门课虽然看上去有点泛泛而谈,但它涉及的知识却是计算机中比较系统和全面的基础内容。一个没有操作系统理论的程序员,或者从业人员,可能并不影响它的实际开发和工作,但是当他们回顾这门课,也能从里面获得不少真知灼见,从而扩展自己的认识和加身自己的理解。
x86 为例。开机复位,进入 16bit 模式,cs:ip = ffff0,该地址为硬件厂家的配置的 rom 固件程序(firmware),该程序就是 bios 或者 uefi。
bios 将引导设备的 0x7c00 位置数据读取引导程序(如 grub),然后引导程序再加载系统(linux、windows 等),并最终运行系统。
qemu seabios: 开源代码 https://www.seabios.org/SeaBIOS
模拟器 qemu:
# 实验代码:curl -Lvo linux-minimal.zip 'http://box.nju.edu.cn/f/3f67e092e1ba441187d9/?dl=1'
# 制作启动映像
cd initramfs && find . -print0 | cpio --null -ov --format=newc | gzip > ../build/initramfs.cpio.gz
# 使用虚拟机启动内核和映像
qemu-system-x86_64 \
-nographic \
-serial mon:stdio \
-m 128 \
-kernel vmlinuz \
-initrd build/initramfs.cpio.gz \
-append "console=ttyS0 quiet acpi=off"
# qemu 调试快捷键:ctrl + a; c
# busybox 是一个单文件工具包,使用方式 busybox ls
# 创建快捷方式
for i in $(busybox --list)
do
busybox ln -s busybox "\bin\$i"
done
# 挂载内核信息文件系统
mkdir -p /proc
mkdir -p /sys
mount -t proc none /proc
mount -t sysfs none /sys
# 提示符
export PS1='(busybox)# '
// 游戏修改器
FILE *fp = popen("pidof dosbox", "r");
fscanf(fp, "%d", &pid);
sprintf(buf, "/proc/%d/mem", pid);
fd = open(buf, O_RDWR);
scan(fd)
write(fd)
// 热更新
// 48 b8 ff ff ... movabs $0xfff.., %rax
// ff e0 jmpq *%rax
#define ROUNDDOWN(ptr) ((void*))(((uintptr_t)ptr & ~0xfff))
size_t pg_size = sysconf(_SC_PAGESIZE);
char* pg_boundary = ROUNDDOWN(old);
int flags = PROT_WRITE | PROT_READ | PROT_EXEC;
mprotect(pg_boundary, 2 * pg_size, flags);
// 在原函数头部插入跳转指令,跳到新函数
memcpy(old + 0, "\x48\xb8", 2);
memcpy(old + 2, &new, 8);
memcpy(old + 10, "\xff\xe0", 2);
mprotect(pg_boundary, 2 * pg_size, flags & ~PROT_WRITE);
cli (command line interface)命令行和 gui(graph user interface)图形用户接口是内核的外壳(shell)。有了 shell,就可以将用户的操作,转化为机器的指令。所以 shell 也是一门编程语言。
管道:
信号:
会话(session): 首先创建会话,然后会话内有进程组(process group),进程组(process group)内有 n 个进程。控制终端(controulling terminal)标记进程组是否后台执行,任何时候只有一个前台进程,信号会发送到这个进程组。
// 实验代码:curl -OvL http://jyywiki.cn/pages/OS/2022/demos/sh-xv6.c
// zig cc sh-xv6.c -o sh -nostdlib
// 注意:只能调用当前目录下的程序或给出路径来调用,因为没有 PATH 机制
// 简单的 shell
// 1. 解析命令
// 2. 系统调用
libc 是 c 语言的标准库,他是很多应用程序的直接基础,因此当你实现一个 libc,就可以移植很多相关的实用程序到你的系统中去。
类型移植:
系统调用封装:
文件描述符封装:
进程状态封装:
地址空间封装:
[南京大学2022操作系统-P9]
:https://www.bilibili.com/video/BV1yP4y1M7FE
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。