当内核代表用户程序(即系统调用)执行时是否使用内核空间?或者它是所有内核线程(例如调度程序)的地址空间?
如果是第一个,那么是否意味着普通用户程序的内存不能超过3GB(如果划分为3GB + 1GB)?另外,在这种情况下,内核如何使用高端内存,因为高端内存中的页面将映射到哪个虚拟内存地址,因为 1GB 的内核空间将被逻辑映射?
在 UNIX 中,当父进程消失时,我认为所有子进程都将 init 重置为其父进程。这不是一直正确吗?有任何例外吗?
我正在阅读有关设置自定义 initramfs的教程,其中指出:
唯一缺少的是 /init,它是 initramfs 根目录中的可执行文件,一旦加载内核就会执行。因为 sys-apps/busybox 包含一个功能齐全的 shell,这意味着您可以将 /init 二进制文件编写为一个简单的 shell 脚本(而不是使它成为一个必须编译的用汇编程序或 C 编写的复杂应用程序)。
并给出了一个以 init 开头的 shell 脚本示例 #!/bin/busybox sh
到目前为止,我的印象是 init 是启动的主进程,所有其他用户空间进程最终都是 init 的子进程。但是,在给定的示例中,第一个进程实际上是bin/busybox/ sh从中产生后来的 init 的。
这是正确的解释吗?例如,如果我当时有一个可用的解释器,我可以将 init 编写为 Python 脚本等吗?
我正在尝试在 Linux 系统上调试 init 脚本;我正在尝试传递init=/bin/sh给内核以使其在sh不启动的情况下启动,init以便我可以手动运行 init 序列。
我发现内核init无论如何都在启动。在启动期间,printk 消息之一是命令行,这表明该行设置正确;此外,我可以使用内核命令行影响其他事情。我已经检查以确保路径存在;确实如此。
这是一个busybox系统,init是busybox的符号链接;所以为了确保busybox在PID为1时不会做奇怪的事情,我还尝试将非busybox程序作为init运行;那也没有用。似乎无论我做什么,init 都会运行。
什么可能导致这种行为?
假设我正在编写自己的在 Linux 内核上运行的 init 程序。
当我的 init 程序以返回值 0 退出时会发生什么?
此外,如果返回值非零,行为是否不同?
我有一个最小的 Linux 系统。
INIT是/bin/bash,只有最低限度以库/lib/,/dev/静态填充,没有运行的守护进程(无udev的,..)
当 bash 启动时,我收到以下错误:
bash: cannot set terminal process group (-1) inappropriate ioctl for device
bash: no job control in this shell
Run Code Online (Sandbox Code Playgroud)
当我用 strace 启动 bash 时,我得到以下输出:
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
....
readlink("/proc/self/fd/0", "/dev/console"..., 4095) = 12
stat("/dev/console", {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
open("/dev/console", O_RDWR|O_NONBLOCK) = …Run Code Online (Sandbox Code Playgroud) 我不知道“单用户模式”是否是正确的术语,但我继续:
在 GRUB 菜单上,我按下E编辑运行配置。在以 开头的行中linux,我附加了以下内容:
rw init=/bin/bash
Run Code Online (Sandbox Code Playgroud)
并按下F10。计算机启动到 root shell 而不询问任何密码。
问题是,信号不起作用。例如,当我运行一个命令时,我无法通过按Ctrl+退出该命令C。
这是预期的吗?如果是,这是什么原因,我该如何解决?是否与单用户模式下的终端模拟器有关?
From当操作系统关闭时,服务管理器如何知道它应该向其服务发送 SIGTERM 和 SIGKILL?
systemd 既是 init 又是服务管理器
“init”和“服务管理器”有什么区别?
我猜他们是同一个东西?
什么是“init”而不是“服务管理器”的例子?反之亦然?
谢谢。