2008년 7월 25일 금요일

IEEE1394 setting


이 시스템은
서버에서 tftp를 통해 커널 이미지를 가져오고,
nfs를 통해 파일시스템을 가지고와 실행하는 하드 없는 컴퓨터 이다.

부팅은 DOM에서 이루어지며 부팅과정에서 서버에 있는 이미지와 파일 시스템을 받아온다.
이 과정이 이루어지기 위해서는 약간의 환경설정이 필요하다.

우선, tftp와 nfs가 설정되어 있어야 한다.
설정하는 방법은 아래 링크를 참조하면 된다.

tftp설정
nfs설정

IEEE1394의 컴파일이 끝났다면 커널 이미지가 생성되었을 것이다.
커널이미지의 경로는
/opt/TMO-Linux/kernel-2.6.10-TMO/arch/i386/boot/bzImage 이다.
이 파일을 tftpboot로 옮겨둔다.

또한 buildroot컴파일이 끝났다면 파일 시스템이 생성되어 있을 것이다.
파일 시스템의 경로는
/opt/TMO-Linux/buildroot/project_build_i686/uclibc/root/ 이다.
하위에 파일시스템이 생성되어 있는데 하위에 있는 모든것을 nfsroot로 옮겨주어도 되지만, 그것보다는 이 경로를 link를 걸어주는 것이 좋다.

$ ln -s /opt/TMO-Linux/buildroot/project_build_i386/uclibc/root/ nfsroot


처음 client와 server를 연결하고 부팅을 시키면 grub설정을 바꿀 수 있는 창이 뜨는데, 아무것도 하지 않으면 그대로 부팅이 되고 재빨리 'e'를 눌러주면 edit로 넘어가게 된다.
설정을 바꿔 줘야 하는 부분은 ifconfig과 kernel image, file system의 경로, 시리얼 설정 이다.

ifconfig와 kernel항목을 수정하자.

grub edit> ifconfig --address=192.168.1.11 --server-192.168.1.254
grub edit> kernel /bzImage root=/dev/nfs rw nfsroot=192.168.1.254:/tftproot/nfsroot/ ip=192.168.1.11:192.168.1.254:255.255.255.0:tmo:eth0 console=ttyS0, 115200n8 ide1=noprobe ide2=noprobe ide3=noprobe ide4=noprobe ide5=noprobe hdb=none ide-delay=10

저장하고 'b'를 눌러 부팅시켰을 때, 잘 된다면 OK! 안된다면 삽질의 나락으로 떨어지게 된다.


부팅할 때마다 ifconfig와 kernel 항목을 수정하는 것은 매우매우매우-_- 귀찮은 일이므로, boot 설정을 바꾸는 방법을 알아보자.

보드가 부팅되고 난 뒤 다음 명령어를 실행시켜 boot설정을 저장한다.

$ mount /dev/hda1 /mnt
$ vi /mnt/boot/grub/menu.lst
설정을 바꾸고 :wq 하여 저장한 후 빠져나온다.

2008년 7월 21일 월요일

bootloader porting with T32

BOX-X에 redboot을 포팅하는데 2주 걸렸다-_-) 이런, 수박바.

정말.. 끝내주는 삽질이었다-_-;

우선 T32를 이용한 cmm파일은 다음과 같다.
========================================================================================
B::

RESET
SYSTEM.OPTION waitreset.on
SYSTEM.CPU PXA255
SYSTEM.UP

Break.RESET
FLASH.RESET
FLASH.CREATE 0x00000000--0x3fffff 0x20000 I28F001J3 BYTE
FLASH.ERASE ALL
print "erase done"

FLASH.PROGRAM ALL
DATA.LOAD.binary Y:\x-station\u-boot-1.2.0-xstation\u-boot.bin 0x0 /word
FLASH.PROGRAM OFF
ENDDO
===========================================================================================

그리고 삽질끝에 알아낸 memory controller register value!!
보드는 CPU - PXA255에 flash - Inter strata flash 28F128이다.

D.S 0x48000000 %l 0x00000000 ;MDCNFG
D.S 0x48000004 %l 0x03CA4FFF ;MDREFR
D.S 0x48000008 %l 0x7FF07FF0 ;MSC0
D.S 0x4800000C %l 0x7FF07FF0 ;MSC1
D.S 0x48000010 %l 0x7FF07FF0 ;MSC2
D.S 0x48000014 %l 0x00000000 ;MECR
D.S 0x48000018 %l 0x00000000 ;SXLCR
D.S 0x4800001C %l 0x00040004 ;SXCNFG
D.S 0x48000020 %l 0x01FE01FE
D.S 0x48000024 %l 0x00000000 ;SXMRS
D.S 0x48000028 %l 0x00000000 ;MCMEM0
D.S 0x4800002C %l 0x00000000 ;MCMEM1
D.S 0x48000030 %l 0x00000000 ;MCATT0
D.S 0x48000034 %l 0x00000000 ;MCATT1
D.S 0x48000038 %l 0x00000000 ;MCIO0
D.S 0x4800003C %l 0x00000000 ;MCIO1
D.S 0x48000040 %l 0x00220022 ;MDMRS
D.S 0x48000044 %l 0x00000008 ;BOOT_DEF
D.S 0x48000058 %l 0x00000000 ;MDMRSLP

