NASM - 2

Programming/OS Development 2009. 6. 29. 17:03
11. jc
    -> jc read : 에러가 나면 다시 read로 가서 수행.
                     CF bit의 Set 여부 체크. Set 되어 있을 경우 Read 로 점프 하여 다시 디스크를 읽는다.

12. call
      -> call printf : printf 함수 호출

13. xor
     -> xor ax, ax : 같은걸 xor하면 0으로 만들어짐.  다르면 1, 같으면 0 으로 셋팅.
 
14. or
     -> or  :  같은 것을 or하면 같은 값 나옴.
 
15. ret
     -> 함수 호출 한 부분으로 돌아가기. Stack의 최상위 부분의 return 값으로 돌아간다.
     iret ( Interrupt return ) 16-bit operand size / iretd : 32-bit / iretq : 64-bit
     -> 예외나 인터럽트 핸들러 로 부터 복귀 할 때 사용하는 명령어. or nested task 로 부터 돌아오는 명령어( call 명령어에 의해 nested task 발생 - Task Switching 시에 NT 비트가 1로 Set )

16. lea
     -> lea esi, [msgKernel] : msgKernel 문자열이 있는 곳의 주소를 구한다.

17. cli <-> sti
     -> EFLAGS Register 의 IF( interrupt flag ) 비트를 0으로 clear
     -> sti : IF 비트를 1로 set. Interrupt 활성화.
 
18. cld
     -> EFLAGS Register 의 DF( direction flag ) 비트를 0으로 clear

19. lgdt
     -> gdtr 포인터에 따라 GDT를 등록시키는 명령어

20. rep movsb
     -> DS : ESI -> ES : EDI 방향으로 cx 값 만큼 복사 수행. cx 8이면 8byte.
         Move (E)CX bytes from DS:[(E)SI] to ES:[(E)DI].
     rep stosd
     -> Fill (E)CX doublewords at ES:[(E)DI] with EAX.
 

'Programming > OS Development' 카테고리의 다른 글

RGB 색상 코드 표  (2) 2009.07.19
NASM - 3  (0) 2009.06.29
VGA 관련  (0) 2009.06.19
하드 디스크 드라이버 ( Hard Disk Driver )  (0) 2009.05.29
OS 제작의 원리 그리고 Codes - Ch 6. Memory Management  (1) 2009.05.19

설정

트랙백

댓글

VGA 관련

Programming/OS Development 2009. 6. 19. 22:59
VGA를 사용을 위한 각 비디오 포트 설명 문서

VESA 2.0 Specification

VESA BIOS Extendsion 3.0 문서
256-Color VGA Programming in C 
 

'Programming > OS Development' 카테고리의 다른 글

NASM - 3  (0) 2009.06.29
NASM - 2  (0) 2009.06.29
하드 디스크 드라이버 ( Hard Disk Driver )  (0) 2009.05.29
OS 제작의 원리 그리고 Codes - Ch 6. Memory Management  (1) 2009.05.19
메모리 주소별 용량.  (0) 2009.05.15

설정

트랙백

댓글

하드 디스크 드라이버 ( Hard Disk Driver )

Programming/OS Development 2009. 5. 29. 23:38
Hard Disk Driver is the program to control Hard Disk.



As the upper picture, Hard Disk is consist of "Platter". Platters' circle is called "Track". The invariable part of Track is called Sector. This is the smallest unit of Writting in Disk which is usually 512 Bytes.
There are two modes to access Hard Disk. The first one is called "CSH Mode", the another one is called "LBA Mode( Logical Block Address )".
The former one has the limitation of capacity( 528 MB ). Controlling Hard Disk using Sector 6-bit, Head 4-bit, Track 10-bit and one sector is 512-byte. Therefore, The max capacity which is capable of being controlled is 528MB( = 2^20 * 512-byte ). But the latter one is not. It sees Hard Disk as a group of linear sector. it could be controlled as long as knowing the total number of sector of Hard Disk.

'Programming > OS Development' 카테고리의 다른 글

NASM - 2  (0) 2009.06.29
VGA 관련  (0) 2009.06.19
OS 제작의 원리 그리고 Codes - Ch 6. Memory Management  (1) 2009.05.19
메모리 주소별 용량.  (0) 2009.05.15
어셈블러에서 16진수 입력  (0) 2009.05.15

설정

트랙백

댓글

OS 제작의 원리 그리고 Codes - Ch 6. Memory Management

Programming/OS Development 2009. 5. 19. 02:29

To calculate the size of physical memory

We could calculate in a simple way to check data. Writting data from the certain address then read it. Comparing that two data. If it's the same, there is memory. If not, there is no memory.
 

 // 실메모리의 크기를 구한다.
