it-swarm-vi.com

Làm cách nào để tạo chương trình 32 bit từ phiên bản 64 bit?

Nhiều phần mềm chỉ hỗ trợ máy 64 bit vì thị trường 32 bit hiện nay rất nhỏ. Tuy nhiên, đối với những người bị mắc kẹt với máy 32 bit, điều này có nghĩa là các phiên bản mới hơn không thể được cài đặt và điều này có thể dẫn đến các vấn đề bảo mật. Một ví dụ là Firefox/Waterfox .

Nói chung, có cách nào để tạo chương trình 32 bit từ bản cài đặt 64 bit (.exe, .msi) không?


Xem thêm: Tại sao bảo mật của trình duyệt nên được ưu tiên?

5
Ooker

Không, điều này là không thể. Lý do tại sao khá rộng, thậm chí có thể quá rộng đối với SuperUser, cho rằng bạn sẽ cần giải thích các nguyên tắc cơ bản về cách x86 và x64 được tạo ra và cách điều này ảnh hưởng đến việc lập trình nói chung.

Nhưng để giải thích ngắn gọn, nó đi xuống này:

Trước đây, chúng tôi có bộ xử lý 16 bit. Sau đó, intel đã tạo ra bộ xử lý 32 bit đầu tiên, còn được gọi là x86. Đây là 8086, 80286 (viết tắt là 286) v.v ... Đây về cơ bản là một sửa đổi cho bộ xử lý 16 bit, với các bộ hướng dẫn bổ sung được thêm vào. Với mỗi bản phát hành mới của loạt bộ xử lý của họ, Intel đã bổ sung thêm các bộ hướng dẫn cho họ bộ xử lý, điều này cuối cùng khiến cho bộ hướng dẫn chứa nhiều hướng dẫn. Intel không thể loại bỏ các tập lệnh cũ bởi vì điều đó có nghĩa là không có khả năng tương thích ngược và Intel muốn tiếp tục hỗ trợ các bộ xử lý cũ hơn.

Vì bộ xử lý là 32 bit, có giới hạn trên, cụ thể là số 32 bit cao nhất. Điều này có nghĩa, việc chỉ định bộ nhớ chỉ tăng lên khoảng 3,5 GB.

Trước đây, máy tính không mạnh lắm, vì vậy nếu intel nhắm đến 64 bit ngay từ đầu, điều đó có nghĩa là sẽ mất nhiều thời gian hơn để tính các số giống nhau nên hiệu suất sẽ giảm chỉ vì số lượng để tính toán lớn hơn.

Bên cạnh đó bộ xử lý 32 bit hoạt động khá tốt trong một thời gian dài.

Tại một số thời điểm, AMD tham gia vào thị trường và giới thiệu bộ xử lý 64 bit. AMD đã tạo ra các tập lệnh riêng của họ để cho phép làm việc với 64 bit trong khi vẫn giữ các tập lệnh intel trong 32 bit để cho phép tương thích ngược với 32 bit.

Trên thực tế chúng là các tập lệnh khác nhau, một lập trình viên tạo chương trình 32 bit sẽ gọi các thói quen khác nhau so với khi họ tạo chương trình 64 bit.

Bây giờ tôi giải thích tại sao điều này khó thực hiện, hãy tiếp tục giải thích vấn đề từ góc độ lập trình.

Khi bạn viết mã chương trình, bạn viết mã của mình trước. Nếu mã của bạn tương thích ngược với các chương trình 32 bit, bạn chỉ đơn giản là không thể sử dụng số 64 bit cũng như không thể giải quyết nhiều hơn 3,5gigs bộ nhớ cùng một lúc. Về cơ bản, bạn không thể vượt qua bất kỳ giới hạn nào mà các chương trình 32 bit phải đối mặt hoặc chương trình của bạn sẽ gặp sự cố khi thực hiện.

Như bây giờ bạn có mã, chỉ có bạn thực sự có thể chạy chương trình của bạn. Để làm cho nó để người khác có thể chạy chương trình của bạn, bạn phải biên dịch mã thành một tệp thực thi. Điều này có nghĩa là mã dễ đọc được chuyển đổi thành các hướng dẫn mà bộ xử lý hiểu được. Trong quá trình biên dịch, bạn chỉ định xem chương trình của bạn có chạy trên x86 hay x64 hay không và trình biên dịch sẽ tạo mã bằng cách sử dụng các tập lệnh dựa trên kiến ​​trúc bộ xử lý đó.

