IT袋

当前位置:主页 > 经验教程 > 系统教程 >

Linux

Linux 下“Hello World”的幕后发生了什么(4)

时间:2023-09-17 20:02:06 来源:IT袋 作者:苏晓敏
导读:Linux,自行验证 :运行 strace -f -e execve bash ,接着运行 python3 。其中的 -f 参数非常重要,因为我们想要跟踪任何可能产生的子进程。你应该可以看到如下的输出

Linux

自行验证:运行strace -f -e execve bash,接着运行python3。其中的-f参数非常重要,因为我们想要跟踪任何可能产生的子进程。你应该可以看到如下的输出:

[pid 3708381] execve("/usr/bin/python3", ["python3"], 0x560397748300 /* 21 vars */) = 0

第一个参数是这个二进制文件,而第二个参数是命令行参数列表。这些命令行参数被放置在程序内存的特定位置,以便在运行时可以访问。

那么,execve内部到底发生了什么呢?

6、获取该二进制文件的内容

我们首先需要打开python3的二进制文件并读取其内容。直到目前为止,我们只使用了stat系统调用来获取其元数据,但现在我们需要获取它的内容。

让我们再次查看stat的输出:

$ stat /usr/bin/python3
  File: /usr/bin/python3 -> python3.9
  Size: 9           Blocks: 0          IO Block: 4096   symbolic link
Device: fe01h/65025d    Inode: 6206        Links: 1
...

该文件在磁盘上占用 0 个块的空间。这是因为符号链接(python3.9)的内容实际上是存储在 inode 自身中:在下面显示你可以看到(来自上述 inode 的二进制内容,以hexdump格式分为两行输出)。

00000020  00 00 00 00 01 00 00 00  70 79 74 68 6f 6e 33 2e  |........python3.|
00000030  39 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |9...............|

因此,我们将需要打开/usr/bin/python3.9。所有这些操作都在内核内部进行,所以你并不会看到其他的系统调用。

每个文件都由硬盘上的一系列的构成。我知道我系统中的每个块是 4096 字节,所以一个文件的最小大小是 4096 字节 —— 甚至如果文件只有 5 字节,它在磁盘上仍然占用 4KB。

自行验证:我们可以通过debugfs找到块号,如下所示:(再次说明,我从 Dmitry Mazin 的《磁盘就是一堆比特》文章中得知这些步骤)。

$ debugfs /dev/vda1
debugfs:  blocks /usr/bin/python3.9
145408 145409 145410 145411 145412 145413 145414 145415 145416 145417 145418 145419 145420 145421 145422 145423 145424 145425 145426 145427 145428 145429 145430 145431 145432 145433 145434 145435 145436 145437

接下来,我们可以使用dd来读取文件的第一个块。我们将块大小设定为 4096 字节,跳过145408个块,然后读取 1 个块。

$ dd if=/dev/vda1 bs=4096 skip=145408 count=1 2>/dev/null | hexdump -C | head
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  c0 a5 5e 00 00 00 00 00  |..>.......^.....|
00000020  40 00 00 00 00 00 00 00  b8 95 53 00 00 00 00 00  |@.........S.....|
00000030  00 00 00 00 40 00 38 00  0b 00 40 00 1e 00 1d 00  |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....|
00000060  68 02 00 00 00 00 00 00  68 02 00 00 00 00 00 00  |h.......h.......|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080  a8 02 00 00 00 00 00 00  a8 02 40 00 00 00 00 00  |..........@.....|
00000090  a8 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |..@.............|

相关阅读