비록 cmm파일에 쓰이지 않았지만, 삽질의 결과다-_ㅠ) 흑흑..

2008년 7월 4일 금요일

redboot올릴 보드#2

IMO보드에 이어서 받은 보드는 타이눅스 BOX-X.

CPU: PXA255(Intel)
SDRAM: MT48LC8M16(Micron)
Flash: Strata E28F128(Intel)


아쉽게도 이 보드를 만든 팜팜테크가 현존하지 못해... 혼자 삽질해가야 겠다.ㅠ
bootloader라도 있어 다행이지만,

현재... flash날라간 상태.

여름 맛집

아이스크림
- 삼청동 북까페내서재, 이대앞 하루에, 신촌 구스띠모

팥빙수
- 이대 빵사이에낀과일, 장충동 태극당, 홍대 인클라우드, 압구정 밀탑, 압구정 미마라, 혜화역 델리

모밀
- 광화문 미진, 우진, 강변 후원쟁반막국수모밀

냉면
- 동대문 평양면옥, 을지로 을지면옥, 종로 곰보냉면

김치말이밥
- 무교동 이북손만두집, 삼성동 눈나무집, 우래옥

한정식
- 수원 고구려

삼계탕
- 시청 장안삼계탕, 서대문 동해별관, 경복궁 토속촌, 명동 백제삼계탕

추어탕
- 강남 원주추어탕, 덕수궁 남도식당, 영등포 남원추어탕, 무교동 용금옥

2008년 4월 28일 월요일

REDBOOT (ver. smdk2410)

 
<< REDBOOT 소스 분석 >>



시스템이 시작되는 곳

arm.ld 소스보기





exception handler 중 reset_vector

vector.S 소스보기





platform마다의 다른 설정(arm9/smdk2410에 맞게 설정)
hardware에 dependent하다.

Hal_platform_setup.h 소스보기





memory management unit 초기화 및 TTB, virtual memory 설정

Smdk2410_misc.c 소스보기

2008년 4월 16일 수요일

프로세스 스케줄링

 


1. 스케줄링

스케줄링의 대상: ready/running상태에 있는 프로세스와 스레드. (kernel process는 스케줄링의 대상이 아님)

스케줄링 queue = ready queue (blocked queue에 있는 것은 스케줄링의 대상이 아님)

스케줄링 = 프로세스를 선택하는 스케줄링 알고리즘 + context_switch(디스패처)

종류: 장/단기 스케줄링, 선점/비선점 스케줄링



2. 스케줄링 알고리즘

­ 시스템의 형태에 따라 기준이 달라진다.

­ 기준의 평균치 최적화와 편차의 최소화를 고려하여 공평하게 해야한다.


선점/비선점 스케줄링

선점 스케줄링: running process로부터 CPU를 뺏을 수 있다. time slice나 priority에 의해서.

ex. Round-robin, Multi-level Queue, Multi-level feedback Queue

비선점 스케줄링: CPU를 빼앗지 못함. time slice가 없고, blocked될 때 CPU를 반환한다.

ex. FCFS(FIFO), SJF, priority algorithm,



3. 비선점 스케줄링

가. FCFS 스케줄링

­ 프로세스 도착순서대로 CPU를 배정한다.

­ 단점: 호위 효과 문제(긴 작업을 수행 하느라 여러 개의 짧은 일이 대기하는 비효율적인 상태)

­ 사용: 장기스케줄러, time slice를 적용하지 않는 시분할 시스템


나. SJF 스케줄링

­ 최단시간이 걸리는 작업에 CPU를 우선적으로 배정한다.(Shortest Job First)

­ 평균대기시간(waiting time)에 있어서 가장 효율적인 알고리즘.

­ 단점: 모든 프로세스의 CPU요구시간을 알기가 어려움, 단기 스케줄링 단계에서 구현하기 어려움

­ 사용: 장기스케줄링을 하는 일괄처리 시스템(작업시간의 제한을 줄 수 있다).


다. 우선순위 알고리즘 스케줄링

­ 각 프로세스 마다 가지고 있는 우선순위를 가지고 우선순위가 가장 높은 프로세스에게 CPU를 할당

­ 우선순위가 같은 경우 FCFS로 처리된다

­ SJF는 우선순위 알고리즘의 특수한 형태이다.

