2012-04-02 5 views
4

그래서, 질문은 이상하게 보이지만,이 전 컴파일 가정 해 봅시다 있습니다부팅 가능한 프로그램을 만드는 방법?

int main(void) 
{ 
    int x = 3; 
    int y = 4; 

    int z = x + y; 
} 

는 CPU 실행 단지를 만들 수 있습니까? 방법? 예를 들어, 모니터에 쓸 수 있습니까? (올바르게 기억하면 물건을 써서 표시 할 수있는 장소가 메모리에 있습니다.)

+0

ehh ... 프로그래머블 마이크로/PIC를 사용하지 않는 한 실제로는 그렇지 않습니다. – Anycorn

+3

http://wiki.osdev.org/Main_Page - 전체 책의 주제입니다. – Mat

+0

@Anycorn, 어떻게 오셨습니까? 이렇게하는 방법이 있어야합니다. 그렇지 않으면 아무런 의미가 없습니다! 어쨌든, 나는 많은 것을 읽은 것처럼 보인다 ... – corazza

답변

1

프로그램의 경우 시작하는 것 이외의 운영 체제 서비스에 의존하지 않습니다. 추가로 입력 또는 출력을 수행하는 경우, I/O를 수행하는 데 거의 확실히 운영 체제가 의존합니다.

운영 체제를 자신의 코드로 바꾸려면 잘 할 수 있습니다. 최소 운영 체제 및 프로그램 로더가 존재합니다. 하지만 네, 배워야 할 것이 많습니다.

+0

글쎄, 나는 그것을 알고 있으므로'# include'와'printf' 같은 것을 제외시켰다. 이러한 것들은 분명히 OS와의 관계가 있으며 존경받는 라이브러리와 의존성 없이는 실행되지 않습니다. 나는 가능한 한 간단하게하려고 노력했다. – corazza

+0

@Bane : 간단한 부트 로더 프로그램을 이해하고 수정하는 것으로 시작할 수 있습니다. 파일 시스템을 해석하고 커널을 로딩하는 것과 같은 모든 운영체제를 제거하십시오. 대신 원하는 작업으로 바꿉니다. 많은 부트 로더가 BIOS 호출을 사용하여 화면 I/O를 수행합니다. 다른 드라이버는 텍스트 스크린 드라이버를 구현합니다. – wallyk

2

예, 실행할 수 있습니다. 문제는 없습니다. http://github.com/dwelch67 나는 많은 예제가있다. pcemu 나 pcemu_samples를 사용할 수 있고, x86이 무엇인지 알고 있다면 x86 기반으로 만들 수 있습니다. 프로세서에 대해 신경 쓰지 않는다면, 수많은 시뮬레이터와 임베디드 프로세서/마이크로 컨트롤러를위한 예제가 있습니다. 무슨 일이 일어나고 있는지 쉽게 알 수 있습니다.

printf는 너무 많은 C 라이브러리가 너무 많은 방향, 부동 소수점, 문자열 stuff, division 등등에 도달하는 호출에 관한 것입니다. 이런 종류의 일은 피하십시오. 나는 당신이 의견을 읽지 않고 읽었다는 것을 알고있다.

그래픽 카드의 레지스터를 프로그래밍하고 아무 것도보고하지 않고 디버깅하는 것보다 병렬 포트에서 LED 또는 핀을 깜박이거나 직렬 포트에서 문자를 보내려는 프로그램을 보려면 당신이 진전을 보이면.

이제 x86에서는 OS가 아닌 레이어를 사용합니다. 텍스트 모드에서 화면에 문자를 인쇄하고 프로그램이 실행되도록 간단한 호출을 할 수있는 코드가있는 계층이 있습니다. . pcemu_samples에서 제외 시켰지만 실제 pcemu 및 dosbox 및 기타 x86 에뮬레이션 환경은 물론 실제 컴퓨터에서도 이러한 것들을 사용할 수 있습니다. sim 환경 중 하나 (dosbox, pcemu, etC)는 시작하기에 더 좋은 장소입니다. (x86으로 시작해야한다고 생각한다면 여기에서 주제를 주목하십시오. 실제로 x86으로 시작하는 것이 바람직하지 않습니다). x86을 사용했다면 dosbox 또는 그와 유사한 것으로부터 부팅 한 다음 부팅 가능한 USB 스틱으로 작업하여 아마 거기에서 작업 할 수 있습니다.

임베디드 프로세서에는 $ 50 미만의 평가 보드가 많으며 $ 20 미만의 좋은 평가 보드가 있습니다. 그러나 무료로 배울 수있는 많은 시뮬레이터가 있습니다. 난 당신 thumbnail, amber_samples, pcemu_samples 아마도 가장 안정적인 (내 물건을 디버깅 할 가능성이 적습니다, 주로 귀하의 물건을 디버깅 할), 다음 덜 안정, meecoate, msp430sim, 등 다른 5 달러 시도합니다 시도 할 수 있습니다. 당신 msp430 보드, $ 10 당신에게 ARM 피질 -m3 보드를 얻을 것이다, $ 20 당신이 너무 마이크로 컨트롤러, 마이크로 컨트롤러 보드 (피 텍스 -M4 기반)라고 할 강력한 얻을 것이다. 그리고 더 많은 돈이 당신을 더 빠르게 또는 더 좋게 만들지 만 더 많은 선택을합니다. 리눅스를 실행할 수있는 게시판은 배우려는 대상에 더 많은 고통을 줄 수 있습니다.

간단한 예제는 컴파일러가 생성하는 코드 밖에서는 거의 필요하지 않습니다.이 함수는 리셋 벡터에서 main 함수의 진입 점으로 분기하는 명령이 하나만 필요합니다. 이상적으로 스택을 설정하고 궁극적으로 .bss 또는 .data 등을 복사하려고합니다.임베디드 바이너리를 빌드하는 툴 (컴파일러, 어셈블러, 링커)을 사용하는 것만으로도 리셋과 메인() 사이의 도트를 연결하는 방법을 (분해 할) 보여줄 것입니다. 그걸 메인이라고 부르지 말고, 원하는 이름을 붙일 수 있고, 일부 컴파일러는 메인이라고 부르고 싶다. 바이너리에 여분의 쓰레기를 버릴 것이다.)

0

오랜 이야기 일 뿐이며 조립품 인 에 익숙해야하며 CPU 종류에 맞는 스크래치가 무엇인지 알아야합니다. 일반적으로 x86 시리즈 용 어셈블리는 매우 유명하며 학습을 통해 배울 수 있습니다.

당신은 그런 식으로 어떤 것을 볼 수있을 것입니다 :

Start: 

mov AX ,0xff ;example 1 
mov BX ,[CX] ;example 2 
myString db 'Hi This is my First scratch',0 ;Print Example 
call printFunc ;example 3 
jmp $ 

printFunc: 
mov ah, 0Eh ;This how you print on screen in Assembly 
loop 
lodsb 
cmp AX,BX 
je loop 

등 등 ..... ... .