01010110011はx86で何かを意味し、ARMで何かを意味するため、他のプロセッサでは実行されません。x86-64はx86と下位互換性があるため、x86プログラムを実行できます。
バイナリは、OSが理解できる特定の形式です(windows = PE、mac / linux = ELF)
通常のバイナリでは、OSがそれをメモリにロードし、いくつかのフィールドに特定の値を入力します。これらの「特定の値」は、kernel32やlibcなどの共有ライブラリ(dllなど)に存在するAPI関数へのアドレスです。バイナリ自体はハードドライブ、ネットワークカード、ゲームパッドなどにアクセスする方法を知らないため、APIアドレスが必要です。プログラムはこれらのアドレスを使用して、OSまたは他のライブラリに存在する特定の機能を呼び出します。
本質的に、バイナリには、すべてを機能させるためにOSが埋める必要のある重要な部分がいくつか欠けています。OSが間違った部分を入力すると、それらが相互に通信できないため、バイナリは機能しません。これは、user32.dllを別のファイルに置き換える場合、またはmacosxでLinux実行可能ファイルを実行しようとした場合に発生します。
では、libcはどのようにしてファイルを開く方法を知っているのでしょうか。
libcは、OSコア機能への低レベルアクセスであるsyscallsを使用します。これは、特定のCPUレジスタにデータを入力してから、割り込み(特別なCPU命令)をトリガーすることによって行うことを除けば、関数呼び出しのようなものです。
では、OSはどのようにしてファイルを開く方法を知っているのでしょうか。
これは、OSが行うことの1つです。しかし、ハードドライブと通信する方法をどのように知るのでしょうか。そのようなものがどのように機能するかは正確にはわかりませんが、OSがBIOS関数にマップされている特定のメモリ位置を読み書きすることによってこれを行うと思います。
では、BIOSはどのようにしてハードドライブと通信する方法を知っているのでしょうか。
私もそれを知りません、私はそのレベルでプログラミングをしたことがありません。BIOSがハードドライブコネクタに配線されており、ハードドライブと「SATA」を通信するために1と0の正しいシーケンスを送信できると思います。たぶん「この分野を読む」などの簡単なことしか言えないでしょう
では、ハードドライブはどのようにしてセクターの読み取り方法を知るのでしょうか。
私はこれをまったく知らないので、ハードウェアの人に続けさせます。