psp에 관한 정보가 아직은 많이 알려지지 않아서

좀 공부하기 힘든[?] 처지에 있음 OTL

어쨌든 각 사이트들과 samples 를 이용, 그리고 조합하고 수정해서 얻은결과[..]

그러니까 테스트좀[?]


스샷 :

사용자 삽입 이미지
  출처 : 세이빈 <슈ㅣ발 만든건난데 왜 출처를 쟤한테붙혀야되는거지 흫ㄱㅎ흑ㅠㅠ?>




 

,

컴퓨터도 샀겠다 리눅스도 깔아야지..라고 생각했지만 귀찮아서 못내 아쉬워하던차에

윈도우에서도 PSP 홈브류 개발가능 소식을 듣고 바로 깔았음[?]

일단 한시간만에 PSP화면에 문구 넣기 성공 + 정상종료까지 개발완료 ㅇㅇ

아 거기에 VC08에 연동시키는거까지 성공ㅇㅇ

슈ㅣ발 셉좀 좀기다려주지 흫긓ㄱ ㅠㅠ



아래는 코드..


#include <pspkernel.h>
#include <pspdebug.h>
#define out pspDebugScreenPrintf
//모듈정보 정의
PSP_MODULE_INFO("template", 0, 1, 1);
// 메인 스레드
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

//종료 콜백함수
int exit_callback(int arg1, int arg2, void *common)
{
  sceKernelExitGame();
  return 0;
}

//콜백 스레드
int CallbackThread(SceSize args, void *argp)
{
  int cbid;
  cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
  sceKernelRegisterExitCallback(cbid);
  sceKernelSleepThreadCB();
  return 0;
}

//콜백 설정
int SetupCallbacks(void)
{
  int thid = 0;
  thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, THREAD_ATTR_USER, 0);
  if(thid >= 0)
  {
       sceKernelStartThread(thid, 0, 0);
  }
  return thid;
}
 
//메인 함수
int main(int argc, char *argv[])
{
  SetupCallbacks();
  pspDebugScreenInit(); //화면 초기화
  out( "Hello World - Seian Test\n" );
  sceKernelSleepThread();
  return 0;
}


결과값은  대충 검은화면에 하얀 글씨로 'Hello World - Seian Test'.

스샷은 나중에 ㄱㄱ
,




아 며칠 전부터 이 주제에 관해서 블로그에 글을 쓰고있던 차에 좋은 자료를 구했다 OTL
,
쓰기전부터 욕이 나오려 하네 슈ㅣ발

CPU  : Intel r Celeron 1.3Ghz
M/B  : 불명 슈ㅣ발
RAM : 640MB   /   256 * 2 + 128 * 1     /    친구한테 256 뺐었음[?]
VGA : Nvidia GeForce FX 5600      /      128 Bits 64 Mb 던가? 둘다 128이던가[..]
Snd  : 불명 슈ㅣ발
Spkr : Eastern Ceron ss-5050  2.1 Ch    /   꽤나 오래전껀데..당시최상품..지금은 슈ㅣ발
Mntr : Hansol H770 17 inch
HDD : 80GB     /    40 * 2
FDD : Samsung...모델명은 불명 슈ㅣ발
ODD : LG GSN - H10N   DVD RW
KBrd : Skydigital Keyboard B513
Mse : SGP GP - M3000PE  모델명은 그럴듯하나 중국산 슈ㅣ발


불명이 왜이렇게 많어 엉엉 흑흑
,


마이크로소프트사의 live lab에서 개발 중인

Seadragon과 Photosynth라는 것인데,

Seadragon은 초고해상도의 이미지 파일을 렉도 없이 줌인아웃하는 것이다.

영상을 보면, 초중반부에 Bleak House라는 글귀와

신문광고 - BMW의 하얀색 스팩정보까지 확대해내는건 완전히 초과학 수준 ㄱ-


Photosynth는 다각도의 사진만 가지고

공간배열을 컴퓨터가 처리하여 하나의 3D 비쥬얼링을 하는 프로그램인데,

파노라마식으로 해서 3D처럼 이미지를 볼 수있고,

또 이게 사진 공유사이트 등과 연계되서 이미지 대조작업이라든지가 가능하다.


http://labs.live.com/photosynth

위 링크에서 Photosynth를 체험 해 볼 수 있는데,
 
체험 가능한 명소 중에는 경복궁도 포함되어있으니 한번 둘러보는 것도 좋다고본다.

=

난 마이크로소프트는 별로 안좋아하지만

이건 좋고나쁘고를 떠나서 우선 놀랄만한 기술이 아닌듯싶다.

과거 몇 년간, 컴퓨터계의 왕으로 군림하던 마이크로소프트가

왕자리를 내주고 죽은듯이 있었던동안 정말 잠수타고 있던 것만은 아닌듯 싶다.


=p.s=
 
아니근데쇼발 어떻게 해야 저게 구현이되는거지?

