Nó liên quan đến cách nó được phát triển. Điều này đúng với bất kỳ phần mềm nào, bạn ạ. Một nhà phát triển có thể dành hàng chục năm để phục vụ mọi loại kiến trúc hiện có, vì vậy có một điểm lợi nhuận giảm dần quyết định loại phần cứng nào được hỗ trợ.
Một trong những khái niệm chính mà các nhà phát triển phần mềm cấp thấp xem xét là mô hình khả năng di chuyển; viết phần mềm di động có nghĩa là dễ dàng chạy nhất quán trên các môi trường runtime khác nhau. Đối với phần mềm cấp thấp, và đặc biệt là kernel hệ điều hành, điều đó thường có nghĩa là các loại kiến trúc CPU (x86, ARM, v.v.) có thể thực sự tạo ra kết quả mong đợi mà nhà phát triển đã dự định.
Kernel Linux là một ví dụ tuyệt vời ở đây. Phần lớn mã nguồn của nó là di động, theo nghĩa là nó không phụ thuộc vào kiến trúc CPU, và biên dịch thành các hướng dẫn tạo ra cùng một kết quả nhất quán trên nhiều loại CPU. Tuy nhiên, có một số trường hợp mã cụ thể được yêu cầu chỉ do những sắc thái cụ thể với một kiến trúc nhất định. Kernel hệ điều hành thường có một lượng mã được viết cụ thể cho kiến trúc cụ thể đang được nhắm mục tiêu, vì bản chất của chúng cần quyền truy cập đầy đủ vào mọi thứ mà một hệ thống con kiểm soát. Vì mã assembly này được dịch trực tiếp thành các hướng dẫn trực tiếp cho CPU để giải thích, nên theo định nghĩa, đó là mã không di động nhất được viết trong toàn bộ cơ sở mã kernel hệ điều hành, nhưng là mã hoàn toàn cần thiết.
Kết quả là việc thêm một kiến trúc mới cho kernel hệ điều hành để hỗ trợ không phải là một nhiệm vụ dễ dàng.
Khi mã nguồn của hệ điều hành được biên dịch thành mã thực thi cho các kiến trúc được hỗ trợ của nó, cần phải suy nghĩ rất nhiều về cách thực hiện điều này; bạn cần đạt được sự cân bằng giữa việc duy trì khả năng tương thích ngược, hiệu suất và bảo mật. Phần cứng máy tính hiện đại có rất nhiều lợi ích về tốc độ (và bảo mật) so với phần cứng cũ, điều đó có nghĩa là, mặc dù mã hoàn toàn di động, nó sẽ không chạy trên phần cứng cũ do cách nó được biên dịch.