This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

fighting for the power: phần 1

máy mình sao kêu to thế :)
Added by about 3 years ago  »  Votes: 2/2

Có phần giống như bộ não người, CPU là nơi tiêu hao nhiều năng lượng nhất trong máy tính (à, trừ ra màn hình, đó là thiết bị ngoại vi và có thể to lớn tùy thích), và cũng là nơi phát sinh nhiệt nhiều nhất trong quá trình hoạt động của nó.

Khi dùng laptop, việc kiểm soát mức năng lượng tiêu hao bởi CPU sẽ dẫn tới việc kéo dài thời gian sử dụng của pin sau khi ngắt hẳn nguồn điện ngoài. Sau CPU, bạn sẽ phải nghĩ tới việc điều khiển tốt các thiết bị khác để nó không dùng pin quá mức cần thiết.

Với vấn đề này, người dùng Linux thường hay ghen tị với người dùng Windows, bởi nhiều laptop dùng Linux thường mau chóng ngốn hết năng lượng của pin sạc; trong khi với cùng mức sạc pin như thế, máy dùng Windows có thể dùng lâu hơn, với nhiều hiệu ứng đồ họa hơn.

Unix/Linux có lỗi gì?

ACPI

Có thể tóm tắt về cách điều khiển mức năng lượng của thiết bị như sau:

  hệ thống => ACPI => Bios => thiết bị  

Hệ điều hành sẽ thông qua ACPI để xác lập các trạng thái (mức năng lượng) của thiết bị, nhờ đó, các phần mềm nhúng trên thiết bị sẽ đỡ bớt một gánh nặng. Vấn đề là, có rất nhiều nhà sản xuất khác nhau cho ra cùng loại hàng, thực hiện cùng một chức năng (ví dụ, CPU thì có của Intel, AMD; card mạng (ethernet) thì có của Realtek, Broadcom,...). Lập trình viên không thể viết trình điều khiển riêng cho từng loại như vậy được (bởi vì đã có lập trình viên của thiết bị làm điều đó rồi). Thay vào đó, họ sẽ thông qua một ngôn ngữ chung, gọi là ASL; từ mã nguồn ASL này, thông qua một trình dịch, sẽ chuyển thành mã máy AML được dùng để giao tiếp với thiết bị từ phía hệ thống. Ví dụ, sau đây là một đoạn mã nguồn ASL cho máy Compaq Presario CQ40-401AU (chạy chíp AMD)

Method (SCMP, 2, NotSerialized)
{
   Name (STG1, Buffer (0x50) {})
   Name (STG2, Buffer (0x50) {})
   Store (Arg0, STG1)
   Store (Arg1, STG2)
   If (LNotEqual (SizeOf (Arg0), SizeOf (Arg1)))
   {
      Return (Zero)
   }
   Store (Zero, Local0)
   While (LLess (Local0, SizeOf (Arg0)))
   {
      If (LNotEqual (DerefOf (Index (STG1, Local0)), DerefOf (Index (STG2, Local0))))
      {
         Return (Zero)
      }
      Increment (Local0)
   }
   Return (One)
}

Có một điều buồn cười là, những người viết ra mã ASL hay AML đều giả định hầu hết người dùng trên thế giới này đều xài Windows, và một số ít trong họ dùng Linux. Và hơn nữa, trong khi có rất nhiều chủng loại Windows thì tất cả các distro Linux có thể được dùng một từ chung Linux. Và bên cạnh đó thì chẳng có ai xài Unix cả :) Bạn hãy xem đọan mã sau dành cho chính máy vừa nói ở trên:

If (_OSI ("Windows 2001 SP3"))
{
   Store (0x12, OSTB)
   Store (0x12, TPOS)
}

If (_OSI ("Windows 2006"))
{
   Store (0x40, OSTB)
   Store (0x40, TPOS)
}

If (_OSI ("Windows 2006 SP1"))
{
   Store (0x41, OSTB)
   Store (0x40, TPOS)
}

If (_OSI ("Linux"))
{
   Store (One, LINX)
   Store (0x80, OSTB)
   Store (0x80, TPOS)
}

Trong khi có rất nhiều chỉ thị cho các dòng Windows khác nhau, thì chỉ có mỗi một dòng chỉ thị chung cho tất cả các máy dùng Linux, và không có chỉ thị nào cho máy dùng Unix :) Ngoài ra thì còn có rất nhiều dòng hệ điều hành khác bị bỏ qua. Rõ ràng, điều này phản ánh sự hỗ trợ yếu kém từ phía nhà sản xuất. Hoặc một cái bắt tay đè bẹp Linux, chẳng hạn :D (Có thể có nhiều lý do khác biện minh cho điều này, nhưng mình chưa được biết:D)

Vậy đó, chỉ mỗi một thiếu sót nhỏ vậy thôi, đã khiến cho hệ thống dùng Unix/Linux không thể hiểu được đầy đủ thiết bị. Từ chỗ không hiểu đầy đủ, dẫn tới không điều khiển chính xác. Hệ quả là pin của bạn mau hết thôi :)

Tất nhiên, còn nhiều điều phải bàn. Nhưng hẹn bạn hồi sau.


Comments