11 điểm bởi GN⁺ 2025-11-19 | 4 bình luận | Chia sẻ qua WhatsApp
  • Quake phát hành năm 1996 là một trò chơi đồng thời đón nhận ba thay đổi công nghệ: bộ tăng tốc 3D, Internet và quá trình chuyển đổi từ MS-DOS sang Windows 95
  • Để tạo ra một tệp thực thi duy nhất có thể chạy trên cả DOS và Windows 95, id Software đã tận dụng trình biên dịch djgpp và cấu trúc tương thích DPMI
  • Thông qua hệ thống ‘Chunnel’ của Mpath, bản Quake cho DOS được triển khai để có thể truy cập ngăn xếp Winsock TCP/IP của Windows 95
  • Cấu trúc này gồm các thành phần như quakeudp.dll, genvxd.dll, mgenvxd.vxd, đóng vai trò trung gian để tệp thực thi DOS giao tiếp với API mạng Win32
  • Về sau, khi id Software chuyển sang tệp thực thi chỉ dành cho Win32 (WinQuake, GLQuake), cấu trúc phức tạp này đã biến mất

Quake và giai đoạn chuyển đổi hệ điều hành

  • Trong giai đoạn 1996~1997, thị phần của MS-DOS giảm một nửa, còn Microsoft thúc đẩy quá trình chuyển sang Windows 95 và NT
  • Một số hãng phát triển (ví dụ: Blizzard North) làm game chỉ cho Windows 95, nhưng id Software vẫn hỗ trợ cả DOS và Windows bằng một tệp thực thi duy nhất (quake.exe)
  • quake.exe được thiết kế để tương thích với cwsdpmi.exe của DOS hoặc máy chủ DPMI của Windows 95 bằng cách dùng trình khách DPMI của DJGPP
  • Kỹ sư Microsoft Raymond Chen mô tả đây là “một ví dụ đáng kinh ngạc về việc chương trình vẫn hoạt động bình thường trên một bộ mở rộng dị biệt

Chạy Quake trong môi trường DOS

  • Để chạy Quake trên DOS chỉ cần bốn tệp: quake.exe, config.cfg, pak0.pak, cwsdpmi.exe
  • Chế độ nhiều người chơi hỗ trợ bốn phương thức: modem, NullModem, IPX, TCP/IP
    • IPX dành cho LAN, TCP/IP dành cho Internet, nhưng DOS không cung cấp sẵn ngăn xếp TCP/IP
  • TSR TCP/IP duy nhất cho DOS là BWNFS của Beame & Whiteside, với mức giá rất đắt là 395 USD (theo giá năm 1996)

Chạy trong môi trường Windows 95

  • Khi chạy quake.exe trong hộp DOS ảo (dos-box) của Windows 95, nó hoạt động theo cùng một cách
  • Vì dùng máy chủ DPMI của Windows 95 nên không cần cwsdpmi.exe
  • Việc chạy khá trơn tru, nhưng cần RAM từ 16MB trở lên và có mức chiếm dụng bộ nhớ lớn hơn DOS
  • Do được phép truy cập VGA trực tiếp nên có thể chạy toàn màn hình mà không bị giảm hiệu năng

q95.bat và Chunnel của Mpath

  • q95.bat không chỉ là script khởi chạy Quake đơn thuần mà còn kích hoạt kết nối TCP/IP thông qua hệ thống đường hầm Winsock (Chunnel) của Mpath
  • Mpath Interactive vận hành dịch vụ game trực tuyến (Mplayer) và hỗ trợ chơi qua Internet cho nhiều game, gồm cả Quake và Unreal
  • Kỹ sư Mpath khi đó là Larry Hastings đã kể lại giai thoại chơi deathmatch qua Internet với đội ngũ id Software trên các bản dựng Quake ban đầu
  • Mpath nhận mã nguồn Quake, chỉnh sửa để giao tiếp với ngăn xếp mạng của Mplayer, rồi cấp phép công nghệ Chunnel cho id