­ 내부적 우선순위: 제한시간, 기억장소 요구량, 사용하는 파일 수, 평균 CPU 버스트, 입출력 시행 비율

­ 외부적 우선순위: 사용료, 정책적인 변수

­ 단점: 기아 발생 (에이징으로 해결할 수 있다)



4. 시분할 시스템의 선점 스케줄링

1) time slice를 소진하여 CPU를 반납하거나 높은 priority의 프로세스에게 CPU를 빼앗긴다.

2) 연산위주 프로세스(CPU bound)/입출력위주 프로세스(I/O bound)에 따라서, 평균 CPU 반환시간(CPU burst)에 따라서, 실시간 프로세스/일반 프로세스에 따라서 동적 우선순위를 가진다.

3) I/O bound process에게 더 높은 우선순위를 주고, 실시간 프로세스에게 더 높은 우선순위를 준다.

4) time slice는 너무 작으면 context_switch overhead가 커지고, 너무 크면 비선점 스케줄링(FCFS)이 될 수 있으므로 평균 CPU 반환시간보다 약간 큰 것이 좋다.

5) non-preemptible kernel의 경우 선점 스케줄링을 사용해도 커널 모드에서는 선점이 일어나지 않는다.


가. Round Robin 스케줄링

­ 실행중인 프로세스가 time slice를 다 쓰면 ready queue의 맨 뒤로 보낸다.

­ time slice를 다 쓰지 않았더라도 I/O 요청을 하면 blocked되고 CPU를 반납한다.

­ 우선순위가 같은 프로세스들끼리의 스케줄링이며 priority가 높은 프로세스는 우선된다.

­ 시분할 시스템을 위해 고안


나. 다단계 Queue 스케줄링

­ 우선순위마다 ready queue를 가지고 있다.

­ 일반적으로 fixed priority를 가지며 같은 level의 queue에서는 RR이나 FCFS를 사용한다.

­ 시스템형, 대화형, 일괄처리 등의 프로세스 성격에 따라 우선순위를 부여한다.


다. 다단계 Feedback Queue 스케줄링

­ fixed priority가 불공평성이 있으므로 kernel이 상황에 따라 priority를 조정한다.

­ time slice를 소진해서 CPU를 반납할 경우 priority를 떨어뜨린다. (CPU bound process)

­ CPU를 많이 사용할수록 priority가 낮아지는 특징이 있다.

­ 너무 오랫동안 CPU를 사용하지 못한 프로세스의 priority를 올려주기도 한다.

­ priority가 낮을수록 CPU를 많이 사용하는 프로세스이므로 경우에 따라서 time slice를 많이 줄 수도 있다.



5. Linux의 스케줄링 정책

가. SCHED_OTHERS (일반 사용자 프로세스)

­ time slice 존재, dynamic priority(kernel이 resource의 효율적 이용을 위해서 임의로 바꿀 수 있다)

­ real_time process는 super user만이 생성할 수 있다.

나. SCHED_RR (Round Robin)

­ time slice 존재. fixed priority(우선순위를 바꾸는 것이 가능하기는 하나 kernel이 임의로 바꾸지는 않음)


다. SCHED_FIFO

­ no time slice, fixed priority

☆ 아무튼 priority가 높은 process에게 CPU를 빼앗긴다 ☆


라. 그 외 특징

­ Linux에서는 blocked된 시간으로 priority를 조정하지만 Unix는 blocked된 이유로 priority를 조정한다.

­ 실시간 프로세스는 매우 높은 priority를 가지며 fixed priority를 가진다. (다단계 queue 스케줄링)

­ 커널 모드 프로세스는 커널에서 blocked되었다가 ready가 되면 resource를 차지하고 있는 것이므로 priority를 높여준다. (빨리 resource의 사용을 끝낼 수 있도록)

­ 사용자 모드 프로세스는 Blocked되었다가 돌아오면 그 동안 CPU를 사용하지 못했으므로더 높은 priority를 가지게 된다.


마. 예) clock interrupt 처리

­ clock interrupt는 slow interrupt이므로 두 단계로 나눠서 처리된다.

­ 그러므로 do_irg()함수를 수행하면 do_timer()함수와 timer_bh()함수를 호출하게 된다.

1) do_timer()함수

­ clock interrupt handler의 irq handler부분으로 interrupt를 disable시키고 동작하며 진짜 해야할 중요한 일들만을 처리

­ jiffy값을 증가시키고 하위처리기가 수행되도록 mask를 set하고 return한다.

2) timer_bh()함수

­ interrupt처리는 끝났지만 softirq 부분 처리가 남았으므로 bottom half 부분을 수행.

­ interrupt enable상태에서 동작.

­ 다른 interrupt나 system call보다는 우선순위가 낮으나, user process보다는 우선순위가 높다.



운영체제 구조

 


