Làm thế nào để hệ thống tắt kernel linux hoạt động bên trong?


28

Tôi có một ý tưởng sơ bộ về cách không gian người dùng và hệ thống init (có thể là init sysV / upstart / systemd) cổ điển hoạt động khi tắt hệ thống. (Về cơ bản, có một chuỗi thành công của "Dừng lại!", "Làm ơn dừng lại ngay bây giờ", "Quá trình tôi cần giết bạn để dừng lại" và chờ đợi ... mọi thứ đang diễn ra).

Dù sao tôi cũng không biết làm thế nào để tắt hệ thống hoạt động trong kernel (nơi chắc chắn cũng có rất nhiều thứ để làm)?

Tôi đã cố gắng xem xét tài liệu kernel https://www.kernel.org/doc/htmldocs/ và thậm chí đã sử dụng công cụ tìm kiếm pal của NSA để giúp tôi bắt đầu tìm hiểu cách thức hoạt động của nó.

Ngoài ra tôi đã tìm kiếm trên SE U + L và không tìm thấy gì (tôi có bỏ qua nó không?)

Dù sao, câu hỏi, mặc dù có khả năng hơi khó khăn, nhưng sẽ có một câu trả lời trong mạng Hỏi & Đáp này vì tôi cho rằng nhiều người quan tâm hơn để có một bản phác thảo cho những gì xảy ra trong nhân linux khi tắt máy.

Có khả năng cũng có thay đổi để liên kết đến một số giải thích chi tiết hơn.

Một câu trả lời có thể bao gồm các cuộc gọi hệ thống nào và tín hiệu hạt nhân nào được sử dụng?

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c dường như là tệp x86 được sử dụng liên quan đến khởi động lại

có thể đoạn trích được tìm thấy ở đây http://lxr.free-electrons.com/source/kernel/reboot.c#L176 có thể được sử dụng để đưa ra lời giải thích

176 void kernel_power_off (void)
177 {
178 kernel_shutdown_prepare (HỆ THỐNG_PHẦN_OFF);
179 nếu (pm_power_off_prepare)
180 pm_power_off_prepare ();
181 di chuyển_to numboot_cpu ();
182 syscore_shutdown ();
183 pr_emerg ("Tắt nguồn \ n");
184 kmsg_dump (KMSG_DUMP_POWEROFF);
185 máy_power_off ();
186}
187 Billing_SYMBOL_GPL (kernel_power_off);

8
kỳ lân có thể ở bên bạn không
Kiwy

1
@Kiwy cảm ơn vì lời đề nghị. Tôi sẽ chấp nhận sau một thời gian trôi qua để có câu trả lời tốt hơn tiềm năng. Nhưng ít nhất một số câu trả lời là bây giờ.
nhân

Đừng cảm ơn tôi, cảm ơn Kỳ lân!
Kiwy

Hãy nhận biết rằng có / là một bước nhảy ra ngoài cửa sổ tùy chọn để shutdown(8)tức là bị phản đối -n một mà tôi nghĩ rằng trong tài liệu unix cũ sử dụng để đọc " shutdown hệ thống mình - đơn vị nòng cốt là ON FIRE " một cách hiệu quả một hệ thống lộn xộn kill-switch mà sẽ / có thể để các bit nằm rải rác trên sàn (hoặc ít nhất là các hệ thống tệp ở trạng thái bị hỏng) - người ta tưởng tượng điều này sẽ được sử dụng cho hệ thống loại khung chính trong đó ai đó vừa bắt tay vào quạt làm mát. 🕱
SlySven

Câu trả lời:


26

Các tài nguyên chính để hiểu cách thức hoạt động của nhân Linux là:

  1. Các tài liệu .
  2. Tin tức hàng tuần của Linux .
  3. Nguồn. Đây là một con thú phức tạp, dễ hiểu hơn một chút thông qua LXR , tài liệu tham khảo chéo của Linux. Biến thể LXR chạy trên lxr.linux.no đẹp hơn các biến thể khác, nhưng nó thường bị hỏng.

Trong trường hợp này, tôi không thể tìm thấy bất cứ điều gì có liên quan tập trung trong tài liệu hoặc trên LWN, vì vậy LXR là vậy.

