2013-04-12 28 views
16

Thư viện 64 bit có thể hoạt động trong ứng dụng 32 bit không? Ví dụ, GUI ứng dụng của tôi sử dụng Qt 32 bit. Và lõi kinh doanh của tôi là một thư viện 64 bit. Hệ điều hành là 64 bit. Họ có thể làm việc cùng nhau và làm thế nào? Cảm ơn.32 bit và 64 bit có thể hoạt động cùng nhau không?

+0

Hạt nhân của bạn là hạt nhân 32/64 bit. Hạt nhân của bạn không phải là thư viện. – MSalters

+2

Tại sao tất cả các bạn nghĩ ngay về hạt nhân Linux và hệ điều hành? Bởi _ "hạt nhân" _ ông có thể có nghĩa là thư viện riêng của mình mà là một loại lõi trong ứng dụng của mình (có, điều này thực sự là một chút hình thành cách để gọi nó, nhưng một số người làm). Để kết hợp với nhau, anh ta có ứng dụng 32 bit chỉ chứa GUI và một thư viện 64 bit riêng biệt với một số logic. –

+0

Xem ... Tôi đã đúng, anh ta chỉ sử dụng sai thuật ngữ ... ':)' –

Trả lời

18

Tóm lại: Bạn không thể liên kết ứng dụng 32 bit với thư viện 64 bit. Bạn có thể chạy một ứng dụng 32 bit, sử dụng thư viện chia sẻ 32 bit trên hệ điều hành 64 bit (ít nhất là tất cả các bộ xử lý 32-64 bit phổ biến như AMD, Intel và Sparc). Nhưng điều đó không liên quan đến bất kỳ thư viện nào.

Câu trả lời dài hơn: Tôi đã tham gia (ở vùng ngoại ô) của một số nhóm thiết kế hạt nhân Linux 64 bit cho x86. Có một thời gian ngắn (so với toàn bộ dự án, các cuộc thảo luận kéo dài một vài giờ) một số cuộc thảo luận về cách bạn có thể thực hiện công việc này một cách kỹ thuật. Tóm tắt ngắn gọn về điều này là trong 64-bit có các thanh ghi không có sẵn trong 32-bit. Ngoài ra còn có vấn đề về địa chỉ bộ nhớ và thêm 32 bit trong thanh ghi. Tất cả những điều này có thể được giải thích giả sử chính thư viện "biết" rằng đó là một thư viện tương thích 32-bit. Nhưng sau đó về cơ bản chúng tôi có một thư viện 64-bit được viết thành một thư viện 32-bit, và chúng tôi đã mất điểm.

"Đăng ký nhiều hơn" có thể không áp dụng cho một số bộ vi xử lý, nhưng dải địa chỉ/bit lớn hơn chắc chắn áp dụng cho TẤT CẢ bộ xử lý tương thích 32 và 64 bit. Và tôi không biết về bất kỳ bộ xử lý nào cho phép mã 32 bit gọi thư viện được chia sẻ 64 bit hoặc thư viện tĩnh. Nó không hoạt động trừ khi mã được viết cụ thể để đối phó với điều đó, mà đánh bại mục đích của việc có một thư viện 64-bit chung để hỗ trợ các ứng dụng 32 bit.

Chỉnh sửa:

Các thảo luận ở trên liên kết một đơn vị thực thi, ví dụ: một tệp thi hành, một thư viện được chia sẻ hoặc một thư viện tĩnh. Đó phải là tất cả "một chút", hoặc là 32 hoặc 64 - không pha trộn.

Khi quá trình trao đổi với quy trình khác (ví dụ: ứng dụng GUI hiển thị trạng thái từ quá trình không phải GUI), miễn là hai quy trình sử dụng cùng một giao thức [và thông thường, IPC không cho phép chuyển con trỏ anyway, do đó, chuyển đổi 32-/64-bit không phải là một vấn đề lớn], bạn có thể có một quá trình đó là 32-bit và khác là 64-bit.

+0

Có một số thực thi mã nhị phân hỗn hợp trên các hệ thống Amiga có thể chạy các tệp nhị phân có chứa mã 68k và PPC. Các nhánh được liên kết để thực hiện chuyển ngữ cảnh khi thực thi chạy từ một CPU này sang CPU khác. Tuy nhiên, nếu tôi nhớ chính xác thì cả hai đều chạy ở chế độ 32b. – Jens

+0

-1 "Trong NO ngắn". không đúng.tất cả các chương trình 32 bit trên Windows 64 bit đều tận dụng được các dịch vụ 64 bit, vì chúng chạy trên hệ điều hành 64 bit. để thu hẹp khoảng cách với thư viện 64 bit, bạn có thể sử dụng bất kỳ số lượng công nghệ nào, bao gồm cả COM. –

+2

@Alf: COM là RPC. Với RPC, bạn có thể thu hẹp khoảng cách giữa 32 và 57 bit. Đó không phải là đặc biệt. Khi các thư viện đi, 64 bit Windows vẫn phát hành với các phiên bản 32 bit của các thư viện (DLL), trong phân đoạn WoW, chính xác bởi vì bạn không thể trộn bitness trong một tiến trình đơn lẻ. – MSalters

