【问题标题】:What is the most minimalistic way to run a program inside an OS?在操作系统中运行程序的最简单的方法是什么?
【发布时间】:2022-08-06 21:53:21
【问题描述】:

通常,当我从 bash 启动程序时,它会派生 bash 并从中继承许多东西,例如 stdin、stdout。有没有其他方法来运行程序,没有这样的设置?也许它明确地打开 fd 1,写一些东西并关闭它?

我遇到了nohupdisown。但是这两个都将一个正在运行的进程从 bash 中分离出来,但最初该进程仍然从 bash 继承。也许有一种方法可以启动一个从无到有的进程?

我只是出于好奇而问这个,并没有实际目的。当一个程序在微控制器中运行时,它只是我们的程序在运行而没有额外的设置(如果需要设置,用户必须预先设置)。同样,有没有一种方法,即使在存在操作系统的情况下,也可以运行所编程的内容,而无需任何设置?

  • When a program is ran in a microcontroller, it is just our program that is running with no additional setup 你在比较苹果和橘子。
  • @tkausl 你的意思是,当我将微控制器与操作系统进行比较时?也许吧。但我问的是,如果不完全是我的程序,那么简约的东西是什么。

标签: process operating-system startup


【解决方案1】:

我假设您使用的是 Linux。

例如在我的系统(Ubuntu 20.04 x86_64)上打印top -u root

    PID    PPID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1       0 root      20   0  170380  11368   6500 S   0.0   0.0   0:23.52 systemd
      2       0 root      20   0       0      0      0 S   0.0   0.0   0:00.61 kthreadd
      3       2 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4       2 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
      5       2 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns
     10       2 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq
     11       2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_rude_
     12       2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_trace
     13       2 root      20   0       0      0      0 S   0.0   0.0   0:04.48 ksoftirqd/0
     14       2 root      20   0       0      0      0 I   0.0   0.0   1:28.82 rcu_sched

您会看到所有进程最终都从 PPID(父进程 ID)零继承。

这个过程不是一个过程,它代表了Linux 调度程序.然后 systemd (PID 1) 由内核启动,系统中的所有其他进程由 systemd 启动。

在用户级别top -u madfred

   3371       1 madfred   20   0   19928   7664   6136 S   0.0   0.0   0:11.62 systemd
   3372    3371 madfred   20   0  170404   2460      0 S   0.0   0.0   0:00.00 (sd-pam)
   3379    3371 madfred   39  19  659828  16348  12500 S   0.0   0.0   0:02.38 tracker-miner-f
   3402    3371 madfred   20   0    8664   5112   3412 S   0.0   0.0   0:00.94 dbus-daemon
   3407    3371 madfred   20   0  239712   6740   6064 S   0.0   0.0   0:00.03 gvfsd  

有一个user systemdroot systemd 启动并以用户身份运行。该用户 systemd 负责为该用户启动每个进程。

这对于确保 Linux 操作系统提供的所有保证(如安全性、内存保护、文件资源等)是必要的。

您想要的是用其他东西替换内核,这是很有可能的。检查例如:

https://wiki.osdev.org/Bare_bones

https://github.com/contiki-ng/contiki-ng

用您自己的自定义初始化程序替换 systemd(或旧的 /sbin/init)非常容易。检查这个答案:

Writing my own init executable

【讨论】:

  • 您好,PPID 专栏没有显示给我!
  • 此外,没有systemd。我得到的只是 5 个进程,都是init。我在 WSL 中运行 Ubuntu。
  • 我已将 PPID 保存为默认值。点击“F”进入字段选择,然后向下进入 PPID,空格使其处于活动状态,向右箭头选择 PPID 字段并向上移动以将其放置在 PID 字段之前,“Q”退出字段选择窗口。
  • 1) PPID 的设置不是持久的! 2) 如果对您有帮助,它会将版本显示为20.04.4 LTS (Focal Fossa)
  • 那么,在 Linux 下,每个进程都必须创建为 systemd 的子进程吗?另外,如果我更换内核映像,那么我想我将无法重新启动到原始内核。尽管如此,那篇文章还是不错的。我从没想过开始写内核这么简单:)
猜你喜欢
  • 2021-11-15
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多