2013-08-18 39 views
7

Tôi đang làm việc trên phiên bản đã sửa đổi của hạt nhân 2.6.35 cho Olinuxino, nền tảng dựa trên ARM9. Tôi đang cố gắng sửa đổi trình điều khiển quản lý nguồn (phần kiến ​​trúc cụ thể).Tắt (linux) linux từ hạt nhân-không gian

Bộ vi xử lý là Freescale i.MX23. Bộ xử lý này có một "đặc biệt" pin, được gọi là PSWITCH, mà gây ra một ngắt được xử lý bởi trình điều khiển quản lý điện năng. Nếu nút này được bấm, hệ thống sẽ chuyển sang chế độ chờ. Điều này được thực hiện trong trình điều khiển bằng cách gọi số pm_suspend(PM_SUSPEND_STANDBY).

Khi thiết lập phần cứng của tôi, thay vào đó, hãy tắt hệ thống. Vì vậy, câu hỏi của tôi là:

Cách ưa thích cho quy trình không gian hạt nhân để kích hoạt hệ thống dừng/tắt nguồn là gì?

Tôi cho rằng có một chức năng nhỏ gọi là tốt, nhưng tôi không thể tìm thấy nó cho đến nay.

Mã hạt nhân của tôi (tệp tôi đang làm là arch/arm/mach-mx23/pm.c) có thể tìm thấy ở đây: github.com/spairal/linux-for-lobster, mặc dù câu hỏi của tôi yêu cầu một cách tiếp cận hạt nhân Linux chung.

+0

Bạn có thể thực hiện 'strace' trên' init 0' và xem các syscalls nào được thực hiện. –

Trả lời

9

Nhất chung cách sẽ cho lái xe của bạn để gọi shutdown như một helper userspace:

static const char * const shutdown_argv[] = 
    { "/sbin/shutdown", "-h", "-P", "now", NULL }; 

call_usermodehelper(shutdown_argv[0], shutdown_argv, NULL, UMH_NO_WAIT); 

(Giả sử bạn có một /sbin/shutdown nhị phân được cài đặt). Điều này sẽ tắt không gian người dùng một cách rõ ràng, ngắt kết nối các hệ thống tập tin và sau đó yêu cầu tắt máy và tắt nguồn. Tuy nhiên, bạn có thể làm tốt hơn điều này - ví dụ nếu bạn có thể đảm bảo rằng không có hệ thống tập tin đĩa nào được gắn đọc/ghi, bạn có thể nói một chuỗi hạt nhân gọi hàm kernel_power_off() (không nên thực hiện) từ bối cảnh ngắt).

+0

Điều đó hoạt động rất đẹp. Tôi hy vọng sẽ có một giải pháp mà did't liên quan đến gọi userspace, nhưng tôi đoán có rất nhiều công cụ userspace mà cần phải được thực hiện ... Chỉ cần một chi tiết: shutdown_argv nên const char * const * hoặc []. – pcarranzav

+0

@pcarranzav: Ahh có, sửa lỗi đánh máy đó, cảm ơn. – caf

+0

Tôi đã sử dụng kernel_halt() để thực hiện điều này trên powerpc nhúng của tôi, và nó dường như đã trải qua quá trình init 0. Bạn có nghĩ rằng tôi đã bỏ lỡ một cái gì đó? –

Các vấn đề liên quan