1. 커널

메모리에 항상 상주하며 process가 요청하는 일을 빠르게 처리해준다.

private같은 존재로 system call등의 member function을 통해 접근한다.


가. 커널의 기능

1) process(thread) management

2) processor management(scheduling)

3) memory management: process의 공간(text, data, stack, heap)할당 및 회수 (동적메모리도 관리한다)

4) device driver(interrupt handling): power fault > clock interrupt > I/O device

5) IPC: local 및 network와 distributed까지

6) file system

7) system 보안 및 보호


나. 커널의 종류

Monolithic kernel: 한 덩어리 커널. 커널안에서 할 일이 매우 많다.

1) 장점: 시스템 호출에 의한 서비스가 빠르다.

2) 단점: 운영체제 기능 변경 시(device driver 추가 등) 커널 컴파일이 필요. 이식성이 떨어짐.

Micro kernel: 커널에서 아주 필수적인 요소만 뽑아 크기를 줄여 만든 것

1) network, 다양한 IPC, file system, interrupt가 빠졌다. (매우 기본적인 것만 제공) 필요하다면 process로 만들어서 사용할 수 있다.

2) 장점: 다양하게 사용가능(확장성, 재구성 용이), 임베디드 시스템에 많이 사용, size가 작다, 메시지 전달만을 한다.

3) 단점: process가 많아지면 단지 function을 호출하는 monolithic커널과 달리 메시지 전달이 많아지므로 느리다.



2. 프로세스

현재 실행되고 있는 프로그램을 말한다.

각 프로세스는 상태와 context를 가진다.


가. 프로세스의 상태

1) Ready: CPU를 할당받기를 기다리고 있는 상태, 언제든 수행될 준비가 되어있다.

2) Blocked: request 혹은 원하는 event가 끝날 때까지 기다리고 있는 상태.

3) Running: CPU를 할당받아 현재 수행되고 있는 상태.

4) 상태전이: ready상태에 있던 프로세스가 scheduling을 받으면 cpu를 할당받아 수행하며 running상태로 바뀐다. running상태의 프로세스는 time slice를 모두 소진하면 ready상태로 다시 넘어가며, 수행 중에 I/O 요청이 들어오거나 어떤 event나 메시지를 기다려야 한다면 cpu를 넘기고 blocked상태로 간다. blocked상태에 있는 프로세스는 I/O작업이 끝나거나 기다리던 event가 발생하면 ready상태로 가서 다시 scheduling받기를 기다린다.


나. 프로세스 관리: 모든 프로세스는 PCB를 가지고 있다. (pid, uid, file info, priority, state, memory info, context 등을 저장하고 있음)


다. 프로세스 문맥(context)

1) user-level: text, data, stack영역

2) system-level: PC를 포함한 각종 register, resource사용정보, process관리정보

3) context switch

- CPU를 할당받거나 반납할 때, CPU가 다른 프로세스에게 할당되게 되는데, 이전에 수행시키던 프로세스의 context를 보존하고 새로 실행될 프로세스의 context를 활성화 시키는 것.

- 이전에 context_switch가 일어났던 곳에서 재개된다.

☆ Process는 kernel에서 죽고 kernel에서 살아난다. ☆


라. 프로세스 관리: ready queue와 block queue 안에서 관리된다.



3. 인터럽트 처리(interrupt handler)

가. Disk Interrupt Handler

1) 주요기능: 입출력이 완료된 프로세스를 ready상태로 만들어 ready queue로 옮기고 다음 입출력 요청을 수행하도록 시킨다.

2) handling과정: 이전에 수행 중이던 프로세스의 문맥을 저장하고 interrupt mask를 세팅한 후, I/O queue의 맨 첫 번째에 들어있는 block을 꺼내고, blocked queue에 들어있는 PCB를 가져와서 ready상태로 바꾸어주고 ready queue에 넣는다. 만약에 I/O queue에 요청이 남았다면 입출력을 시킨다.


나. Clock Interrupt Handler

1) 주요기능: 시간에 관련된 서비스 제공, 주기적인 system의 일, time slice 업데이트, system 시간 유지

2) handling과정: system time을 업데이트하고 timeout함수를 호출하고, 깨워줄 process가 있다면 그 process를 깨워준다. time slice가 다 되었다면 scheduling flag를 세팅해두고 후에 interrupt handling을 끝내고 빠져나올 때 flag를 검사해서 scheduling이 필요하다면 context_switch를 호출한다.


☆ Interrupt Handling 도중에는context_switch는 없다 ☆

→ kernel mode에서는 time slice에 의해 수행이 중단되지 않으며 스스로 cpu를 반납하기 전에는 context_switch가 없다. 그러나 real time process가 생길수도 있으므로 2.6버전부터 preemptible kernel이 생겼다.



출처: 운영체제개념 발췌