문제

컴퓨터에서 초록(화면의 문자)이 실제(메모리와 프로세서의 회로를 통과하는 전류)와 만나는 곳은 어디입니까?그 진화는 어떻게 일어났는가?

나는 여기서 어셈블러보다 더 깊게 이야기하고 있다고 생각합니다.아마도 프로세서 명령어보다 더 깊은 수준일까요?어떤 시점에서 명령은 실제로 하드웨어에 의해 해석되지만 어디서/어떻게 발생하는지 이해하지 못합니다.

나는 대학에 가지 않았기 때문에 CS 과정이나 다른 과목을 수강하지 않았습니다.많은 사람들처럼 나도 취미생활을 즐기는 사람이 '프로'가 되었습니다.결과적으로 제가 놓친 퍼즐 조각이 많이 있는 것 같아요.나는 약간의 C++를 알고 포인터 등의 개념을 이해하지만(분노할 때 많이 사용하지는 않았지만) 높은 수준에서만 작업해 왔습니다.이런 종류의 내용이 나에게 도움이 될지 아닐지는 잘 모르겠지만, 확실히 흥미롭습니다.

도움이 되었습니까?

해결책

프로세서는 Fetch-Decode-Execute Cycle이라고 알려진 것을 작동합니다. 기계 코드 지침은 상당히 낮은 수준입니다 (즉, 단일 명령으로 그다지 많은 일을하지는 않습니다). 예를 들어 두 숫자를 추가하면 Semantics가있는 일련의 지침이 있습니다.

  • 피연산자 1에 대한 포인터를 레지스터 1에로드합니다.
  • 레지스터 1에 저장된 주소에 저장된 값을 레지스터 2에로드합니다.
  • 피연산자 2의 주소에 대한 포인터를 레지스터 1에로드합니다.
  • 레지스터 1의 주소에 저장된 값을 레지스터 3에로드합니다.
  • 레지스터 2와 레지스터 3의 내용을 추가하여 레지스터 4에 저장하십시오.
  • 대상에 대한 포인터를 레지스터 1에로드하십시오
  • 레지스터 1에 지정된 주소에 레지스터 4의 내용을 저장

프로세서 내에는 '레지스터 파일'으로 알려진 특수한 빠른 메모리 세트가 있으며, 여기에는 프로세서가 당시 작업중인 데이터를 저장하는 데 사용하는 메모리가 포함되어 있습니다. 레지스터 파일에는 몇 가지 레지스터가 있으며, 이는 고유하게 식별됩니다. 지침은 일반적으로 레지스터, 특히 RISC 아키텍처에서 작동합니다. 이것이 항상 그런 것은 아니지만 지금은 충분한 추상화입니다.

일반적으로 프로세서는 데이터를 수행하기 위해 데이터를 레지스터에로드하거나 저장해야합니다. 레지스터에 대한 산술 작업, 두 개의 레지스터에서 피연산자를 가져 가서 결과를 세 번째로 배치하는 것과 같은 작업 (Peanut Gallery의 이점을 위해 I 가지다 6502를 사용했습니다 - 문제를 혼동하지 마십시오 ;-). 프로세서에는 레지스터에서 데이터를 기계의 기본 메모리에로드하거나 저장하는 데 특별한 지침이 있습니다.

프로세서에는 다음 작업의 주소를 저장하는 '프로그램 카운터'라는 특수 레지스터가 있습니다. 따라서 명령을 실행하기위한 순서는 대략 다음과 같습니다.

  • 프로그램 카운터의 현재 주소에 저장된 지침을 가져 오십시오.
  • 명령어를 디코딩하고 실제 작업, 사용하는 레지스터, '주소 지정 모드'(데이터를 얻거나 저장하는 위치) 및 기타 비트 및 밥을 분리합니다.
  • 지침을 실행하십시오.

명령어를 실행하면 다양한 레지스터에서 값이 변경됩니다. 예를 들어, '로드'명령은 값을 레지스터에 복사합니다. 산술 또는 논리적 (및 XOR)은 두 값을 취하고 3 분의 1을 계산합니다. 점프 또는 브랜치 명령어는 프로그램 카운터의 주소를 변경하여 프로세서가 다른 위치에서 지침을 가져 오기 시작합니다.

프로세서에는 특수 레지스터가있을 수 있습니다. 이러한 예는 위에서 설명한 프로그램 카운터입니다. 또 다른 전형적인 것은 조건 플래그 레지스터입니다. 이것은 특별한 의미를 가진 몇 가지 비트가 있습니다. 예를 들어 마지막 산술 작동 결과가 0 인 경우 설정된 플래그가있을 수 있습니다. 이것은 조건부 작업에 유용합니다. 두 숫자를 비교할 수 있습니다. 동일하면 '제로'플래그가 설정됩니다. 프로세서는이 플래그가 설정된 경우에만 실행되는 조건부 명령을 가질 수 있습니다.

