Bash không biết gì về ELF. Nó chỉ đơn giản thấy rằng bạn đã yêu cầu nó chạy một chương trình bên ngoài, vì vậy nó chuyển tên bạn đã đặt cho nó execve(2)
. Kiến thức về những thứ như các định dạng tập tin thực thi, dòng công việc , và thực hiện quyền cuộc sống đằng sau đó syscall , trong kernel.
(Tương tự đối với các shell khác, mặc dù chúng có thể chọn sử dụng chức năng khác trong exec(3)
gia đình.)
Trong Bash 4.3, điều này xảy ra trên dòng 5195 của execute_cmd.c
trong shell_execve()
chức năng.
Nếu bạn muốn hiểu Linux ở cấp mã nguồn, tôi khuyên bạn nên tải xuống một bản sao của Research Unix V6 hoặc V7 , và trải qua điều đó thay vì tất cả sự phức tạp trong các hệ thống Linux hiện đại. Sách Lions là một hướng dẫn tốt về mã.
V7 là nơi vỏ Bourne ra mắt. Toàn bộ mã nguồn C của nó chỉ lớn hơn một nửa kích thước của một tệp C trong Bash. Các vỏ Thompson trong V6 là gần một nửa kích thước của bản gốc Bourne shell. Tuy nhiên, cả hai lớp vỏ đơn giản này đều làm cùng một thứ với Bash và vì cùng một lý do. (Nó dường như là một execv(2)
cuộc gọi từ texec()
trong vỏ của Thompson và một execve()
cuộc gọi từ execs()
trong service.c
mô-đun của vỏ Bourne .)