Cấu trúc kỹ thuật của Chunnel

  • q95.bat chạy qlaunch.exe, và chương trình này sẽ nạp quakeudp.dll
    • quakeudp.dll đóng vai trò cầu nối với Winsock (wsock32.dll)
    • Thông qua genvxd.dll, nó nạp trình điều khiển thiết bị ảo mgenvxd.vxd và giao tiếp với Win32 qua ngắt 0x48
  • Phần cài đặt socket BSD của Quake (mpplc.c) là mã do Mpath cung cấp, chuyển tiếp các lời gọi mạng thông qua ngắt phần mềm
  • genvxd.dll sẽ unmarshal các lời gọi này rồi chuyển tiếp chúng tới Winsock
  • Trong các symbol của mgenvxd.vxd có chứa tên John Cash
  • Công nghệ này là công nghệ độc quyền có bằng sáng chế của Mpath, nên mã nguồn không được công khai
  • Sau tháng 12 năm 1996, khi id Software chuyển sang tệp thực thi chỉ dành cho Win32 (WinQuake, GLQuake, QuakeWorld), cấu trúc Chunnel đã bị loại bỏ

Kết luận

  • Hỗ trợ TCP/IP của Quake được hiện thực bằng một cấu trúc độc đáo, trong đó tệp thực thi DOS gián tiếp gọi ngăn xếp mạng của Windows 95
  • Đây là một công nghệ lai hoạt động ở ranh giới giữa DOS và Windows, cho thấy giai đoạn quá độ của mạng game vào giữa thập niên 1990
  • Về sau nó được đơn giản hóa nhờ chuyển hẳn sang Win32, nhưng ở thời điểm đó, đây là cấu trúc tượng trưng cho thách thức kỹ thuật và đổi mới trong thời kỳ chuyển đổi hệ điều hành

4 bình luận

 
bungker 2025-11-21

Hồi đó, nói đến John Carmack thì đúng là một lập trình viên thiên tài trong số những thiên tài.

 
thinkpad 2025-11-20

Tôi đã đọc bài viết rất thú vị này.

 
ipuris 2025-11-20