이 경우 레지스터에서 카운터를 줄일 수 있으며 0 인 경우 조건 플래그가 설정됩니다. 감소 명령의 결과가 0 인 경우 카운터를 줄이고 루프를 종료하는 루프에 조건부 (분기)를 사용할 수 있습니다. 일부 프로세서 (예 : ARM 패밀리)에서 모든 지침은 조건부이며, 조건부가 아닌 지침에 대한 특별한 '항상'조건이 있습니다.

일반적인 프로세서 지침의 일부 예는 다음과 같습니다.

  • 레지스터를 증가 시키거나 감소시킵니다
  • 레지스터의 내용을 메모리에로드하거나 저장하십시오. 다른 레지스터의 내용으로로드하거나 저장할 주소를 가질 수도 있습니다. 이를 통해 다른 레지스터를 증가시켜 다양한 데이터를 쉽게 반복 할 수 있습니다.
  • 값을 계산하기 위해 논리적 작업을 추가하고, 빼고, 곱하십시오. 이들은 두 개의 레지스터에서 피연산자를 가져 와서 결과를 3 분의 1로 배치합니다.
  • 다른 위치로 이동 - 위치의 내용을 프로그램 카운터로 옮기고 새 위치에서 지침을 가져 오기 시작합니다.
  • 스택에 값을 누르거나 팝하십시오.

이 stackoverflow 게시물 컴파일 된 C 코드의 작은 스 니펫과 해당 스 니펫의 어셈블리 언어 출력의 예가 있습니다. 고급 언어와 컴파일하는 기계 코드 출력 간의 관계의 예를 제공해야합니다.

이것을 배우는 가장 좋은 방법은 어셈블러를 얻고 시도하는 것입니다. 이것은 1980 년대 8 비트 마이크로와 같은 오래되고 간단한 컴퓨터에서 훨씬 쉬웠습니다. 요즘 이용 가능한 이러한 유형의 아키텍처에서 가장 가까운 것은 내장 시스템입니다. 마이크로 칩 사진과 같은 임베디드 프로세서의 개발 보드를 상당히 저렴하게 얻을 수 있습니다. 이러한 유형의 아키텍처는 현대 운영 체제보다 수하물이 적기 때문에 시스템 통화를 사용하기위한 I- 팅팅 및 T- 교차가 적습니다. 이를 통해 이러한 유형의 아키텍처에서 어셈블리 언어 프로그램을 더 쉽게 부트 스트랩 할 수 있습니다. 더 간단한 아키텍처도 이해하기 쉽습니다.

또 다른 옵션은 다음과 같은 에뮬레이터를 얻는 것입니다 스im. 이렇게하면 CPU를 모방하고 프로그램을 조립하고 실행할 수 있습니다. 이러한 에뮬레이터의 장점은 단일 스테핑 프로그램 (디버거와 마찬가지로)을위한 시설과 레지스터 파일의 내용을 보여줄 것입니다. 이것은 실제로 무슨 일이 일어나고 있는지에 대한 통찰력을 얻는 데 도움이 될 수 있습니다.

다른 팁

나는 당신이 책을 읽을 것을 제안합니다 암호, 그것은 컴퓨터가 다른 시스템에서 어떻게 진화했는지에 대한 자세한 기록을 제공합니다.

그것은 매우 매력적이며 Morse 코드에서 간단한 추가 기계로, 그리고 일부 어셈블리로 진화하는 방법을 설명 할 것입니다. CPU, 메모리 등의 하드웨어에서 기계 지침을 해석하고 사용하는 방법에 대한 그림을 제공해야합니다.

실제로 친구에게서 알게 된 기계 언어 아래에 실제로 하나가 더 있습니다. 라고 불린다 Microcode.

자세한 내용은이 Wikipedia 기사를 참조하십시오. http://en.wikipedia.org/wiki/microcode

가장 실제는 전류와 전압이라고 가정하자. 추상화의 첫 번째 단계는 A +5V 전압이 비트를 '1'으로 비트로 설정하고 0V 전압은 '0'으로 비트를 설정한다는 것을 고려하는 것입니다. 스위치를 사용하면 와이어 값을 결정할 수 있습니다.

두 번째 와이어와 두 번째 스위치를 사용하면 두 개의 이진 값이 나타납니다. 그들과 가장 흥미로운 것은 이진 값을 작업과 같은 작업과 결합하는 것입니다. 여기에는 두 가지 개념이 참여합니다. 트랜지스터 진짜와 논리 추상화를 위해. 이를 통해 두 바이너리 입력에 대한 추가, 하부 및 기타 여러 작업을 수행 할 수 있습니다. '0'및 '1'이외의 값을 나타 내기 위해 더 많은 와이어를 추가 할 수 있습니다. 이렇게하면서, 당신은 an을 얻습니다 알루.