렉이 없이 줌인아웃이 가능하게 하는 알고리즘이랑

3D 비쥬얼링이랑 저렇게 하려면 좀짱이어야할텐데..

게다가 같은위치에 맞춰내려면 알고리즘도 알고리즘이지만

데이터가 겹치면 어쩌려고 ㄱ-

하여간 세상이 너무 빨리 진행된다니까[?]


=p.s.s=
 
아 진짜 어떻게 구현한거지 림히
,


01년부터 개발하기 시작한 Surface.

현재 바로 시판해도 문제가 없다는데,

호텔 등 상업적-서비스 관련에 대해 판매할 계획이랜다

현재의 기술은 우리가 모르는 사이에 너무 빨리 발전하고 있는듯.
,

포인터에 관하여 어셈블리를 통하여 좀더 자세히 알아보자.

다음은 간단한 예시이다.

void pointer(void) {
{
    int i;
    char *p;

    p = i;
    *p = i & 0x0f;
}

일반적인 사람의 경우라면 이 코드는 틀렸다고 바로 말할 수 있을 것이다.
직접 코딩을 해보더라도,
warning : assignment makes pointer from integer without a cast
라는 경고를 볼 수 있을 것이기 때문이다.
위 경고를 해석하자면, "대입 명령에 캐스트 없이 정수에서 포인터를 만들고 있다"라는 것이다. 이것은 당연한 것이 되므로, 우리는 캐스트를 통하여, 다음과 같이 바꿔줘야한다.

p = (char *) i;
다시 컴파일을 해봐도, 당연하게 - 성공한다.

캐스트를 좀 더 사용해서, p를 사용하지 않고 구현을 해보자.

1) p = (char *) i;
2) *p = i & 0x0f;
이므로, 위 1)에서 의 p를 2)에 대입하면,
*((char *) i) = i &0x0f;
 p를 생략하고 이렇게 사용해도, 문제없이 사용이 가능하다.

그렇다면, 이번에는 처음으로 돌아가, 어셈블리로 살펴보자.
위의 실행문을 어셈블리로 바꾸게되면, 단 한 줄로 축약이 가능하다.
MOV BYTE [i] , (i & 0x0f)
이것을 다시 p를 써서 처리 한 것처럼, 어셈블리에서도 유사방법으로 늘려보겠다.
즉, p를 ECX에 대응시켜보겠다.
MOV ECX, i
MOV BYTE [ECX] , (i & 0x0f)
이 두 문장은 큰 차이를 갖고있다.
ECX라는 '레지스터'에 대입을 하는 것인지, ECX번지의 '메모리'에 대입하는지 말이다.
CPU를 뜻하는지, 메모리 칩안인지. 완전히 다른 의미가 되기 때문이다.

만약, 1)과 2)의 위치를 서로 바꾸어, 2)를 먼저 수행하고, 1)을 수행한다면 어떻게될까?
위에서 참고한 어셈블리를 상하를 바꾼다는 것인데, 그렇게되면 참조 주소가 달라지게 되어 엉뚱한 곳을 가르키게 될 것이다. 쓰레기 값(Dummy)가 나올 수도 있고, 다른 어플리케이션 및 시스템 메모리 참조를 하게 될 수도 있다. 따라서, 선행 처리와 후행 처리의 위치를 잘 파악 하는 것이 프로그래밍에 있어서, 오류를 하나라도 줄이는 길이라고 생각한다.

아 쓸게 더이상 생각안난다 ㅈㅈ
,

멀티테스킹을 이해하기 위해서는 보호모드(Protected Mode)를 먼저 이해하여야한다.


*보호모드(Protected Mode)란

보호모드는 Intel 80286부터 도입되기 시작하였으며, 차차 발전된 보호모드는 80386에 이르러 현재와 같은 완성된 모습이 된다.80286의 초기 보호모드는 24 Bit Address Bus를 사용하여 물리 메모리(Physical Memory)의 사용 영역이 16mb가 되었다.그 후, 보호모드에서는 CPU가 제공하는 모든 기능과 명령어를 사용할 수 있는데, 후에 32Bit Address Bus를 통해 4GB의 물리 메모리의 사용 영역을 갖게된다. 메모리 보호기능(Memory Protection), 페이징(Paging) 등을 통하여 효율적인 구현이 가능하다.인터럽트, 예외처리, 태스크 스위칭(Task Switching) 등은 보호모드에서 지원하는 기능을 활용 하는 기능이다.



보호모드의 레지스터와 자료구조. (인텔 펜티엄 III CPU 기준)




*멀티테스킹


멀티테스킹은 복수의 어플리케이션이 동시에 작동하고 있는 상태를 뜻한다. 하나의 프로세서에서 복수의 어플리케이션이 동시에 움직이는 것은 양자컴퓨터가 아닌이상 구현키 힘들다. 우리가 현재 사용하는 멀티테스킹은 우리 눈에는 동시에 작동하는 것 처럼 보이지만, 실제로는 다르다.


