6 điểm bởi GN⁺ 2023-08-10 | 1 bình luận | Chia sẻ qua WhatsApp
  • Một bài giải thích kỹ thuật về cách máy tính thực thi chương trình từ đầu đến cuối, tập trung vào việc giúp người đọc hiểu máy tính hoạt động như thế nào từ lúc khởi động đến khi chạy chương trình
  • Bắt đầu từ các câu hỏi như: điều gì thực sự xảy ra khi một chương trình được thực thi, liệu chương trình có được chạy trực tiếp trên CPU hay không, syscalls là gì và hoạt động ra sao, và làm thế nào nhiều chương trình có thể chạy đồng thời
  • Bối cảnh của bài viết là nhận thức rằng nếu không học đại học thì không có nhiều tài liệu hệ thống mang tính bao quát, nên phải xem qua nhiều nguồn khác nhau với chất lượng không đồng đều và đôi khi mâu thuẫn nhau
  • Dựa trên vài tuần nghiên cứu và gần 40 trang ghi chú, đây là tài liệu nhằm tổng hợp những gì tác giả đã học thành một bài viết vững chắc
  • Với những độc giả muốn đọc nhanh hoặc cảm thấy mình đã biết phần này, bài viết cung cấp riêng liên kết Chapter 3: How to Run a Program