Haha, thú vị đấy.

 
GN⁺ 2025-11-19
Ý kiến Hacker News
  • Nhớ lại thời xưa tự mình thử nghiệm trực tiếp với DJGPP và DPMI
    Khi đó nó thực sự mang cảm giác như một công nghệ của tương lai
    Đặc biệt là lúc chơi Star Wars: Dark Forces, vì tốc độ tải quá chậm nên tôi đã thử thay DOS/4GW bằng một DOS extender khác, và thật ngạc nhiên là nó nhanh hơn 3~5 lần
    Có lẽ là vì extender mới gọi trực tiếp phần cứng đĩa trong protected mode thay vì chuyển sang real mode

  • Những ngày đầu của Linux, khi chưa có networking, người ta dùng KA9Q TCP/IP stack
    Liên kết mã nguồn KA9Q
    Nó chạy trên DOS nhưng cũng có thể port sang Linux khá dễ dàng
    Gần đây tôi cũng đã thử dùng client CWSDPMI, nó cho phép chương trình 32-bit chạy được trên cả DOS lẫn Windows
    Wiki CWSDPMI

  • Hồi nhỏ, lý do tôi học hàn là để tự làm cáp null-modem
    Sau đó tôi biết đến điện trở, rồi tự làm cả Covox Speech Thing, một sound card dùng cổng song song
    Đó thực sự là những ngày tháng rất vui

    • Cái sound card cổng song song đó đã từng là sound card chính của tôi một thời gian
      Tôi mua cả đống điện trở lớn ở Maplin rồi hàn rất vụng về, nhưng nó hoạt động hoàn hảo ngay từ đầu
    • Vì không được phép dùng mỏ hàn, tôi đã cắt một sợi cáp serial thường rồi sửa thành null-modem
      Tôi làm nó để chơi OMF2097 với bạn bè, và thật tuyệt vì không phải tranh nhau một bàn phím nữa
    • Tôi cũng học hàn vào đúng giai đoạn đó
      Việc phát file Mod bằng thiết bị tự làm rồi nghe qua loa di động thật sự rất ngầu
      Về sau khi biết đến flux thì việc hàn trở nên dễ hơn nhiều
  • Khi thấy cụm từ “các kỹ sư DJGPP”, tôi lại nhớ ra rằng thực ra gần như chỉ là một mình DJ Delorie
    Việc port toàn bộ toolchain GCC sang DOS/Windows thực sự là một thành tựu phi thường
    Tôi không rõ ông ấy thêm tính năng theo yêu cầu từ id Software hay chỉ làm cho vui, nhưng rất đáng nể

    • Khi đó DJGPP có một cộng đồng khá lớn, và công lao tối ưu Quake cũng thuộc nhiều về Charles Sandmann
      Ông ấy là tác giả của CWSDPMI và đã hợp tác trực tiếp với id
    • Tôi cũng nhớ là đã thực sự có trao đổi liên quan đến CWSDPMI giữa hai người đó
      Diễn đạt vậy hơi lạ vì đây là dự án mã nguồn mở, nhưng rất có thể là đúng
      Và việc ngạc nhiên rằng Quake chạy được trong VM có lẽ là do không biết về chế độ VM86
    • Tôi rất muốn xem một cuộc phỏng vấn với DJ Delorie
    • Tôi đã xem trang web của ông ấy và thấy có ghi từng học một môn bắn súng ở đại học
      Tôi tự hỏi ở Mỹ những môn thể chất như vậy có phổ biến không
    • Tôi đã học lập trình lần đầu nhờ DJGPP
  • Cái tên “Chunnel” có lẽ được lấy từ Channel Tunnel

    • Hoặc cũng có thể lấy cảm hứng từ bộ phim hư cấu ‘Chunnel’ xuất hiện trong tập “The Pool Guy” của Seinfeld phát sóng năm 1995
  • Tôi nhớ trước đây từng đọc TECHINFO.TXT để cấu hình TCP/IP multiplayer cho Quake
    Trong đó ghi là dùng stack TCP/IP của Beame & Whiteside
    Tôi đã tìm phần mềm trên ftp.cdrom.com rồi cài đặt, nhưng khi đó kiến thức mạng còn thiếu nên cấu hình cực kỳ khó
    Cuối cùng độ trễ cao và hiệu năng cũng tệ, nên chơi NetQuake bằng WinQuake còn tốt hơn nhiều

  • Có cảm giác Fabian đã bắt đầu nghiên cứu về Quake

    • Thực tế là anh ấy đã đóng góp cho dự án chocolate-quake và còn gửi bug report
      Tôi cũng muốn nhận được sự giúp đỡ để xử lý vấn đề OpenGL trong fork chocolate Doom 3 BFG của tôi
    • Có lẽ là đang đi theo hướng đó
      Nhưng Quake là một thế giới phức tạp hơn Doom rất nhiều, nên khó mà chỉ gói gọn trong một cuốn sách
  • Thật mỉa mai là vào thập niên 90, chỉ cần kết nối modem tới số điện thoại của bạn là có thể dễ dàng chơi multiplayer Quake hay Doom,
    còn bây giờ thì gần như không thể nếu không có server

    • DOOM đã hỗ trợ serial multiplayer từ tháng 12 năm 1993, và đến năm 1994 thì có cả mạng IPX
      Ban đầu chưa có TCP/IP, nhưng về sau được giải quyết bằng driver iDOOM TCP
      Khi tôi thử nó ở ký túc xá đại học, đó thực sự là một đổi mới lớn
    • Ngày nay người ta dùng STUN server hoặc Steam Datagram Relay của Steam để giải quyết vấn đề NAT
      Nó giống như một kiểu Hamachi tích hợp trong engine
    • Tôi tự hỏi liệu có cách nào dùng Tailscale để làm việc này dễ như ngày xưa không
    • Thực ra chỉ cần port forwarding trên router là cũng làm được
      Chỉ là dạo này nhiều hãng game chặn server cá nhân để kiếm tiền từ bán skin
      Valve là ngoại lệ khi vẫn cho phép custom server cho TF2, và Minecraft cũng vẫn có thể tắt xác thực để chơi với bạn bè
  • Khi Windows 95 tích hợp sẵn TCP/IP, thời kỳ phải cài TCP riêng trước đó đã chấm dứt

    • Hồi đó mạng chủ yếu phục vụ doanh nghiệp, nên việc cài ở nhà gần như là một thú vui rất ngách
      Thế giới đã thay đổi khi card mạng trở nên phổ biến với người dùng phổ thông
      Tuy vậy Windows khi không có card mạng thì sẽ không cài TCP/IP, và thậm chí còn không có lệnh ping
      Tôi tự hỏi nếu cài Windows 11 mà không có mạng thì sẽ ra sao ngày nay
    • Thời Windows 3.1, người ta dùng Trumpet Winsock
    • Cũng từng có lời đồn rằng stack TCP/IP của Windows 95 được mang sang từ FreeBSD
  • Đến giờ, tutorial DJGPP/NASM tôi viết từ 25 năm trước vẫn còn xuất hiện trên Google