위의 그림은 세로줄은 어플리케이션 수를 의미하며, 가로줄은 시간을 의미한다. 즉, 멀티테스킹은 속임수이다. 완전 동시 작동이 아니라는 것을 뜻한다. 여러가지 다중 프로세스를 인간이 눈치채지 못할정도로 분할 하여, 각개 프로세스를 조금씩 진행한다. 위의 그림을 살펴봤을 때, 1번 프로세스를 조금 진행하고, 2번 프로세스를 조금 진행하는식으로, 4번 프로세스까지 반복한 후,다시 1번 프로세스를 조금씩 진행하는 방식을 사용한다. 이것은 하나의 시간대를 공유하며 진행하는 방식으로, 시분할 방식(Time Sharing)을 사용한다. 순차적으로 프로세스를 하나하나 동작시키는 것과 시분할 방식과는 프로세싱에 있어서 시간차이가 날 수밖에 없다. 이것은 시분할 방식 시에, 계속해서 전환되는 시간(Task Switching - Interrupt Time) 때문인데, 대신 사용자가 두 작업을 동시에 실행 할 수있다는 장점을 갖고, 전환되는 시간의 간격(Switching Interval)이 매우 짧기 때문에, 동시에 보이는 것처럼 보이는 것(Illusion of parallelism)뿐이다. 이것에 파이프라인과 슈퍼스칼라 구조가 더해져, 더욱 부드러운(즉, 고속의) 멀티테스킹이 구현되기에 이른다.





*TSS란?



보호모드에서는각 태스크(Task)별로 TSS(Task State Segment)를 관리한다.
TSS란 레지스터의 내용이 메모리에 저장되는 것을 말하며, 16비트와 32비트가 있다. 태스크 스위칭을 위해 정보기록과 출납을 담당한다.

OS의 시스템커널에서는 이 TSS를 사용하기위하여 세가지 절차를 밟아야 한다:

1. TSS 디스크립터 엔트리(Descriptor Entry)를 GDT(Global Descriptor Task)에 생성
2. 세그멘트 셀렉터(Segment Selector)에서 해당 세그먼트를 TR(Task Register)과 함께 로드
3. 메모리의 TSS에 필요한 정보를 기록

*TSS는 시스템 안정화의 목적으로 접근하기 쉬운 메모리에 배치되어야한다.
*GDT란 프로그램이 실행되는 동안 사용되는 메모리 영역을 정의하기 위한 Intel기반에서 쓰이는 데이터 구조(Data Structure)을 말한다.
*TR은 현재 태스크의 TSS를 가르키는 셀렉터(selector)이며, 각 TSS는 GDT에서 TSS Descriptor로 기술되며, TR은 이중 현재의 TSS의 Descriptor를 가르킨다. 내부적으로 세그먼트의 기준 주소(Bass Address)와 세그먼트 리미트(Segment Limit)를가지고 있지만, 외부에서는 셀렉터(Selector)값만을 참조 할 수 있다.






Descriptor Table - GDT와 LDT. 그리고 셀렉터



TSS에는 하나의 태스크의 상태 - 일반 register, segment register, flag, EIP, stack segment selector, stack pointer, LDT selector, page directory base address 등 - 이 저장이 되며 태스크 스위칭(Task Switching)이 일어날 때, 일어나기 전의 상태를 자동으로 이곳에 정리하며, 새로운 차후 TSS에 다시 복구된다.


TSS가 32비트일 경우, 구조체를 이용한 프로그래밍은 다음과 같이 성립한다.


1 :  struct TSS32 {
2:      int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
3:      int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
4:      int cs, es, ds, ss, fs, gs;
5:      int ldtr, iomap;
6:  };


*TSS는 위처럼 int형으로 26개가 모여, 104바이트가 된다. (4바이트씩)
*2 행의 backlink 부터, cr3는 레지스터의 내용이 아닌 테스크의 설정에 관한 내용이므로, 태스크 스위칭이 일어나도 값은 불변한다.(backlink는 예외적으로 바뀌는 경우가 있다.)
*3 행은 32비트 레지스터이며, 4행은 16비트 레지스터이다.(레지스터 비트별 표기법 참조)
*세그먼트 레지스터는 16비트로 구성되어있지만, TSS안에서는 int(=DWORD)로 구성되어있다.
*5 행의 ldtr과 iomap은 설정에 관한부분으로, 2 행과 같은 역할이다. 따라서 태스크 스위칭이 일어나도 값은 불변하다.







*그림참조 : Intel Processor Strutcure Information

               

,
*1 
count total , today , yesterday
rss
I am
알립니다
분류 전체보기
Common Day
Computer
Creative
Sound
2009-2010 Japan Story
최근에 쓴 글
최근에 달린 댓글
최근에 연결된 관련글
글 보관함
달력
«   2024/05   »
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