int nGetPhysMemSize()
{
 int  nI, nSize;
 UCHAR *pX, byTe;;

 // 실메모리의 크기를 구한다.
    
 // 메모리는 512메가부터 2기가 바이트까지 뒤진다.
 for( nSize = nI = 512; nI < 2048; nI++ )
 {
  pX = (UCHAR*)( nI * (ULONG)0x100000 );  //  nl * 1MB
  

  byTe = pX[0];         // The start address of the memory.
  byTe++;                 // Increasing the value of the start address.
  pX[0] = byTe;        // Writting the value on the start address.
  if( byTe != pX[0] )  // Comparing between the increased data and the value of the start address.
   break;                  // If it's not the same, there is no memory on that address.
  else
   nSize++;              // If it's the same, there is memory. Keep calculating.
        
        pX[0] -= 1;     // Restoring to the previous value
 }

 return( nSize * 0x100000 );  // 바이트 단위로 리턴한다.
}



Physical Memory Management Table

Assigning 1byte to save the status of physical memory. It's like Reference Counter.
When it's zero, it's not used and is available. When it's five, five processors are using it by mapping.

Each page has 1024 entries, which is 4 byte. It means 4 KB allocate to each page.
There are 256 pages In 1 MB Memory. That's why needing 256 byte per 1MB.

To save the counter for 1024MB Memory, 1024 * 256 bytes ( 256 KB ) are required.
Putting P.M.M.T right after kernel image. But, it is no matter where you put P.M.M.T.

Caution ) There is the space for ROM BIOS on 0xF0000. You must not write any data on that.

// allocate one physical page
 DWORD dwAllocPhysPage()
{
 int  nI;
 UCHAR *pTbl;

 pTbl = bell.pPhysRefTbl; // Physical Memory Management Table

 // search after 64K
 for( nI = 16; nI < bell.nPhysRefSize; nI++ )
 {
  // if the address is video memory then next search is started at 1.5M( = 0x180000 ) area
  if( nI == ( (int)0xA0000 / 4096 ) ) // Skipping the space of ROM BIOS.
   nI = ( (int)0x180000 / 4096 );

  if( pTbl[nI] == 0 )
  {
   pTbl[nI]++;  // increase counter
   return( (DWORD)( (DWORD)nI * (DWORD)4096 ) );
  }
 }
 return( 0 ); // allocation failed
}


 int nFreePage( DWORD dwPhysAddr )
{
 DWORD dwI;
 UCHAR *pTbl;

 dwI = (DWORD)( dwPhysAddr / (DWORD)4096 );

 pTbl = bell.pPhysRefTbl;
 if( pTbl[dwI] == 0 )
  return( -1 );   // 할당되지 않은 메모리이다.

 pTbl[dwI]--;  // Decreasing the counter value with 1

 return( 1 );
}


'Programming > OS Development' 카테고리의 다른 글

VGA 관련  (0) 2009.06.19
하드 디스크 드라이버 ( Hard Disk Driver )  (0) 2009.05.29
메모리 주소별 용량.  (0) 2009.05.15
어셈블러에서 16진수 입력  (0) 2009.05.15
naked 함수  (0) 2009.05.11

설정

트랙백

댓글

메모리 주소별 용량.

Programming/OS Development 2009. 5. 15. 03:30
0x100 -> 16 * 16 = 256 byte
0x200 -> 16 * 16 * 2 = 512 byte
0x1000 -> 16 * 16 * 16 = 4 KB
0x10000 -> 64 KB
0x100000 -> 1 MB

'Programming > OS Development' 카테고리의 다른 글

하드 디스크 드라이버 ( Hard Disk Driver )  (0) 2009.05.29
OS 제작의 원리 그리고 Codes - Ch 6. Memory Management  (1) 2009.05.19
어셈블러에서 16진수 입력  (0) 2009.05.15
naked 함수  (0) 2009.05.11
Stack Frame  (0) 2009.05.11

설정

트랙백

댓글

어셈블러에서 16진수 입력

Programming/OS Development 2009. 5. 15. 02:01
0Eh or 0EH, 0201H, 0AA55H.

여기서 h 는 16진수를 표시하기 위한 것으로 소/대 문자 어떤 것을 사용해도 됩니다.
그리고 앞에 붙는 0은 그 다음 나오는 것이 문자( A, B,C, D, E)일 경우에는 사용해야 하지만
숫자일 경우에는 0을 항상 붙일 필요가 없습니다.

'Programming > OS Development' 카테고리의 다른 글

OS 제작의 원리 그리고 Codes - Ch 6. Memory Management  (1) 2009.05.19
메모리 주소별 용량.  (0) 2009.05.15
naked 함수  (0) 2009.05.11
Stack Frame  (0) 2009.05.11
NASM - 1  (0) 2009.03.11

설정

트랙백

댓글

naked 함수

Programming/OS Development 2009. 5. 11. 03:06
__naked 호출 규약은 컴파일러가 접두, 접미를 작성하지 않는 호출 규약이다.
스택 프레임의 상태 보존을 위해 컴파일러가 어떤 코드도 작성하지 않으므로 접두, 접미는 사용자가 직접 작성해야 한다. C에서는 inline 어셈블리를 사용해야 한다.
함수 정의부에 __declspec(naked) 를 적어주면 naked 호출 규약을 사용 할 수 있다.

'Programming > OS Development' 카테고리의 다른 글

메모리 주소별 용량.  (0) 2009.05.15
어셈블러에서 16진수 입력  (0) 2009.05.15
Stack Frame  (0) 2009.05.11
NASM - 1  (0) 2009.03.11
Segmant and Offset  (0) 2009.03.08