Điều cuối cùng mà mã người dùng thực hiện là gọi cuộc gọi reboothệ thống . Phải mất 4 đối số, vì vậy tìm kiếm SYSCALL_DEFINE4(reboottrên LXR, dẫn đến kernel/reboot.c. Sau khi kiểm tra các đặc quyền của người gọi và các đối số, điểm vào của tòa nhà gọi một trong một số chức năng: kernel_restartkhởi động lại, kernel_halttạm dừng trên một vòng lặp chặt chẽ, kernel_powerofftắt nguồn hệ thống, kernel_kexecđể thay thế kernel bằng một cái mới (nếu được biên dịch), hoặc hibernateđể lưu bộ nhớ vào đĩa trước khi tắt nguồn.

kernel_restart, kernel_haltkernel_power_offlà khá tương tự:

  1. Đi qua reboot_notifier_list, đó là một danh sách các hook mà các thành phần kernel có thể đăng ký để thực thi mã khi tắt nguồn. Chỉ có một vài trình điều khiển cần thực thi mã ở giai đoạn này, chủ yếu là các cơ quan giám sát.
  2. Đặt system_statebiến.
  3. Vô hiệu hóa trình trợ giúp usermode , để đảm bảo rằng không có mã người dùng sẽ được bắt đầu nữa. (Vẫn có thể có các quy trình hiện có ở giai đoạn này.)
  4. Gọi device_shutdownđể giải phóng hoặc tắt nguồn tất cả các thiết bị trên hệ thống. Rất nhiều trình điều khiển móc vào giai đoạn này.
    Lưu ý rằng bất kỳ hệ thống tập tin nào vẫn được gắn kết tại thời điểm này đều bị buộc phải vượt qua một cách hiệu quả. Người gọi của cuộc gọi hệ thống chịu trách nhiệm cho bất kỳ kết nối sạch sẽ.
  5. Chỉ để tắt nguồn, nếu ACPI được cấu hình, có thể thực thi mã để chuẩn bị chuyển sang trạng thái ACPI S5 (tắt nguồn mềm).
  6. Trong một máy nhiều CPU, mã có thể chạy trên bất kỳ CPU nào, bất cứ khi nào gọi lệnh hệ thống. migrate_to_reboot_cpuchú ý chuyển sang một CPU cụ thể và ngăn bộ lập lịch gửi mã trên các CPU khác. Sau thời điểm này, chỉ có một CPU duy nhất đang chạy.
  7. syscore_shutdowngọi shutdownphương thức hoạt động syscore đã đăng ký . Tôi nghĩ rằng điều này chủ yếu là về việc vô hiệu hóa các ngắt; vài cái móc có một shutdownphương pháp.
  8. Đăng nhập một thông tin thông tin - bài hát của thiên nga.
  9. Cuối cùng đi đến phần còn lại trong một số cách phụ thuộc máy bằng cách gọi machine_restart, machine_halthoặc machine_power_off.

Các ngủ đông đang đi qua các bước sau:

  1. Lặp lại thông qua các móc quản lý năng lượng .
  2. Đồng bộ hóa hệ thống tập tin.
  3. Đóng băng tất cả mã người dùng .
  4. Ngăn chặn cắm nóng thiết bị .
  5. Kết xuất trạng thái hệ thống vào không gian trao đổi.
  6. Nếu mọi thứ thành công, ngủ đông phần cứng . Điều này có thể liên quan đến việc gọi kernel_restart, kernel_halthoặc kernel_power_off, hoặc một số phương pháp ngủ đông dành riêng cho nền tảng.

Một cách khác để tắt hệ thống là machine_emergency_restart. Điều này được gọi bằng phím SysRq ma thuậtB . Các Ocông trình trọng điểm khác nhau: nó gọikernel_power_off .

Hệ thống cũng có thể tắt đến hoảng loạn , tức là một lỗi không thể phục hồi. Hoảng sợ cố gắng đăng nhập một tin nhắn, sau đó khởi động lại hệ thống (thông qua cơ quan giám sát phần cứng hoặc khởi động lại khẩn cấp).


+1 cảm ơn! @Gilles nếu bạn muốn triển khai một số mã sẽ xóa / khử trùng RAM của máy như một bước cuối cùng, bạn sẽ đăng ký một thao tác syscore cho syscore_shutdown(nghĩa là sẽ giải quyết câu hỏi khác của tôi unix.stackexchange.com/q/122540/24394 ) . Bước (1) và bước (7) đều cho phép đăng ký nội dung được thực thi khi tắt máy, không biết chắc chắn điều gì + Tôi đã có ấn tượng rằng thứ tự thực hiện của các cuộc gọi lại trong (1) và (7) không thể bị ảnh hưởng! Tôi sẽ các tài liệu bạn đề cập, nhưng nếu bạn biết! cảm ơn!
nhân

Tôi ngạc nhiên câu hỏi này và câu trả lời không có nhiều upvote.

2

Đây chỉ là một câu trả lời một phần và tôi chắc chắn mời câu trả lời khác, có thể sẽ đầy đủ và rõ ràng hơn.

Nội dung của câu trả lời này được lấy từ kernel/reboot.ctệp của kernel linux 3.13 (có thể không phải là phỏng đoán đầu tiên vì tên không phải là shutdown.c mà là restart.c)

Dù sao trong đó về cơ bản chúng ta có ba chức năng phác họa quá trình tắt hệ thống

  • void kernel_halt(void) // kết thúc bằng một hệ thống ở trạng thái dừng
  • void kernel_power_off(void) // kết thúc bằng một hệ thống tắt
  • void kernel_restart(char *cmd) // kết thúc hệ thống để khởi động lại nó

Các chức năng này rất ngắn gọn và do đó có thể được dán ở đây hoàn chỉnh. Mã của họ tốt nhất cho thấy các bước được thực hiện trên đường tắt máy trong kernel. (các ý kiến ​​là của tôi và có thể không lý tưởng và chính xác 100%, hãy tự kiểm tra xem có chắc chắn không. Thật đơn giản.

void kernel_halt(void)

void kernel_halt (void)
{
    // Bước 1 không:
    // a) chức năng gọi / gọi lại được đăng ký để chạy khi khởi động lại / tắt máy
    // b) đặt system_sate thành HỆ THỐNG_HALT
    // c) dừng tương tác userspacetool
    // d) gọi hàm device_shutdown ()
    kernel_shutdown_prepare (HỆ THỐNG_HALT);

    // Bước 2: Tôi nghĩ rằng điều này chủ yếu là cần thiết cho các hệ thống đa cpu
    di chuyển_to numboot_cpu ();

    // Bước 3:
    // syscore_shutdown - Thực hiện tất cả các cuộc gọi lại tắt máy lõi đã đăng ký 
    syscore_shutdown ();

    // tin nhắn thứ 4
    pr_emerg ("Hệ thống tạm dừng \ n");
    kmsg_dump (KMSG_DUMP_HALT);

    // cpu-halt-code cụ thể của cuộc gọi thứ 5
    máy_halt ();
}

toàn bộ điều được bắt đầu với sys_rebootcuộc gọi hệ thống, với điều kiện là nó không chỉ khởi động lại mà còn tắt máy, không phải là điều trực tiếp để kết nối với quá trình tắt máy bằng mọi cách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.