Như bạn có thể thấy, bạn không thể sửa đổi một tệp thực thi và làm cho nó hoạt động trên một tệp thực thi khác. Trước tiên bạn cần dịch ngược chương trình thành mã, sau đó biên dịch lại bằng các hướng dẫn khác nhau.

Điều đó nói rằng, cho rằng một chương trình được biên dịch cho x86 thực sự sẽ hoạt động trên x64, có thể giả định rằng một lập trình viên tạo ra một chương trình x64 vì anh ta sẽ phá vỡ giới hạn của kiến ​​trúc x86. Vì vậy, ngay cả khi bạn biến phiên bản x64 thành phiên bản x86, có khả năng chương trình sẽ không ổn định vì bạn sẽ vượt qua giới hạn của những gì chương trình 32 bit có thể làm.

12
LPChip

Về mặt lý thuyết nó có thể được thực hiện!

Có nhiều cách để dịch từ trung lập mã byte / biểu diễn bên trong sang nhị phân của một kiến ​​trúc cụ thể như cách trình biên dịch/JITters hiện đại hoạt động. Ngoài ra còn có trình giả lập chạy các chương trình cho kiến ​​trúc khác trên kiến ​​trúc hiện tại. Bochsqem là hai trong số những người nổi tiếng nhất. Xem:

Mặc dù tôi chưa thấy ai viết một trình chuyển đổi như vậy cho một nhị phân duy nhất, bởi vì về cơ bản, bạn cũng sẽ cần phải mô phỏng mọi cuộc gọi hệ thống và thư viện, sẽ tốt hơn nếu chạy toàn bộ trình giả lập. Qemu cũng có khả năng mô phỏng chỉ không gian người dùng, vì vậy thực sự có thể chạy một chương trình cùng với các thư viện cần thiết mà không cần hệ điều hành chính thức

Tuy nhiên, nếu PC của bạn là chỉ 32 bit , điều đó có nghĩa là nó đã hơn 10 năm tuổi. Khá nhiều CPU Intel từ Pentium 4 Prescott trong 2004 trở đi (ngoài một số CPU Atom đầu tiên) và tất cả các CPU AMD - từ Athlon 64 trong 2003 trở đi có khả năng 64 bit. Đã đến lúc cập nhật.

Nếu PC của bạn đủ mới để hỗ trợ x86_64 và VT-x thì bạn có thể chạy máy ảo 64 bit bên trong Máy chủ , tuy nhiên điều đó không được khuyến khích và hiệu suất thậm chí còn tệ hơn so với chạy 64- HĐH bit có 32 bit VM bên trong. HĐH 64 bit không cần gấp đôi bộ nhớ so với 32 bit như nhiều người nghĩ, vì vậy ngay cả với chỉ 2GB RAM , HĐH 64 bit nói chung vẫn nhanh hơn do gấp đôi số lượng đăng ký và nhiều thứ khác. Từ 1 đến 2GB RAM không thể tranh cãi nhưng tôi sẽ sử dụng 64-bit


Điều đó nói rằng, liên quan đến các biện pháp bảo mật, HĐH 32 bit thường trễ trên các bản vá bảo mật . Ví dụ: các bản vá Meltdown và Spectre được đẩy cho Linux 32 bit hơn nửa năm sau khi Linux 64 bit được vá . Các bản vá Meltdown được cung cấp cho Windows 10 64 bit bản dựng 1507 trở lên nhưng người dùng 32 bit chỉ được bảo vệ kể từ bản dựng 1511 . Và ngay cả khi chúng được vá, những máy cổ như vậy thường sẽ phải đối mặt với nhiều tác động hiệu suất hơn vì chúng không có các hướng dẫn và tính năng mới để bù đắp sự chậm lại. Vì lý do đó MS không kích hoạt bản vá trên một số PC cũ trừ khi người dùng nói rõ ràng.

