목록OS (10)
y0u_bat
[OS-6] OS 이미지 로딩 플로피 디스크 읽는 방법 섹터 = 1, 헤드 = 0, 트랙 = 0 섹터를 1에서 18까지 증가시키면서 읽음 섹터 18번까지 다 읽었으면 0번 헤드를 다 읽었으면 헤드 1증가 헤드 = 1, 섹터 = 1로 변경 섹터 1에서 18번까지 증가하면서 읽음 섹터 18번까지 다 읽으면 0번과 1번 헤드를 모두 읽었으므로, 트랙 1 증가 2번에서 5번과정을 79번 트랙까지 반복 최종 부트로더 소스코드 [ORG 0x00] [BITS 16] SECTION .text jmp 0x07C0:START total_sector_count: dw 1024 START: mov ax,0x07C0 mov ds,ax mov ax,0xB800 mov es,ax mov ax,0x0000 mov ss,ax mov ..
OS-4 운영모드와 메모리 관리 기법 x86와 x86-64 프로세스에서 지원하는 메모리 관리 기법은 크게 2가지이다. 세그먼테이션(Segmentation) 페이징(Paging) 둘다 모두 메모리를 나누는 것이고 차이점은 세그먼테이션은 원하는크기로 짤라 쓰는 방식이고, 페이징 같은경우에는 정해진 크기로 짤라져 있는 조각을 모아 원하는 크기로 관리하는 방식이다. 세그먼테이션은 세그먼트의 시작주소 or 디스크립터라고 불리는 자료구조의 위치를 설정 해야된다. 페이징은 CR3 레지스터에 페이지 디렉터리라 불리는 자료구조의 물리주소를 설정해야지 사용 가능하다. 리얼 모드의 메모리 관리 방식 최대 1MB까지 주소공간을 사용하며, 세그먼테이션만 지원한다. 세그먼트 크기는 64k로 고정이며, 세그먼트 시작 주소는 코드나..
OS-3 레지스터 레지스터 종류 AX,BX,CX,DX,SI,DI,SP,BP,R8~R15 - 범용 레지스터 CS,DS,ES,FS,GS - 세그먼트 레지스터 CR0,CR1,CR2,CR3,CR4 - 컨트롤 레지스터 범용 레지스터 역할 AX - 산술 연산을 수행할때 누산기로 사용 BX - 데이터의 어드레스를 지정할때 데이터 포인터로 사용 CX - 루프문 or 문자열 카운터로 사용 DX - I/O 어드레스를 지정할때 사용, 산술연산을 수행할때 보조 레지스터로 사용 SI - 문자열에 관련된 작업을 수행할때 원본 문자열의 인덱스로 사용 DI - 문자열에 관련된 작업을 수행할때 목적지 문자열의 인덱스로 사용 SP - 스택의 포인터로 사용 BP - 스택의 데이터에 접근할때 데이터의 포인터로 사용 R8~R15 - x86-..
OS-2 운영모드 운영모드 5가지 운영모드가 존재한다. 운영모드의 종류 리얼모드 - 프로세스 초기상태(전원/리셋)이고 16비트로 동작하며 8086프로세스와 호환 되는 모드이며 최대 1m의 주소공간을 지원한다 보호모드 - 32비트 모드로 동작하며 세그먼트,페이징,멀티태스킹 등의 기능 제공되고 4GB의 주소공간을 지원한다 IA-32e모드 - 32비트 호환모드와 64비트 모드의 두가지 서브모드로 구성되며, 16EB의 주소공간을 지원한다. 시스템 관리 모드 - 전원 관리나 하드웨어 제어 같은 특수 기능을 제공한다. 가상 8086 모드 - 보호모드 내부에서 가상의 환경을 설정하여 리얼 모드처럼 동작한다. 운영모드의 전환 전원/리셋 -> 프로세스는 리얼모드 진입 리얼모드 -> 보호모드 (cr0의 PE비트를 1로 설..
Mac OSX에서 환경구축 명령어 라인 개발자 도구 설치 Cross-compiler를 build하기 위해 Native Compiler가 필요하다. OSX 10.8 Mountain Lion부터는 추가 설치가 필요하다. $xcode-select --install Cross-compiler Build $export TARGET=x86_64-pc-linux $export PREFIX=/opt/cross (설치경로) Home Directory의 .bash_profile or .bashrc 파일을 편집하여, Cross-compiler directory를 PATH 환경변수에 추가한다. GNU Binutils Bulid OS X의 Mach-O형식을 지원하지 않기 때문에 Port를 이용해 설치하는 경우 as ld 등 명..
부트로더의 시작주소 : 0x7c00 부트로더의 글씨를 띄울려면 비디오 메모리에 써야됩니다. 0xB8000이 텍스트 출력용 메모리 입니다. 소스 [ORG 0x7c00][BITS 16] SECTION .text mov ax, 0xB800mov es, ax mov ah, 0x09mov al, 'O'mov [es:0x00], axmov al, 'S'mov [es:0x02], ax 0xB8000에서 한글자는 2바이트로 이루어져 있습니다. 2바이트에서 앞에 첫1바이트는 글자, 2번째 바이트는 글자속성(배경,글 색깔 등) 결과 화면이 더럽죠. 우리가 지정한 글씨만 나오도록 나머지 글씨를 0x00로 지워 줍시다. 부트로더에서 가로 80 세로 25 이다 그런데 속성까지해서 80 * 25 * 2 == 4000 byte 0..
기본 소스 [ORG 0x00] ; 코드의 시작 주소[BITS 16] ; 아래 코드를 16비트 코드로 설정 SECTION .text ; text 섹션 ( 세그먼트 ) 정의 jmp $ ; 현재 위치에서 무한루프 실행 $가 현재주소 times 510 - ( $ - $$ ) db 0x00 ; $$: 현재 섹션(.text)의 시작주소; 510 - ( $ - $$ ): 현재부터 주소 510까지; db 0x00 1바이트 선언하고 값은 0x00; time: 반복수행; 현재 위치에서 510까지 0으로 채움 dw 0xaa55 ; 주소 511,512에 0x55, 0xaa를 써서 부트 섹터로 표기 makefile all: BootLoader.bin BootLoader.bin: BootLoader.asmnasm -o BootL..
메모리 관리 기법 - 세그먼테이션, 페이징 세그먼테이션,페이징의 공통점 - 주소 공간을 특정 영역으로 나눔 리얼모드의 메모리관리방식- 최대 1mb 주소공간 사용, 세그먼테이션만 지원- 세그먼트 크기는 64kb 고정- 세그먼테이션에서 세그먼트의 시작주소는 코드나 메모리 접근할대 기준 Base address로 사용 리얼모드에서 물리주소 계산- 세그먼트 레지스터의 값에 16(0x10)을 곱한값을 세그먼트의 기준 주소로 사용 -> 1mb영역 까지 사용가능 보호모드에서 주소계산방법- 리얼모드에서 물리주소 계산과 동일 하지만 결과는 선형주소, 선형주소를 기반으로 물리주소 계산- 리얼모드와 달리 세그먼트 크기를 지정 가능, 세그먼트 크기는 해당 세그먼트의 어드레스에 접근할때 참조, 기준주소에 더해질값(범용레지스터값)..
레지스터 - 범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 3가지 64비트 경우범용 세그먼트 컨트롤RAX CS CR0RBX DS CR1RCX ES CR2RDX FS CR3RSI GS CR4RDIRSPRBPR8~R15 AX - 산술 연산을 수해할때 누산기로 사용BX - 데이터의 어드레스를 지정할때 데이터 포인터로 사용CX - 반복문 또는 문자열의 카운터로 사용DX - I/O 어드레스를 지정할때 사용하며, 산술연살을 수행할대보조 레지스터로 사용 세그먼트 레지스터 역할CS - 코드영역 가르킴 - 데이터 이동명령으로 값변경 불가능, 점프명령이나 인터럽트 관련 명령으로 변겨가능DS - 데이터 영역 가르킴 - 데이터 이동명령으로 값 변경 가능 - 데이터 영역에 접근할때 임시적으로 사용 ES - 문자열과 관련된..
정의: 컴퓨터 프로그래밍에서 파일 디스크럽터란 파일에 접근하기 위해 추상화 시켜놓은 장치를 이야기함윈도우의 핸들과 파일 디스크럽터는 같은 의미 이다. 리눅스는 모든장치를 파일로 관리하기 때문에 파일디스크럽터를 이용해 장치에 접근 할 수 있게된다.일반파일뿐만 아니라 외부장치도 파일로 취급한다. 커널은 프로세스 단위로 열린 파일 목록을 담아 둘 수 있는 테이블을 관리하는데, 파일 디스크럽터가 이테이블에 등록되어 관리되고 있음 테이블에 새로운 디스크럽터를 등록하게 되면 파일디스크럽터는 0부터 순차적으로 1만큼 자동으로 등록됨 기본적으로 파일 디스크럽터는 0,1,2 번호는 이미 예약되어 있는 번호이다. -1 -> 오류0 -> stdin(표준입력) : 키보드1 -> stdout(표준출력) : 모니터2 -> std..