이제 시간을 포함시킬 시간입니다. ALU의 여러 결과를 원한다면 입력 데이터를 한 번에 하나씩 제공해야하므로 시퀀싱 작업을위한 시계와 제어 장치가 필요합니다. 또한 입력 값 및 결과를 저장하기위한 메모리, 명령 및 관찰을위한 입력 및 출력 장치가 필요합니다. 이렇게하면 a 폰 노만 건축, 이것은 거의 모든 컴퓨터 아키텍처의 기초입니다.

다음 추상화 수준은 적절한 전자 제품 으로이 특정 비트가 LCD 디스플레이의 특정 픽셀을 자극 할 것이라고 결정할 때입니다.

Charles Petzold의 코드가 흥미로운 읽기를 찾을 수 있습니다.
http://www.amazon.co.uk/code-language-dv-undefined-charles-petzold/0735611319

귀하의 질문의 전제가 올바르지 않습니다.구분이 없습니다.소프트웨어는 전자적으로 입력되고 저장됩니다.인간이 쉽게 따라할 수 있도록 소프트웨어가 영어와 같은 언어로 표시되는 것뿐입니다.

예를 들어, 키보드를 통해 "데스크톱 화면을 녹색으로 변경"이라고 입력하면 전자적으로 금속에 직접 연결됩니다(키보드/마우스/터치스크린 작동 방식 참조).화면에 영어 텍스트로 표시되는 것뿐입니다.한 단계 더 나아가면 입력한 텍스트는 고급 언어로 되어 있으며 CPU가 논리를 수행할 수 있도록 기계어 코드로 변환됩니다.기계코드도 전자형태로 되어있습니다.예를 들어 텍스트는 opcode 등으로 변환되지만 opcode는 전자 형식이며 CPU가 이를 처리할 수 있습니다.

결론은 컴퓨터 내부의 모든 것이 입력되는 순간부터 전자 형식이라는 것입니다.이는 하드 디스크나 메모리(트랜지스터 등)에 있습니다.화면에 텍스트로 표시되는 것뿐입니다.

다시 말하지만, 구분이 없습니다.메모리(트랜지스터 등)나 하드 디스크에 저장된 소프트웨어는 이미 전자적으로 존재합니다.소프트웨어(하드웨어가 소프트웨어와 함께 수행하려는 작업)를 실행하려면 하드웨어(하드 로직 - 게이트)가 필요합니다.비전자적 형태로 컴퓨터에 어떤 것도 입력할 수 없습니다.

이것이 의미가 있기를 바랍니다.

글쎄, 당신이 하드웨어를 만나는 실제 지점은 물론 당신이하고있는 일에 달려 있습니다. 그러나 "텍스트 표시"의 (우수한) 예제를 가져 오려면 :

초록에서 하드웨어로 :

  • 사용자 유형의 문자를 그녀의 워드 프로세서 (WP)에 입력합니다.
  • WP 소프트웨어는 편집중인 문서의 일부로 먼저 메모리에 문자를 저장합니다.
  • 그런 다음 WP 소프트웨어는 사용자 인터페이스 라이브러리에 창에 편집되는 텍스트를 표시하려는 것을 사용합니다 (물론 지속적으로 발생합니다). UI 라이브러리는 시스템 의존적입니다 (MS Windows, X Windows 또는 QT 등의 Windows API, Linux, Java 등의 AWT/Swing 등).
  • UI 라이브러리는 몇 가지 추상화 계층을 통해 데이터를 전달합니다. 특히, 래스터 화를 수행합니다 (정보를 변환 "A a"를 A를 나타내는 픽셀 그리드로 변환)
  • 결국 정보는 그래픽 카드의 장치 드라이버로 전달됩니다. 이곳은 우리가 "실제"하드웨어를 만나는 곳입니다 :-). 일반적으로 그래픽 카드는 "비디오 메모리", 즉 CPU가 쓸 수있는 카드의 메모리를 노출시킵니다. 그래픽 카드 드라이버 (CPU에서 실행)는 A- 비디오 메모리의 픽셀을 작성합니다.
  • 그래픽 카드 회로는 비디오 메모리를 읽고 데이터를 카드의 비디오 커넥터와 모니터로 나오는 비디오 신호로 변환합니다.
  • 모니터는 희망적으로 A :-)처럼 보이는 것을 표시합니다.

이 설명은 너무 학문적이지는 않지만 이것이 내가 이해하는 방법입니다 (대학에 가지 않았습니다).