1

Nếu bạn chạy trên Windows, thì ứng dụng của bạn được biên dịch cho 32b có thể chạy trên hệ thống máy chủ Windows 64b: hãy xem hệ thống con WOW64 được tích hợp vào Windows 64b.

Có nói rằng, bạn có thể không mã hỗn hợp được biên dịch cho 32b với mã được biên dịch cho 64b. Có nghĩa là một thư viện được xây dựng cho 32b không thể được liên kết với mã 64b và ngược lại. (Các quy ước gọi khác nhau, bố cục khung ngăn xếp, ngoại trừ thư giãn, ...)

+0

Có, nhưng đó không phải là liên kết đến một thư viện, đó là một giao diện gọi hệ thống gọi các cuộc gọi hệ thống từ mã 32 bit thành một hạt nhân 64 bit. Đó là một vấn đề hoàn toàn khác. (Được viết trước đoạn thứ hai được thêm vào ở trên, giải thích quan điểm của tôi) –

+0

@MatsPetersson: OP không yêu cầu "liên kết tới thư viện", không có yêu cầu thực hiện tác vụ X theo cách không hoạt động; ngược lại, OP yêu cầu cách làm việc –

+0

"Thư viện 64 bit có thể hoạt động trong ứng dụng 32 bit không?" nghĩa là gì? –

4

Có, nhưng đó là một mối phiền toái lớn.

Đầu tiên, hạt nhân khác với thư viện. Thông thường, một thư viện được hiển thị trong không gian địa chỉ ảo của quy trình của bạn; nó chia sẻ không gian địa chỉ với mã của riêng bạn. Gọi một thói quen thư viện chỉ đơn giản là một cuộc gọi chương trình con.

Ngược lại, để yêu cầu dịch vụ từ hạt nhân, quá trình của bạn thực hiện một hướng dẫn đặc biệt để tạo ra một cái bẫy. Cái bẫy này làm cho bộ xử lý thực hiện một số thứ đặc biệt bao gồm lưu các thanh ghi và các trạng thái khác trong bộ nhớ (hoặc trong các thanh ghi xử lý đặc biệt mà bạn không thể truy cập bình thường), thay đổi các chế độ khác nhau trong bộ xử lý. thay đổi bộ đếm chương trình để trỏ tới hướng dẫn cho hạt nhân. Sau đó, hạt nhân đang chạy.Tại thời điểm này, hạt nhân có thể đang chạy ở chế độ 64 bit trong khi quá trình của bạn đang chạy ở chế độ 32 bit. Tuy nhiên, hạt nhân được thiết kế để nhận thức được những khác biệt này. Khi hạt nhân của bạn kiểm tra quá trình của bạn để xem những gì bạn đang yêu cầu, nó sẽ tìm kiếm thông tin và cấu trúc dữ liệu khi biết rằng quá trình của bạn đang chạy ở chế độ 32 bit. Một hạt nhân có thể hỗ trợ cả hai quá trình 32-bit và 64-bit, nó chỉ xử lý từng loại quy trình khác nhau.

Giả định này, tất nhiên, hạt nhân 64 bit bạn đang sử dụng hỗ trợ quy trình 32 bit.

Thông thường, khi bạn gọi một thư viện, bạn muốn nó giống chế độ mã của bạn, bởi vì cuộc gọi thư viện thông thường chỉ là một cuộc gọi chương trình con; nó không tạo ra một cái bẫy và không thay đổi chế độ xử lý. Nếu có nhu cầu quan trọng để gọi các thường trình trong thư viện 64 bit từ quy trình 32 bit, thì bạn có thể tạo quy trình trợ giúp 64 bit. Quá trình 32-bit của bạn sẽ đóng gói một yêu cầu cho một cuộc gọi thư viện và gửi yêu cầu đó đến quy trình trợ giúp 64 bit bằng một số hình thức liên lạc giữa các tiến trình. Quá trình trợ giúp đó sẽ gọi cho thư viện thường xuyên và gửi kết quả trở lại.

Đương nhiên, điều này bổ sung thêm chi phí đáng kể cho mỗi cuộc gọi thư viện, do đó, đó là điều bạn chỉ muốn làm nếu có nhu cầu lớn và không có lựa chọn nào tốt hơn.

+0

+1 Tôi đang upvoting ngay cả khi mô tả về cách gọi hạt nhân đi, là quá cụ thể (nó là điển hình nhưng nhưng không có nghĩa là khả năng duy nhất) –

1

Tôi đang làm việc trên một ứng dụng thực hiện chính xác điều này. Lõi ứng dụng là x64 (và sử dụng Qt), nhưng nó phải giao tiếp với một số thiết bị, mà tôi chỉ có thư viện 32 bit từ nhà sản xuất. Cách tôi thực hiện nó là có hai ứng dụng 64 bit cho lõi và GUI, và 32 bit điều khiển thiết bị và giao tiếp với các ứng dụng chính sử dụng QSharedMemory. Cả hai ứng dụng đều dựa trên Qt (64 và 32 bit tương ứng).

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