Mô phỏng Linus Torvalds: tạo hệ điều hành của riêng bạn từ đầu (VII)

Chào mừng bạn đến với một bài viết khác về cách tạo hệ điều hành của riêng chúng tôi (Các bài trước trong loạt bài: 1, 2, 3, 4, 5 y 6). Đã khá lâu kể từ bài viết cuối cùng, chủ yếu là do một lỗi mà tôi đã tìm thấy trong những gì chúng ta có ngày hôm nay. Chúng ta sẽ thấy cách xử lý đồng hồ trên kiến ​​trúc x86.

Trước đây, chúng tôi đã kích hoạt IRQ theo cách chung chung, nhưng có một vấn đề nhỏ là chúng tôi đã không kích hoạt chúng một cách chính xác và chúng tôi đã chuyển thêm dữ liệu. Cuối cùng chúng tôi cũng sửa được carlosorta và tôi và tôi có thể tiếp tục bình luận về cách tiếp tục.

Đồng hồ là IRQ, cụ thể là đồng hồ đầu tiên. Để định cấu hình nó, chúng tôi sẽ sử dụng chức năng mà chúng tôi đã xác định ở trên để cài đặt chung IRQ, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Cổng :: Đầu raB (0x43,0x36); ND :: Cổng :: Đầu raB (0x40, số chia & 0xFF); ND :: Cổng :: Đầu raB (0x40, số chia >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + tích tắc; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ n Bộ hẹn giờ ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Màn hình :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("xong"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nMột giây nữa"); CHÚNG TÔI NÊN LÀM LẠI MÀN HÌNH}}

Đoạn mã chạy như sau: hệ thống khởi tạo gọi ND :: Hẹn giờ :: Thiết lập, cuộc gọi nào ND_IRQ_Trình xử lý cài đặt để chèn vào vị trí đầu tiên, IRQ0, một hàm gọi lại khi sự kiện xảy ra, nghĩa là ND_Timer_Handler điều đó làm tăng bọ ve. Vì chúng ta đã đặt tốc độ đồng hồ thành 18 Hz, như chúng ta sẽ thấy ở phần sau, nếu chúng ta chia nó cho 18 và cho chúng ta một số nguyên, thì một giây sẽ trôi qua.

Chức năng ND :: Hẹn giờ :: Pha Nó giúp chúng tôi điều chỉnh tốc độ của bộ đếm thời gian, con số xa hoa đó là 1.19 MHz, là một giá trị phổ biến. Chúng ta nên gọi hàm này nếu chúng ta muốn thay đổi tốc độ của bộ đếm thời gian, theo mặc định, nó chuyển sang 18,22 Hz, một giá trị đặc biệt mà ai đó phải quyết định trong IBM và nó vẫn còn cho đến ngày nay.

Chức năng ND :: Hẹn giờ :: Chờ nó khá đơn giản, chỉ cần đợi với một vòng lặp trong khi cho đên khi bọ ve cần thiết để tiếp tục.

Trong hình ảnh, chúng ta có thể thấy rằng nếu chúng ta bỏ ghi chú mã bên trong ND_Timer_Handler, chúng ta nhận được như sau:

Giây trong NextDivel

Trong chương tiếp theo, chúng ta sẽ xem cách đọc nhập liệu bằng bàn phím và tạo một chút shell để tương tác với hệ thống của chúng tôi. Như mọi khi, mã có sẵn trong GitHub theo giấy phép GNU GPL v2.


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Noah dijo

    Một loạt các hướng dẫn rất thú vị, cá nhân tôi chưa từng thấy nhiều về cách tạo bản phân phối Linux từ đầu, và thậm chí ít hơn bằng tiếng Tây Ban Nha và quá hoàn chỉnh. Tôi nghĩ rằng bạn có thể học được nhiều điều từ điều này và ngay khi tôi có thời gian, tôi hy vọng có thể thực hiện những hướng dẫn này.
    Tất cả những gì tôi yêu cầu là bạn đừng nản lòng và hoàn thành hướng dẫn, vì tôi đã tìm thấy nhiều hướng dẫn hay mà không bao giờ kết thúc.
    Xin chào và cảm ơn :).

    1.    người đi đường dijo

      Nó không phải là một bản phân phối linux, nó là một nhân 😛.

    2.    người giải mã dijo

      Bạn sai rồi. Tạo một bản phân phối linux không có nghĩa là lập trình bất cứ thứ gì, ví dụ, trong một bản phân phối Linux từ đầu bạn không lập trình, việc bạn làm là cài đặt (dựa trên biên dịch), các gói cơ bản tạo nên một bản phân phối. Điều này rất khác biệt. Nó đang tạo ra hệ điều hành của riêng bạn. Nó không liên quan gì đến linux. Đây là những gì torvalds đã làm trong thời của anh ấy lấy cảm hứng từ minix, và với cuộc thảo luận sôi nổi và phổ biến đó giữa torvalds và andrew s. tanenbaum trên kernel nguyên khối vs microkernel.

      Saludos!

  2.   bệnh tật dijo

    Cảm ơn che. Cho đến giờ tôi vẫn chưa quan tâm lắm đến bài viết của bạn nhưng tôi đang trong một dự án nên tôi sẽ xem qua chúng.
    Chúc mừng.

  3.   người đi đường dijo

    Đáng nói là các ngôn ngữ khác có thể được sử dụng, chẳng hạn như Objective-C (++), C ++, D hoặc Rust.

    1.    AdrianArroyoStreet dijo

      Cái này là trong C ++, không phải C. Tuy nhiên, rất khó để thấy sự khác biệt vì nhiều toán tử C ++ yêu cầu hỗ trợ thư viện, chẳng hạn như toán tử mới và xóa. Sẽ rất thú vị khi tạo một hệ điều hành trong Rust. Thực ra có một kênh IRC dành riêng cho hệ điều hành trên Rust (# gỉ-osdev trên irc.mozilla.net). Bất kỳ ai biên dịch sang mã máy đều thực sự đáng giá, kể cả Java nếu chúng ta sử dụng GCJ.

      1.    người đi đường dijo

        Vâng, thực sự, Rust là một ngôn ngữ rất thú vị cho hệ điều hành, bởi vì nó không chỉ dễ học hơn C hoặc C ++ (nó vẫn tiếp tục với những thay đổi liên tục, nhưng nó dễ dàng hơn) mà còn an toàn hơn nhiều.

  4.   người đi đường dijo

    Vào những năm 70, việc lập trình trực tiếp trên phần cứng mà không cần hệ điều hành là khá phổ biến.

  5.   Christopher dijo

    Tuyệt vời ... bây giờ tôi chỉ cần hiểu: 3 ...

  6.   mmm dijo

    Chào. Cảm ơn bạn rất nhiều về những bài viết này. Nhưng, nếu tôi không có kiến ​​thức về lập trình, tôi nghĩ tôi không nên làm điều đó, phải không? Ý tôi là, nếu không nó sẽ là một «tốt, và bây giờ tôi sao chép và dán cái gì?» ... thật đáng tiếc, tôi luôn muốn rất nhiều để biết cách lập trình và không có gì, tôi chỉ là một con lừa!

    1.    người giải mã dijo

      Đừng tự trách mình, bạn không phải là con lừa. Để bắt đầu, không phải lập trình viên nào cũng biết cách viết kernel, đó là một công việc rất đơn giản, và trong thực tế, nó còn lớn hơn. Ví dụ, ở đây tác giả tạo ra các trình điều khiển chung cho bàn phím và màn hình, thao tác trên mảng màn hình, đây là một phương pháp hoàn toàn không được sử dụng ngày nay. Tty trong linux ngày nay rất, rất phức tạp và không phụ thuộc vào kiến ​​trúc x86 có một mảng màn hình theo ý của nó. Ngoài ra, phần lớn mã C phụ thuộc vào kiến ​​trúc, khi lý tưởng nhất là tạo mã kiến ​​trúc trong trình hợp dịch và mã C hoạt động trên bất kỳ bộ xử lý nào. Tuy nhiên, tôi không dèm pha tác giả, bởi vì một nhân có được những đặc điểm mà ngày nay chúng ta coi là bình thường trong một nhân linux chẳng hạn, đó không phải là một nhiệm vụ dễ dàng, và hãy yên tâm rằng một người hoàn toàn không có khả năng làm được. Đối với một số dự án lớn như linux, gcc, glibc, v.v., không phải do một người thực hiện mà có rất nhiều cộng tác viên.

      Ngoài ra, nếu bạn muốn bắt đầu lập trình, bạn có khá nhiều hướng dẫn trên web, mặc dù bạn phải cẩn thận và chọn những hướng dẫn tốt. Tôi bắt đầu lập trình trên linux và nhảy xuống vực với cái đầu của tôi và không có nước (nghĩa là với ngôn ngữ C yêu quý), mặc dù bây giờ tôi đã có một số khái niệm cơ bản về python (nó cũng là một ngôn ngữ rất tốt). Có một số cuốn sách C mà bạn bỏ ở trang 6 làm bạn đau đầu hơn nhiều, nhưng hơn cả những cuốn sách này, những điều này được đúc kết từ kinh nghiệm. Nó xảy ra như với mô hình mạng OSI. Tài liệu về mô hình osi hoàn toàn không thể hiểu được đối với người mới, nhưng nếu bạn tìm thấy một trang web có giải thích tốt về các lớp mạng, bạn sẽ nhanh chóng có được các khái niệm để xử lý các tài liệu kỹ thuật như RFC.

      Tóm lại, có rất nhiều trang web và sách hướng dẫn tốt trên mạng, vấn đề là bạn phải tìm hiểu kỹ và tìm tài liệu tốt.

      Liên quan

  7.   Sự tự do dijo

    Xin chào, sau tất cả các nỗ lực để giải quyết "lỗi: không tìm thấy tiêu đề multiboot." và "lỗi bạn cần tải hạt nhân trước", vì tôi không thể tìm thấy bất kỳ giải pháp nào cho vấn đề của bài viết đầu tiên, mà một số người như tôi đã gặp phải ... đây là giải pháp, nếu nó hoạt động với ai đó ...

    Tôi không biết lý thuyết của tôi về nguyên nhân gây ra lỗi có đúng không nhưng dù sao, câu hỏi là khi biên dịch các tệp trong hệ điều hành 32 bit, nó không tạo ra lỗi, nhưng vì tôi sử dụng hệ điều hành 64 bit. hệ thống (Gnu / Linux Debian 7), và khi biên dịch và kiểm tra, tôi gặp lỗi "không tìm thấy tiêu đề multiboot", và có một nghi ngờ, theo tôi thì lỗi là do môi trường hoặc kiến ​​trúc của hệ điều hành trong đó chúng tôi đang biên dịch các tệp của mình ... và những gì tôi đã làm là biên dịch các tệp của mình, chỉ định môi trường hoặc kiến ​​trúc 32 bit ..
    * sudo dưới dạng -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * Sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    Điều kỳ lạ là tôi có một số nghi ngờ hahaha, sau đó hệ điều hành mà chúng tôi đang tạo ra từng bước là cho một kiến ​​trúc x86 hay tôi đã nhầm ajajaj….

    Tái bút: ai đó giúp tôi với sự nghi ngờ, và bào chữa cho một số lỗi chính tả hoặc cách diễn đạt không tốt của tôi, và tôi không hoàn hảo nên «Sự hoàn hảo có cái giá của nó»…. Và quan trọng nhất, giả lập hệ điều hành 32 bit, giải pháp thần thánh … .Hahaha

    1.    martin biệt thự dijo

      Thiên tài ! Tôi thực sự muốn thực hiện hướng dẫn này và tôi đã gặp sai lầm ngay từ đầu haha

  8.   Oscar dijo

    Xin chúc mừng, đó là một đóng góp xuất sắc. Từ bây giờ tôi chia sẻ rằng công việc tốt của bạn thông qua tôi và những người khác sẽ được mở rộng;

    Liên quan