첫 번째 단계에는 관련이 있습니다 부울19 세기에 모든 수학적 작업은 일련의 기호와 일부 관련 연산자를 사용하여 표현 될 수 있다는 것을 증명 한 대수의 대수. 따라서 Common +, -, *, / 연산자와의 기본 10 산술은 두 개의 기호 (0, 1 / true, false)와 로직 연산자 (및 등) 만 사용하여 부울 논리를 이끌어냅니다. 디지털 컴퓨팅의 수학적 기초.

두 번째 단계는입니다 앨런 튜링상징을 처리 할 수있는 가상 기계의 수학적 모델을 구성한 작업. 튜링 머신에 대한 순진한 설명은 메모리가있는 자동 (상태를 저장하기 위해)가있는 자동화이며, 상태를 나타내는 일련의 기호로 작동하며 한 상태에서 다른 상태로 전환을 정의하는 다른 일련의 기호를 해석합니다.

최신 디지털 프로세서는 Boole의 논리 대수를 기호 및 연산자 기반으로 사용하는 튜링 머신을 구현 한 것입니다 (물건이 어떻게 작동하는지 살펴보십시오. 직장에서 Boole의 논리에 대한 자세한 설명). 그 이유는 True/False 논리 상태를 전기 신호 (+, -)에 쉽게 매핑 할 수 있고 관련 연산자가 이진 입력 (전기 신호)이 주어진 트랜지스터 회로에서 구현 될 수 있기 때문입니다. 부울 운영자. 따라서 모든 최신 컴퓨터는 상태 (이진 전기/자기 형태로 인코딩 됨)와 전기 충동 및 연산자 (프로세서 명령어)를 수용하는 회로 배열을 보관할 수있는 메모리가있는 기계입니다.

따라서 모든 컴퓨터 언어로 작성된 모든 프로그램은 결국 컴파일러 또는 런타임에 의해 프로세서가 실행할 수있는 일련의 부울 작업으로 변환됩니다.

기계 코드는 갈 수있는만큼 낮은 수준이라고 생각합니다. 프로세서에 의해 직접 이해되고 통역사없이 실행됩니다. 프로세서는 주어진 아키텍처 (X86, PPC, ARM 등)의 기계 코드를 정의하는 특정 지침 세트로 구축됩니다.

화면의 문자 그리기부터 PI 계산에 이르기까지 모든 것이 가장 기본 수준에서 기계 코드로 실행됩니다. 화면에 문자를 그리는 것은 문자 높이, 색상 및 픽셀 위치를 계산하고 비디오 출력 장치를 사용하여 화면에 표시하는 일부 기계 코드를 작성하는 문제입니다.

프로세서가 메모리에 어떻게 액세스하는지 알고 있다면 이미 답을 알고 있습니다. 프로세서가 "메모리 매핑 된 IO"또는 "IO 매핑 IO"를 사용하여 메모리 및 기타 하드웨어가 거의 동일한 방식으로 액세스됩니다. 첫 번째 경우, 프로세서는 메모리 주소를 읽고 쓰려고 시도하지만 메모리가 없지만 다른 하드웨어 장치이지만 프로세서는 실제로 차이를 알 수 없습니다. 후자의 경우는 매우 유사합니다.

반면에, 프로세서가 메모리에 어떻게 액세스하는지에 대한 단서가 없다면, "주소 버스"와 "데이터 버스"가 무엇인지 찾아야합니다.

당신은 잘못되고 있습니다.

화면에 문자를 표시하거나 계산을 수행하는 컴퓨터가 수행하는 모든 것은 전류에서 은행 계좌의 돈과 같은 추상 개념의 조작에 이르기까지 다양한 추상화 수준에서 볼 수 있습니다.

즉, 간단한 마이크로 프로세서를 위해 회로를 구축하는 것은 어렵지 않습니다. ALU, 일부 레지스터 및 일부 제어 로직. Altera는 이것을 Cyclone II 스타터 보드의 고급 튜토리얼로 가지고 있지만 웹에서 찾을 수는 없습니다.

여기 진짜 거래가 있습니다. 내 출발점. 모든 것이 작동하려면 에너지가 필요합니다. ON/OFF는 한계 내에서 정의됩니다. 예를 들어 3에서 5 V 사이의 경우 3 볼트 미만인 경우 켜져 있습니다. 모스 코드 개념. 나는 온도계를 연구하고 있으므로 센서를 만들거나 구입해야합니다. 그런 다음 교정해야합니다. 신호에서 신호에서 신호 또는 신호의 강도를 온도로 변환하십시오. 이것은 내가 지금있는 곳입니다.

이것은 한 문장으로 대답하기 쉽지 않습니다. 컴퓨터 아키텍처에 관한 책을 읽고, 어셈블리를 배우십시오. 이런 일이 어떻게되는지 이해할 것입니다.

키를 입력하거나 명령을 내릴 때 키를 누르면 작은 전기파가 기한이되었습니다. 실제로 우리는 회로를 완료합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top