설정

트랙백

댓글

Stack Frame

Programming/OS Development 2009. 5. 11. 02:59
스택 프레임 : 스택에 저장되는 함수의 호출 정보


 int Add( int a, int b )
{
   int c,d,e;
   c = a + b;
   return c;
}

void main()
{
   int result;
   result = Add( 1, 2 );
   printf("result= %d\n", result );
}

Add 함수에서 중단점을 설정 한 후 View/ Debug Window/ Disassembly 를 선택하면 Assem 코드를 볼 수 있다.



함수를 호출 할 때 ebp 를 먼저 스택에 push 한 뒤에 함수내에서 필요한 정보들을 push 한다.
esp는 함수의 변수와 인자들을 가리키기 위한 기준 번지로써 esp가 바뀌더라도 ebp는 변하지 않는다.
Add 함수의 수행을 마칠 때, 남은 정리 작업을 수행하는 코드를 접미( epilog ) 라고 하는데 이 함수의 경우 다음의 세줄 이다.

mov esp, ebp ; 지역변수를 위해 할당했던 스택 영역을 회수 한다는 뜻.
pop ebp
ret                 ; 스택에 저장된 복귀 번지를 꺼내서 그 번지로 리턴한다.

함수가 연속적으로 두번 호출될 때 는 다음과 같다.
void Dog( int v )
{
   int n, m;
   n = Add( 1, 2 );
   ...
}


위의 그림과 같이 각 함수의 스택 프레임이 저장 된다.
main 스택 프레임 위에 Dog 스택 프레임이 올라가고 그 위에 Add의 스택프레임이 올라가게 된다.
Dog 스택프레임은 먼저 인자 값인 v가 들어가고 난 뒤 복귀 번지, 그리고 ebp, 지역변수들 이 들어가고,
Add 함수의 경우도 마찬가지이다.

자세한 내용을 알고 싶으면 Winapi 사이트를 방문하기 바랍니다. 이 글은 Winapi 에서 발췌한 글입니다.

'Programming > OS Development' 카테고리의 다른 글

어셈블러에서 16진수 입력  (0) 2009.05.15
naked 함수  (0) 2009.05.11
NASM - 1  (0) 2009.03.11
Segmant and Offset  (0) 2009.03.08
Real Mode, Protected Mode  (0) 2009.03.08

설정

트랙백

댓글

NASM - 1

Programming/OS Development 2009. 3. 11. 23:10
1. mov
    -> mov di, 0  :  di 에 0을 넣어라.
    -> [label], ax : label 의 부분에 ax값을 넣어라.

2. add
    -> add di, 2  :  di 에 2를 더하라.

3. jnz
   ->  jnz paint : ZF가 ON이면 다음 줄로, OFF 이면 Paint 로 점프
                       cx 레지스터 - 화면 전체에 그릴때 값을 저장하는 레지스터(?)
cx 레지스터 가 0이 되면 CPU의 Flag Register에 있는 Zero Flag가 ON이 된다.

4. byte[ : ]
   -> byte형의 포인터. ex) mov byte[ es : edi ], 0x06    : es : edi 에 byte만큼 써라. es : edi에서 byte만 
       큼의 문자

5. inc / dec
    -> inc edi : edi 를 1 증가 / dec edi : edi 를 1 감소

6. jmp
    -> 특정 위치로 Jump. $ : 현재 행의 주소값.( 현재 줄 )

7. db
    -> db 0x40 : 1byte 를 0x40 으로 쓰기.

8. dw
    -> dw 0xFFFF : 2byte 를 0xFFFF 로 쓰기

9. dd
    ->  dd 0xFFFFFFFF : 4byte 쓰기.

10. int
    -> int 0x13 : interupt를 걸어서 BIOS 에 있는 프로그램을 실행하는 BIOS CALL 명령어.
                      0x13 은 어느 섹터부터 몇 개의 섹터를 읽어라는 뜻.

'Programming > OS Development' 카테고리의 다른 글

naked 함수  (0) 2009.05.11
Stack Frame  (0) 2009.05.11
Segmant and Offset  (0) 2009.03.08
Real Mode, Protected Mode  (0) 2009.03.08
1. 부트스트랩  (0) 2009.03.08

설정

트랙백

댓글

Segmant and Offset

Programming/OS Development 2009. 3. 8. 01:14
Physical Address - 0x07C00
Logical Address - 0x07c0:0000

When you change from physical address to logical address, you add zero to 16 antilogarithm ( = shift towards left for four times ) then add offset.

0x07C0:0000 Calculation
0x7C00 + 0x0000 = 0x7C00 = 0x07C00

0x2004:0101 Calculation
0x20040 + 0x0101 = 0x20141

'Programming > OS Development' 카테고리의 다른 글

naked 함수  (0) 2009.05.11
Stack Frame  (0) 2009.05.11
NASM - 1  (0) 2009.03.11
Real Mode, Protected Mode  (0) 2009.03.08
1. 부트스트랩  (0) 2009.03.08

설정

트랙백

댓글