Linus Torvalds 에뮬레이션 : 처음부터 자신 만의 운영 체제 만들기 (VII)

에 대한 다른 게시물에 오신 것을 환영합니다. 자체 운영 체제를 만드는 방법 (이 시리즈의 이전 기사 : 1, 2, 3, 4, 5 y 6). 지난 게시물 이후로 오랜 시간이 지났습니다. 주로 오늘 우리가 발견 한 버그 때문입니다. 우리는 볼 것이다 x86 아키텍처에서 시계를 처리하는 방법.

이전에는 일반적인 방식으로 IRQ를 활성화했지만 올바르게 활성화하지 않았고 추가 데이터를 전달했기 때문에 작은 문제가있었습니다. 우리는 마침내 그것을 고칩니다. 카를로 소르 타 계속하는 방법에 대해 계속해서 언급 할 수 있습니다.

음, 시계는 IRQ, 특히 첫 번째입니다. 이를 구성하기 위해 위에서 정의한 기능을 사용하여 일반적으로 IRQ 인 ND_IRQ_InstallHandler를 설치합니다.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: 포트 :: OutputB (0x43,0x36); ND :: 포트 :: OutputB (0x40, 제수 및 0xFF); ND :: 포트 :: OutputB (0x40, 제수 >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + 틱; while (ND_TIMER_TICKS <eticks) {void ND :: 타이머 :: 설정 () {ND :: 화면 :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: 화면 :: PutString ( "\ n 설정 타이머 ..."); ND_IRQ_InstallHandler (0 및 ND_Timer_Handler); ND :: 화면 :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: 화면 :: PutString ( "완료"); } extern "C"void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS % 18 == 0) {// ND :: 화면 :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ( "\ nXNUMX 초 더"); 새로 고침 화면을 실행해야합니다}}

코드는 다음과 같이 실행됩니다. 초기화 시스템 호출 ND :: 타이머 :: 설정, 호출 ND_IRQ_InstallHandler 이벤트 발생시 콜백 함수 인 IRQ0을 첫 번째 위치에 삽입합니다. ND_Timer_Handler 그 증가 . 클럭 속도를 18Hz로 설정 했으므로 나중에 볼 수 있듯이 18로 나누고 정수를 주면 XNUMX 초가 지났을 것입니다.

함수 ND :: 타이머 :: 위상 속도를 조정하는 데 도움이됩니다. 타이머, 그 사치스러운 숫자는 공통 값인 1.19MHz입니다. 음, 속도를 변경하려면이 함수를 호출해야합니다. 타이머, 기본적으로 18,22Hz로 이동합니다.이 값은 누군가 내에서 결정 했어야합니다. IBM 그리고 그것은 오늘날까지 남아 있습니다.

함수 ND :: 타이머 :: 대기 매우 간단합니다. 루프로 기다리세요. 동안 까지 계속하려면 필요합니다.

이미지에서 ND_Timer_Handler 내부의 코드 주석 처리를 제거하면 다음과 같은 결과를 얻을 수 있습니다.

NextDivel의 초

다음 장에서 우리는 키보드 입력을 읽는 방법과 껍질 우리 시스템과 상호 작용합니다. 항상 그렇듯이 코드 에서 사용할 수 있습니다. GitHub의 라이센스하에 GNU GPL v2.


코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   노아

    매우 흥미로운 일련의 자습서, 개인적으로 처음부터 Linux 배포판을 만드는 방법에 대해 많은 것을 보지 못했고 스페인어로도 완성되지 않았습니다. 저는 여러분이 이것으로부터 많은 것을 배울 수 있다고 생각하며 시간이 생기면이 튜토리얼을 할 수 있기를 바랍니다.
    내가 요청하는 것은 결코 끝나지 않은 좋은 자습서를 많이 발견했기 때문에 실망하지 않고 자습서를 끝내는 것입니다.
    인사와 감사합니다 :).

    1.    승용차

      Linux 배포판이 아니라 커널입니다.

    2.    Desikoder

      네가 틀렸어. 리눅스 배포판을 만드는 것은 아무것도 프로그래밍하는 것을 의미하지 않습니다. 예를 들어, 처음부터 프로그래밍하지 않는 리눅스에서는 배포판을 구성하는 기본 패키지를 설치 (컴파일 기반)하는 것입니다. 이것은 매우 다릅니다. 자신 만의 운영 체제를 만들고 있습니다. 그것은 리눅스와 관련이 없습니다. 이것이 미닉스에서 영감을 받아 토발 드가했던 일입니다. 그리고 토 발드와 앤드류 사이의 열띤 토론과 대중적인 논의가있었습니다. 모 놀리 식 커널 대 마이크로 커널의 tanenbaum.

      안녕 하쇼!

  2.   일 루키

    감사합니다. 지금까지 당신의 글에별로 신경을 쓰지 않았지만 저는 프로젝트에 참여하고있어서 그것들을 살펴볼 것입니다.
    인사말.

  3.   승용차

    Objective-C (++), C ++, D 또는 Rust와 같은 다른 언어를 사용할 수 있습니다.

    1.    AdrianArroyoStreet

      이것은 C가 아닌 C ++에 있습니다. 그러나 많은 C ++ 연산자에는 new 및 delete 연산자와 같은 라이브러리 지원이 필요하기 때문에 차이점을 확인하기가 어렵습니다. Rust로 운영 체제를 만드는 것은 매우 흥미로울 것입니다. 실제로 Rust에는 운영 체제 전용 IRC 채널이 있습니다 (irc.mozilla.net의 # rust-osdev). 기계 코드로 컴파일하는 사람은 누구나 GCJ를 사용한다면 Java를 포함하여 그만한 가치가 있습니다.

      1.    승용차

        예, 실제로 Rust는 운영 체제에서 매우 흥미로운 언어입니다. 왜냐하면 C 또는 C ++보다 배우기 쉬울뿐만 아니라 (계속해서 계속 변경되지만 더 쉬움) 훨씬 더 안전하기 때문입니다.

  4.   승용차

    70 년대에는 OS없이 하드웨어에서 직접 프로그래밍하는 것이 일반적이었습니다.

  5.   크리스토퍼

    훌륭합니다 ... 이제 이해해야합니다 : 3 ...

  6.  

    안녕. 이 기사에 대해 대단히 감사합니다. 하지만 프로그래밍 지식이 없으면해야 할 것 같지 않죠? 제 말은, "좋아요, 이제 제가 무엇을 복사해서 붙여 넣을까요?"가 아니라면 ... 안타깝게도 저는 항상 너무 많이 프로그래밍하는 방법을 알고 싶었습니다. 저는 당나귀에 더 가깝습니다!

    1.    Desikoder

      자신을 비난하지 마십시오. 당신은 당나귀가 아닙니다. 우선 모든 프로그래머가 커널을 작성하는 방법을 아는 것은 아니며 매우 간단한 작업이며 실제로는 더 큽니다. 예를 들어, 여기에서 저자는 키보드와 화면에 대한 일반 드라이버를 만들어 화면 배열을 조작합니다. 이는 오늘날 전혀 사용되지 않는 방법입니다. 오늘날 리눅스의 tty는 매우 복잡하고 화면 배열이있는 x86 아키텍처에 의존하지 않습니다. 또한 C 코드의 대부분은 어셈블러에서 아키텍처 코드를 작성하고 C 코드가 모든 프로세서에서 작동하는 아키텍처에 의존합니다. 그러나 커널은 오늘날 우리가 리눅스 커널에서 정상으로 간주하는 특성을 획득하기 때문에 저자를 훼손하지 않습니다. 리눅스, gcc, glibc 등과 같은 큰 프로젝트는 한 사람이 만든 것이 아니지만 많은 협력자가 있습니다.

      또한 프로그래밍을 시작하려면 웹에 꽤 많은 가이드가 있지만주의해야하고 좋은 가이드를 선택해야합니다. 지금은 파이썬에 대한 몇 가지 기본 개념을 가지고 있지만 (아주 좋은 언어이기도하지만) 물없이 (즉, 사랑하는 C 언어로) 풀에 뛰어 드는 리눅스에서 프로그래밍을 시작했습니다. 6 페이지에 당신이 겪는 골칫거리만큼 포기하는 C 책이 있지만, 이러한 것들은 경험에서 얻은 것보다 더 많습니다. OSI 네트워크 모델과 마찬가지로 발생합니다. osi 모델에 대한 문서는 초보자가 이해하기가 절대 불가능하지만 네트워크 계층에 대한 좋은 설명이있는 사이트를 찾으면 RFC와 같은 기술 문서를 처리 할 수있는 개념을 빠르게 얻을 수 있습니다.

      요컨대, 좋은 웹 사이트와 매뉴얼이 있습니다. 그것은 그것에 들어가 좋은 자료를 찾는 문제입니다.

      안부

  7.   자유

    안녕하세요, "오류 : 멀티 부팅 헤더를 찾을 수 없음"을 해결하려는 모든 시도가 끝난 후. 그리고«커널을 먼저로드해야하는 오류», 나 같은 일부가 가지고있는 첫 번째 기사의 문제에 대한 해결책을 어디서도 찾을 수 없었기 때문에 여기에 해결책이 있습니다.

    오류의 원인에 대한 내 이론이 올바른지 모르겠지만 어쨌든 문제는 32 비트 운영 체제에서 파일을 컴파일 할 때 오류가 발생하지 않았지만 64 비트가 있기 때문에 운영 체제 (Gnu / Linux Debian 7)를 컴파일하고 테스트 할 때 "no multiboot header found"라는 오류가 발생하고 의심스러운 점이 있습니다. 제 생각에는 오류가 운영 체제의 환경이나 아키텍처 때문이라고 생각합니다. 파일을 컴파일하는 시스템 ... 그리고 제가 한 일은 32 비트 환경이나 아키텍처를 지정하여 파일을 컴파일하는 것입니다.
    * sudo -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
    이상한 점은 하하하, 우리가 단계적으로 만들고있는 운영 체제는 x86 아키텍처 용이거나 내가 틀린 ajajaj…

    추신 : 누군가 나를 의심하고 철자 오류나 내 잘못된 표현을 용서해 줄 사람, 그리고 난 완벽하지 않아서«완벽한 가격이있다»…. 그리고 가장 중요한 것은 32 비트 운영 체제를 에뮬레이트하는 거룩한 솔루션입니다. …. 하하하

    1.    마틴 빌라바

      천재! 이 튜토리얼을 정말하고 싶었고 그 실수로 처음에 내려 왔습니다 haha

  8.   오스카

    축하합니다. 훌륭한 공헌입니다. 이제부터 나는 나와 다른 사람들을 통한 당신의 좋은 일이 확장 될 것임을 당신과 공유합니다.

    안부