1 bình luận

 
GN⁺ 2023-08-10
Ý kiến trên Hacker News
  • Xin chào! Mình là Lexi, người viết bài/mini-book này.
    Có một câu hỏi kinh điển là “Điều gì xảy ra khi bạn mở một trang web?”, nhưng mình luôn tò mò hơn về câu hỏi “Điều gì xảy ra khi bạn chạy một chương trình?”. Khoảng 3 tháng trước, mình rất bực vì bản thân không trả lời được câu hỏi đó, nên quyết định tự học.
    Mọi thứ mình biết về lập trình đều là tự học, nên mình nghĩ việc này cũng sẽ dễ thôi, nhưng hoàn toàn không phải vậy. Phần lớn tài liệu online về cách hệ điều hành và CPU hoạt động đều rất tệ, mà bản thân tài liệu cũng gần như không có nhiều. Vì vậy trong lúc học, mình nghĩ mình nên tự tạo ra một tài liệu tốt; khi tổng hợp những gì đã học, nó trở thành một Google Doc dài 60 trang, rồi từ đó mình bắt đầu viết.
    Nhưng trong lúc viết, mình nhận ra khá nhiều phần trong tài liệu khổng lồ đó là sai, nên phải nghiên cứu thêm. Cứ lặp đi lặp lại việc sửa như vậy, trong khi chất lượng tài liệu trên Internet vẫn tệ, và mình phải làm cho bài viết tốt hơn nữa. Mình cũng cần hình minh họa và sơ đồ, nhưng không biết vẽ, nên đã mở Figma ra thử nghiệm, và vẽ một phần bằng chiếc Wacom tablet nhận được ở hackathon.
    Khoảng 3 tháng sau, giờ mình đã có một thành quả mà mình thật sự tự hào. Mình rất vui được chia sẻ bản cuối cùng của Putting the "You" in CPU, kể cả những hình minh họa còn vụng về. Dự án này được làm như một phần của Hack Club (https://hackclub.com), một cộng đồng học sinh trung học yêu thích máy tính.
    Vài tuần trước, một phiên bản vẫn còn đang làm dở tình cờ nhận được phản hồi trên HN, và mình thật sự biết ơn những góp ý đã nhận được. Kể từ đó mình đã chỉnh sửa khá nhiều, và giờ mới cảm thấy đủ hài lòng để tự mình chia sẻ nó với thế giới.
    Website là một dự án HTML/CSS tĩnh, và mình viết toàn bộ từ đầu. Mình đặc biệt thích component điều hướng. Hy vọng mọi người đọc thấy thú vị, và mong nó trở thành một tài liệu mà ai cũng có thể học được.

    • Mình mới chỉ lướt qua, nhưng nó trông như một tài liệu nhập môn khá tốt, và mình cũng thích phong cách của nó.
      Viết loại tài liệu như thế này khi tự học một thứ mới là một cách rất hay. Nó giúp làm rõ quá trình suy nghĩ, và giúp phát hiện những phần ban đầu tưởng là đã hiểu nhưng thật ra vẫn còn mơ hồ.
      Mình cũng thích câu này ở cuối: “Trong lúc viết bài này, tôi đã trò chuyện khá nhiều với GPT-3.5 và GPT-4. Chúng nói dối rất nhiều và phần lớn thông tin là vô dụng, nhưng đôi khi lại giúp ích lớn trong việc giải quyết vấn đề. Nếu bạn biết giới hạn của LLM và cực kỳ nghi ngờ mọi thứ nó nói, tổng lợi ích có thể là dương. Tuy nhiên khả năng viết của nó thì tệ. Đừng để nó viết thay bạn.” Dự án rất tuyệt.
    • Sau khi đọc vài trang đầu, góp ý duy nhất của mình là nên giảm bớt các cách diễn đạt dễ thương/nhí nhảnh.
      Ví dụ, trong ngữ cảnh như “CPU chịu trách nhiệm cho mọi phép tính. Nó là đại ca. Shazam alakablam…” thì bỏ câu đùa đi và viết kiểu “CPU chịu trách nhiệm cho mọi phép tính. Từ khoảnh khắc bạn bật máy tính, nó bắt đầu thực thi từng lệnh một” sẽ dễ đọc hơn nhiều.
      Mình không phải người quá sâu về kỹ thuật, nhưng dưới góc nhìn của một người được trả tiền để viết thì mình thấy vậy. Bản thân công việc này rất tuyệt, hãy tiếp tục nhé.
    • Mình chưa tự nghiên cứu trực tiếp, nhưng nếu ít nhất bạn biết phải tìm ở đâu, mình khó tin rằng phần lớn thông tin lại khó tìm hoặc sai đến vậy.
      Những chủ đề như thế này thường được đề cập tốt trong các môn kiến trúc máy tính và hệ điều hành ở bậc đại học. Dù ngày nay chúng đã bớt thịnh hành và phần lớn trở thành môn tự chọn.
      Nhiều trường đại học đã công khai các bài giảng miễn phí, và cũng có sách do các giáo sư trong lĩnh vực này viết. Nếu muốn theo sát các xu hướng mới hơn, các bài trình bày ở hội nghị kỹ thuật liên quan cũng khá hữu ích.
      Dù vậy, giảng dạy là một nghệ thuật bị đánh giá thấp, và việc làm cho thông tin dễ tiếp cận hơn hoặc thú vị, tương tác hơn rõ ràng có giá trị lớn.
    • Mình muốn nhấn mạnh rằng LWN (https://lwn.net/) từ lâu đã tận tâm tạo ra thông tin về hệ điều hành không hề tệ. Hãy thử xem qua, và nếu có thể thì tham gia cùng họ nhé :)
    • Mình mới chỉ đọc lướt, nhưng trông rất tuyệt. Xin chúc mừng và hãy tiếp tục làm những việc như thế này.
      Trước đây mình từng làm kỹ sư nghiên cứu; trong trường hợp của mình là kỹ sư phần mềm làm nghiên cứu bảo mật máy tính trong phòng lab đại học. Như một bình luận khác nói rằng môn hệ điều hành là môn tự chọn, ngay cả trong số nghiên cứu sinh cũng có người không có mức hiểu biết về hệ điều hành như thế này.
      Thông tin tốt đúng là khó tìm, nhưng chắc chắn có tồn tại. Việc bạn tổng hợp những thông tin khó tìm đó thành một dạng tốt hơn chính là bằng chứng. Bằng của mình là toán, nhưng kiến thức về computing thì mình tự học. Cách học như thế này và khả năng truyền đạt thông tin kỹ thuật cao theo cách dễ tiếp cận thật sự quan trọng và không nên bị đánh giá thấp.
      Mình chỉ chia sẻ hai liên kết thôi, nếu không thì sẽ kéo dài mãi. Thứ nhất là https://git.lain.faith/sys64738/airs-notes.git và mục lục phần linker https://lwn.net/Articles/276782/. Nếu bạn mới chỉ chạm rất nhẹ vào ELF và linking, loạt blog 20 phần của Ian Lance Taylor cùng các chủ đề bổ sung chứa hầu như mọi điều bạn từng muốn biết về ELF, và cả những nội dung khiến bạn nghi ngờ rốt cuộc các lệnh hoạt động như thế nào. DWARF, người bạn đồng hành của ELF và cũng là một máy ảo được dùng mỗi khi có ngoại lệ C++ xảy ra, cũng được nhắc ngắn gọn.
      Thứ hai, https://0xax.gitbooks.io/linux-insides/content/ cũng là một dự án tuyệt vời. Nó lần theo cách Linux kernel thực hiện nhiều việc theo một cách dễ đọc với con người. Gần như chắc chắn nó đã từng được chia sẻ trên HN rồi.
  • Viết rất hay, và xin chúc mừng vì đã đào sâu vào một chủ đề như thế này
    Ngày nay, một người 17 tuổi có thể “lập trình” bằng cách ghép nối những thứ mình chưa hiểu và vẫn qua được ở mức nào đó, nhưng tôi nghĩ cuối cùng sẽ chạm trần. Vì vậy việc bạn đang làm bây giờ thực sự rất có giá trị, không chỉ cho bản thân bạn mà còn cho tất cả những ai sẽ học từ tài liệu này
    Làm tốt lắm :) Nếu chưa thử thì giờ hãy dùng emulator đi. Vui cực kỳ

    • Câu “ngày nay, một người 17 tuổi có thể lập trình bằng cách ghép nối những thứ mình chưa hiểu” cũng đúng với tôi. Tôi đã làm vậy 26 năm nay rồi
      Nếu “một ngày nào đó sẽ chạm trần”, tôi tò mò không biết nó có sắp xảy ra không
    • Giai đoạn từ 17 đến khoảng 21 tuổi lại là thời kỳ tôi ít ghép chắp nhất trong đời lập trình của mình
      Tôi tự làm MVC framework từ đầu, làm cả interpreter lẫn compiler, và còn vô tình cố gắng tái phát minh machine learning và xử lý ngôn ngữ tự nhiên từ con số không. Tôi đã làm đủ thứ hay ho và vui vẻ
      Rồi tôi phát hiện ra tiền và các công nghệ có sẵn. Khi chấp nhận việc người khác nói “cứ dùng cái này là được”, tôi có thể xây dựng nhanh hơn nhiều. Framework cũng vậy. Tôi đã rất ngạc nhiên khi jQuery khiến cuộc sống dễ dàng đến thế
      Vài năm sau, những thứ trước đây trông như “chỉ ghép lại với nhau” giờ lại được xem là “công việc cao cấp ở mức rất thấp”. Vì chúng ta đã xây thêm các tầng trừu tượng mới lên trên những trừu tượng đó
      Những gì người mới bắt đầu ngày nay “làm tạm được” sẽ trở thành vùng nguy hiểm cấp thấp cho thế hệ sau. Lập trình tuyệt vời ở điểm đó
    • Tôi hoàn toàn không đồng ý. Trừ khi bạn nhắm đến một vị trí chỉ làm các tác vụ kỹ thuật cụ thể trong một lĩnh vực rất hẹp, cuối cùng khả năng đọc tài liệu và nối kết dịch vụ đám mây với thư viện JavaScript sẽ trở nên cực kỳ quan trọng
      Ngược lại, người tiếp cận lập trình theo hướng học thuật có khả năng bị choáng ngợp hoàn toàn hơn khi gặp những việc đòi hỏi phải hiểu nhiều công nghệ ở mức cơ bản rồi chuyển tiếp
      Nếu bạn ở một tập đoàn lớn, nơi project manager và designer thu hẹp đặc tả để bạn chỉ tập trung vào triển khai thì khác, nhưng với đa số mọi người, đó là tình huống hiếm gặp
    • Tôi của 10 năm trước, khi mới bước vào ngành ở tuổi 30 với tư cách developer, đúng là như vậy. Có những thứ không thay đổi nhỉ
    • Hoặc thử dùng hệ điều hành cũng hay. Tôi nhớ ngày xưa từng theo cuốn Operating System Concepts và chạm đến khá nhiều chủ đề tương tự
      Tôi chỉ nhớ con khủng long trên bìa nên phải tra lại tên sách
  • Chúc mừng vì đã hoàn thành hướng dẫn này
    Nếu không học đại học, tôi thấy đoạn nói rằng bạn phải lục lọi rất nhiều tài liệu hệ thống tổng quát, chất lượng không đồng đều và đôi khi còn mâu thuẫn nhau
    Tài liệu tốt nhất có thể tìm được là Code: The Hidden Language of Computer Hardware and Software của Charles Petzold. Ấn bản thứ 2 vừa mới ra
    https://codehiddenlanguage.com/

    • Tôi cho rằng The Elements of Computing Systems của Noam Nisan và Shimon Schocken, cùng dự án nand2tetris liên quan, cũng hay ngang hoặc hơn. Nó thiên về tự tay làm hơn nhiều
      https://mitpress.mit.edu/9780262539807/the-elements-of-compu...
      https://www.nand2tetris.org/
    • Tôi đã đọc cuốn đó và rất thích, nhưng ngày nay tôi đặc biệt khuyên nên chơi game Turing Complete thay thế
      Nó dẫn dắt bạn rất tốt từ cổng NAND đến lời gọi hàm, theo một cách tương tác cực kỳ thú vị. Thay vì vừa đọc vừa tưởng tượng trong đầu nó hoạt động thế nào, bạn sẽ trực tiếp tạo ra nó
      Tôi đã làm cả assembly cho CPU của mình và một SIMD/GPU nhỏ điều khiển ma trận LED bằng ngôn ngữ programmable shader
    • Cảm ơn! Nó có cảm giác thiên về phần cứng và trông rất thú vị. Có lẽ một ngày nào đó tôi sẽ đọc
    • Khi xem website, tôi đã nhớ đến cuốn sách này
      15 năm trước, khi mua nó, đến phần kiến trúc CPU là mắt tôi đã mờ đi, nhưng có lẽ giờ tôi đã sẵn sàng. Gần đây tôi cũng đã mua ấn bản thứ 2
  • Đây là bài tôi đã đưa vào danh sách đọc. Trước đây, một chi tiết nhỏ này đã khiến tôi thích nó
    “Tôi đã thêm khoảng trắng ở cuối mỗi trang để người đọc có thể duy trì độ cao tầm mắt nhất quán.”
    Một chi tiết rất nhỏ, và nhìn lại thì hiển nhiên. Nhưng nó thoải mái một cách bất ngờ. Khi nhận ra điều đó, tôi biết đây là một dự án làm bằng đam mê

    • Có khá nhiều chi tiết UI rất hay. Việc tác giả 17 tuổi có vẻ cũng liên quan
      Có vẻ tác giả đã suy nghĩ rất nhiều về cách trình bày một cuốn sách trên web, và tạo ra những quy ước mới mà ta có thể kỳ vọng ở một thế hệ mới. Ví dụ, đây là lần đầu tôi thấy cách chương trước/sau hiện hơi mờ trong widget điều hướng chương ở phía trên
  • Tôi gần 40 tuổi rồi mà chưa từng làm được thứ như thế này. Tôi vừa mới định xoa dịu hội chứng kẻ mạo danh, giờ chắc phải xoa dịu thêm nữa
    Làm tốt thật :p

    • Không bao giờ là quá muộn để bắt đầu một việc có vẻ sẽ đem lại cảm giác thành tựu. Dù bạn 17, 40 hay 80 tuổi
      Vẫn còn rất nhiều thời gian, và cũng chẳng có mấy lý do để vội. Hãy chọn một ý tưởng truyền cảm hứng, rồi từ tốn thực hiện trong những khoảng thời gian rảnh nhỏ mà bạn có
      Tôi nghĩ điều cốt lõi là cảm thấy tự hào về bản thân khi làm việc đó. Thành phẩm cuối cùng rồi sẽ theo sau
  • OP, đừng lấy tuổi của mình ra để biện minh cho tác phẩm. Bài này tốt hơn những gì hầu hết mọi người có thể làm trong cả đời. Công việc tuyệt vời

    • Nếu không nhắc đến tuổi thì nó đã chẳng được chú ý ở đây. Có đầy tài liệu xuất sắc chết chìm trong new. Tác giả đã chọn dùng tuổi như một yếu tố marketing, và rõ ràng nó có hiệu quả
    • Gắn tuổi vào trước tài liệu tự quảng bá, dù trẻ hay già, là một góc marketing đã hiệu quả từ rất lâu rồi. Tôi không muốn trách tác giả vì đã tận dụng điều đó
    • Nếu tác giả không nói mình 17 tuổi, khả năng rất thấp là có ai quan tâm đến bản tóm tắt CPU ở mức ChatGPT này
  • Nếu ở tuổi 17 mà đã tạo ra được nội dung như thế này, tôi không thể tưởng tượng nổi bạn ấy sẽ còn làm được những điều đáng kinh ngạc nào nếu chọn lĩnh vực này làm nghề. Thật sự rất ấn tượng

    • Đọc bài này rồi xem qua các repository, tôi lại nghĩ theo hướng ngược lại. Tôi mong bạn ấy tìm được cách tiếp tục làm những gì đang làm, thay vì bước vào ngành công nghệ như một nghề nghiệp
      Tôi mong tâm hồn bạn ấy không bị đè nát bởi những việc quản lý vụn vặt, những mục tiêu doanh nghiệp còn vụn vặt hơn, và thứ thăng tiến sự nghiệp vô nghĩa. Bạn ấy hiện đã làm được những việc tuyệt vời, nên tôi ước có một dạng fellowship nào đó giúp bạn ấy tiếp tục mà không bị guồng quay hamster của ngành công nghệ nghiền nát tâm hồn
  • OP nên thử xem các bài giảng của Casey Muratori trên computerenhance.com
    Bài tập ở phần đầu khóa học là tạo một trình mô phỏng Intel 8086 năm 1978. x86_64 assembly hiện đại vẫn còn khá giống với nó. Bạn sẽ học được rất nhiều kiến thức máy tính mà thật sự rất khó tìm thấy ở nơi khác

  • Là một người cũng gần 17 tuổi, bạn làm tốt lắm! :^)
    Chỉ 20 phút trước tôi còn đang tìm cách lấy byte đầu tiên của một số nguyên 16-bit rồi mới biết đến endianness, còn bạn thì đang viết hẳn một cuốn sách về CPU
    Khi nào đọc xong Crafting Interpreters tôi nhất định sẽ đọc bài này. Có điều, giống như nhiều dự án khác, tiến độ của tôi rõ ràng đang chậm lại nên có thể sẽ mất một thời gian lol

  • Bài viết rất hay và tôi cũng thích phong cách của nó. Sự kết hợp giữa bài viết với minh họa/meme thật sự rất thú vị
    Về thuật ngữ RISC/CISC thì tôi hơi dè dặt một chút, nhưng có lẽ đó cũng chỉ là vấn đề sở thích của mỗi người >.>
    Là người từng dành thời gian tìm hiểu cách một số phần của kernel hoạt động, tôi đồng cảm với việc quá trình tạo ra bài viết này hẳn đã đau đớn đến mức nào. Dù vậy, nhìn vào bài viết thì rõ ràng là rất xứng đáng
    Về phía NT, Windows Internals bao quát rất nhiều nội dung mà bạn có thể muốn biết, và tài liệu của Microsoft cũng không tệ. Theo tiêu chuẩn của tôi thì chắc chắn tốt hơn tài liệu kernel Linux, và là một điểm khởi đầu rất tốt
    Nếu muốn biết thêm về Windows, tôi cũng khuyên xem các diễn đàn/tài liệu về game hacking. Có rất nhiều thứ cần lọc bỏ, nhưng với các chủ đề ngách thì đôi khi đó là nguồn thông tin khá tốt
    Cuối cùng, khi xem trên smartphone, phông chữ của một số code block khá lớn nên khó đọc. Ví dụ như main.c ở chương 6
    Nhân tiện, câu “nếu bạn là một thiếu niên thích máy tính và vẫn chưa có mặt trong Hack Club Slack thì hãy tham gia ngay” làm tôi nhớ quá rõ rằng mình đang già đi lol