Đôi khi, chúng hoàn toàn không được vá vì không có đủ cơ sở người dùng, do đó không có nhiều động lực để dành nỗ lực lớn. Vấn đề cũng là không thể khắc phục mà không hỗ trợ phần cứng nếu đó là lỗi phần cứng. Ví dụ, các cuộc tấn công kênh bên gần đây như Spectre hoặc L1TF cũng cần một vi mã được cập nhật, vì vậy nếu nhà sản xuất CPU và/hoặc bo mạch chính không phát hành bản cập nhật chương trình cơ sở, bạn sẽ không gặp may! Những lỗi đó ảnh hưởng đến CPU trong hai thập kỷ qua, nhưng không thể cung cấp các bản vá cho các hệ thống rất cũ. Windows 7 cũng bỏ hỗ trợ Pentium vì quá khó để vá mà không có hỗ trợ SSE2 hoặc do có quá ít người chạy nó trên các CPU đó.

Windows 32 bit cũng dễ bị tổn thương hơn bởi vì:

Nếu bạn chạy HĐH 64 bit trong trình giả lập thì nó thậm chí sẽ chậm hơn. Và ngay cả khi bạn chấp nhận tốc độ thu thập dữ liệu và sử dụng trình giả lập thì phần mềm độc hại trên Máy chủ vẫn có thể tấn công máy ảo trong một hệ thống dễ bị tấn công như vậy. Một lần nữa, thời gian để cập nhật nếu bạn thực sự quan tâm đến bảo mật, hoặc bạn sẽ phải sống với ít hệ thống được bảo mật vô thời hạn

Đọc thêm:

9
phuclv

Đây là kỹ thuật có thể; quá trình được gọi là dịch nhị phân .

Bạn thường sẽ thấy điều này được áp dụng với các trình giả lập cho các nền tảng khác nhau (ví dụ: ARM trên x86, x86 trên ARM) hoặc ảo hóa khi không có khả năng tăng tốc phần cứng.

Vấn đề lớn nhất bạn sẽ gặp phải là bạn không thể chạy hầu hết các chương trình trong chân không. Chúng phụ thuộc vào hệ điều hành ABI , thường thay đổi giữa các kiến ​​trúc. Điều này có nghĩa là cuối cùng bạn cần thêm một lớp dịch cho tất cả các tương tác với HĐH (các lệnh gọi API, v.v.), tại thời điểm đó bạn cũng có thể mô phỏng toàn bộ HĐH ... được mô tả trong câu trả lời của phuclv.

5
Bob

Biên dịch lại chương trình thành mục tiêu 32 bit

Câu hỏi của bạn được đóng khung là có nhị phân 64 bit và muốn chạy nó dưới dạng 32 bit, khá khó và cuối cùng bạn phải sử dụng trình giả lập hoặc các vấn đề phức tạp khác.

Tuy nhiên, nếu bạn có mã gốc bằng ngôn ngữ cấp cao (như trường hợp của Firefox), có lẽ bạn có thể biên dịch mã thành mã 32 bit.

Ở đây, tôi không đồng ý với đoạn cuối của câu trả lời LPChip that một lập trình viên tạo ra một chương trình x64 vì anh ta sẽ phá vỡ giới hạn của kiến ​​trúc x86 . Họ có thể làm điều đó bởi vì đó là mục tiêu mặc định, để phù hợp với kiến ​​trúc gốc hoặc đơn giản là được hưởng lợi từ việc có thể sử dụng nhiều bộ nhớ hơn nếu người dùng có đủ RAM.

Một số tính năng như bộ đếm 64 bit được làm từ 32 bit sẽ chậm hơn một chút so với sử dụng thanh ghi riêng. Nếu chương trình sử dụng các tính năng dành riêng cho 64 bit (như hội 64 bit nội tuyến) thì nó sẽ không hoạt động. Phần trách nhiệm sẽ chủ yếu dựa trên sự hỗ trợ của trình biên dịch đối với bất kỳ ngôn ngữ cấp cao nào đang được sử dụng (và mã được viết tốt để bắt đầu khá dễ mang theo).

Nếu chúng ta tập trung vào việc xây dựng Firefox/Waterfox, thì đó không phải là một nỗ lực đơn giản cho người mới (ngày nay các trình duyệt giống như một hệ điều hành của riêng họ), ít hơn với Firefox Quantum cũng yêu cầu trình biên dịch Rust. Tuy nhiên, các bản phân phối Linux vẫn biên dịch các phiên bản Firefox 32 bit, cho thấy nó có thể chạy dưới 32 bit.

1
Ángel