일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- AI
- programmers
- leg
- Python
- Softmax classification
- tensorflow
- pwnable.kr
- Linear_regression
- Algorithm
- 인공지능
- logistic regression
- 텐서플로
- 기능개발
- Today
- Total
목록OS (8)
나혼자 공부장

이전에 작성했던 int_ignore() 함수를 구현할 것이다. 전 회차에서 말했듯 int_ignore() 는 말 그대로 무시할 수 있는 인터럽트들이 가리키는 함수이다. 256 개의 IDT 테이블을 하나하나 전부 다르게 하기에는 무리가 있으므로 당장은 이 함수를 쓴다. void idt_ignore() { __asm__ __volatile__ ( "push gs;" "push fs;" "push es;" "push ds;" "pushad;" "pushfd;" "mov al, 0x20;" //PIC 하드웨어 재세팅 "out 0x20, al;" ); kprintf("idt_ignore", 5, 40); __asm__ __volatile__ ( "popfd;" "popad;" "pop ds;" "pop es;" ..

이제 C언어로 개발할 수 있는 환경을 구축했으니, C언어로 함수도 만들 수 있다. 이번 목적은 kprintf 라는 함수를 만드는 것으로, printf 와 유사한 기능을 한다. //function.h #pragma once void kprintf(char*, int, int); // str : 출력할 스트링 주소, int : 몇번째 줄에 출력, int : 몇번째 행에 출력 //function.c void kprintf(char* str, int line, int col) // str 글자를 line 번째 줄의 col번째에 출력하는 함수 { char *video = (char*)(0xB8000 + 160 * line + col); for (int i = 0; str[i] != 0; i++) { *video+..

CC = gcc final.img : Boot.img Sector2.img disk.img cat Boot.img Sector2.img disk.img > final.img disk.img : main.img objcopy -O binary main.img disk.img main.img :main.o ld -melf_i386 -Ttext 0x10200 -nostdlib main.o -o main.img main.o : main.c gcc -c -m32 -ffreestanding main.c -o main.o Boot.img : Boot.asm nasm -f bin -o Boot.img Boot.asm Sector2.img : Sector2.asm nasm -f bin -o Sector2.img Sect..

비디오 세그먼트 5번째 줄에 HelloWorld를 삽입하는 코드이다. main.o 파일을 가공해서 main.img 파일로 만든다. 현재까지 OS의 동작 상태는 Boot.asm -> Sector2.asm(섹터2) 로 점프한다. 이제 Boot.asm -> Sector2.asm(섹터1) -> main.asm(섹터2) 으로 흘러가는 방향으로 만들 것이다. 위 명령문에서 main.o 파일을 0x10200 파일에 적재하겠다고 알린다. 그 이유는 한 섹터 당 크기가 0x200 인데, Sector2.asm 의 동작이 끝났을 지점인 0x10200에 main.asm을 적재하면, 현재까지의 동작이 끝날 시 main 섹터로 점프하게 된다 main.img에서 필요한 부분만 추출

리얼모드에 비해서 오백배는 어려운거 같은 보호모드를 구축해보자. 1. 보호모드란? 사용자가 OS의 메모리 공간을 막 다룰 수 있는 리얼모드(16bit)와는 다르게 자체적으로 메모리 보호 기능을 가지고 있는 모드(32bit) 현재 상용화된 대부분의 OS가 보호모드에 해당됨 왜 굳이 보호모드를 사용해야 하는가? 리얼 모드는 램의 물리주소를 1MB 까지 밖에 사용할 수 없음. -> 하이메모리는 커녕 로우메모리도 못 채우겠다. 사용자가 OS 영역을 침범하는게 불가능하니까 민감한 데이터를 건드릴 수 없으므로, 훨씬 안정성 있다. 복잡했던 리얼 모드의 세그먼트:오프셋 계산 방식에서 탈피할 수 있다(세그먼트:오프셋을 안 쓴다는게 아님) -> 프로그래머가 세그먼트 시작 주소 지정 가능 EAX, EBX ... 와 같은 ..
리얼 모드 : 리얼 어드레스 모드 : 프로그래머가 가리키고 싶은 메모리가 OS의 영역일지라도 사용 가능 -> 메모리 보호가 전혀 되고 있지 않음 : 80286 이전에 x86 호환 CPU 운영 방식으로, 호환 모드라고도 부른다. 리얼 모드만의 세그먼트:오프셋 계산법 세그먼트 뒷자리에 0을 붙이고 오프셋을 더함 0x480:4 면 나타내고자 하는 메모리 주소는 0x4800+4 = 0x48004가 되겠다. -> 16비트 환경에서 20비트로 물리주소에 매핑된다. 그러나 16비트인 리얼 모드는 보안적으로 문제가 많다. 따라서 현재 OS에는 보호 모드 (protected mode)가 필수적이다.
어셈블리에서는 INT 21H를 사용하여 DOS의 내부 함수를 호출할 수 있다. : DOS Function Call INT 21H는 AH 레지스터 값에 의해 무슨 함수를 불러올지 판단한다. AH 설명 0 프로그램 종료 01 한 문자 입력받고 한 문자 출력 AL 레지스터로 8비트 문자 리턴 02 한 문자 출력, DL 레지스터로 8비트 문자 리턴 03 보조 장치에서 한 문자 읽음, AL 레지스터로 리턴 04 보조 장치에 한 문자 출력, DL 레지스터에 저장 05 프린터로 한 문자 출력, DL 레지스터에 저장 06 콘솔장치에 문자 입출력 입력 - DL 레지스터, 출력 - AL 레지스터 07 한 문자 입력, AL 레지스터로 리턴 ( 브레이크 감지 x ) 08 위와 동일 ( 브레이크 감지 o ) 09 문자열 출력 ..
1. 레지스터(Register) CPU가 요청을 처리하는데 데이터를 일시적으로 저장하는 기억 장치 CPU 단독만으로는 데이터를 메모리에 저장할 방법이 없기 때문에 연산을 위해서는 반드시 레지스터를 거쳐야한다. Bit - 0과 1로 구분되는 데이터가 처리할 수 있는 가장 작은 단위 Byte - 1 Byte (8 Bit). - 0~255 (0xFF) 까지 표현 가능 - ex register) AL, AH, BL, BH, CL, CH, DL, DH Word - 2개의 Byte를 하나로 표현한 것 : 총 16 Bit - 0xFFFF (65535) 까지 표현 가능 - ex register) AX, BX, CX, DX, SI, DI, SP, BP, IP DWORD (Double Word) - Word 2개를 하나로..