회사에서 git 업데이트를 오랜만에 진행하려고(??? 그렇다.. 관심없다가 괜히 업데이트 해야지~ 하고 생각났다..) 소스트리를 실행했더니..

git status failed with code 128: fatal unsafe repository .... is owned by someone else 라는 메시지와 함께..

To add an exception for this directory , call:

git config --global --add safe.directory
'D:/WORK/REPOSITORY'

메세지가 발생했다..

뭐지 하고 검색해보니 git 의 보안문제가 발생했고..

메시지내의 문구를 그대로 치면 된다고 한단다.

git config --global --add safe.directory "디렉토리"

이렇게 치면 된다고 해서 저 디렉토리 부분에 실제 repository 경로를 적었는데
계속 동일 메시지가 발생했다..

다른 사람들과 달리 나의 경우는 틀린줄 알고 검색했는데 답은 찾지 못했고 그러다가
c:\사용자\계정.gitconfig 파일을 열어 보니

[safe]라는 항목에 내가 입력한 repository 디렉토리가 입력되어 있었다.
그런데 그 해당 경로가
D:\WORK\REPOSITORY 등으로 백슬래쉬가 두번 입력되어 있어 이를 \한번으로 수정 , 저장하고 소스트리를 실행했더니, 동일한 에러 메시지가 발생했다. 그래서 디렉토리를 백슬래쉬가 아닌 리눅스 처럼 슬래쉬 (/)로 변경했더니 되더라.

D:/WORK/REPOSITORY

그렇다.. 디렉토리 구분을 슬래쉬(/)로 해야 적용된다.

나처럼 삽질 하지 않기를 바란다.

**
* 에러 메시지 문구에도 디렉토리 구분자는 슬래쉬다... 역시 모든 문제의 답은 문제에 있다.. ㅋ **

우선, 시작은 욕부터 박고 시작하자~~~~~~~~~@#@#@#@#$@#$

 

구글 포토로 길들여 놓고 ..... 나를 버렸다.

 

별수 있나... 칼 자루는 그들이 들고 있는데..

takeout 으로 백업 요청 .. 1TB라는 어마어마한 용량이 나왔다... 

첫번째.. 빡침... 3T HDD를 샀다...... 돈 들었다..............하~~~~~

 

50G씩 22개 파일을 다운받으면서 그 속도에 두번째...빡침...

 

50G파일을 압축 풀면서 또 그 속도에 세번째...빡침.... 씨부럴 구글 쌔퀴들..

하지만... ..그렇다... 다시 구글 스토리지 2T 사서... 다시 업로드 했다.... 대안이.. 아이클라우드 가 있었는데.. 업로드 속도와 아이클라우드의 사진은 백업 보다는 동기화 개념이라... 그냥 구글을 이용하기로 했다..(아이클라우드 2T 샀다가 다시 구글 스토리지 샀었던 삽질은...비밀... )

 

구글 드라이브 프로그램을 이용하여 사진 업로드...

어라???????

 

사진 날짜가 올린 날짜네??? 뭐야???????????????

 

구글에서 다운받은 사진 파일은 사진의 메타 데이터가 삭제되어 백업되어 있었다... json 파일을 줬으니 그걸로 복구하라네???? 

 

씨부럴놈의 구글 놈들...

 

인터넷에서 검색해보니, exiftool 프로그램을 사용해서 복구 하면 된다고 한다... 그런데... 인터넷에 있는 프로그램 예제는 사진 메타 데이터는 복구 되는데.. 파일 생성, 수정 날짜가 복구가 안되더라.. 그래서 내가 다시 만들어 봤다.

 

내 json 파일 포맷은 아래와 같다.

{
  "title": "IMG_0001.JPG",
  "description": "",
  "imageViews": "10",
  "creationTime": {
    "timestamp": "1520299735",
    "formatted": "2018. 3. 6. 오전 1시 28분 55초 UTC"
  },
  "photoTakenTime": {
    "timestamp": "1493874187",
    "formatted": "2017. 5. 4. 오전 5시 3분 7초 UTC"
  },

 

json 파일의 phototakenTime의 timestamp로 사진 파일 생성, 수정을 바꿀 것이다.

exiftool -tagsfromfile "%d%F.json" "-FileCreateDate<photoTakenTimetimestamp" -d %s "-FileModifyDate<photoTakenTimetimestamp" -d %s "-DateTimeOriginal<photoTakenTimetimestamp" -d %s -overwrite_original -r --ext json "디렉토리"

 

이렇게 하면 사진 파일이 바뀐다....그런데 ......  구글 Takeout에서 백업한 파일을 보면 일부는, 제대로 메타데이터 시간대가 구성되어 있고 일부는 메타데이터가 사라져 있다... 그래... 더 빡치자....

여튼, 메타데이터가 없는 애들만 따로 .... 모아서 위 명령어를 써준다... 그리고 여기서 문제는 시간대가 UTC 이다. 

그래서 위 명령어 실행후에 시간대를 아래처럼 +09:00 으로 바꿔준다.

exiftool "-FileCreateDate+=09:00" "-FileModifyDate+=09:00" "-DateTimeOriginal+=09:00" -overwrite_original -r --ext json "디렉토리"

 

...

 

메타 데이터 복구 하는데도 2일이 소요되었다.

 

***********************************

수정 #2

위에 처럼 하면 망한다... 기존 명령어는 메타데이터가 제대로 되어 있는 사진도 사진 찰영 시간을 UTC 시간대로 변경해 버리는 문제가 있다. (오전 10시에 찍은 사진이 오전 1시에 찍힌걸로 기록된다는 의미) exiftool 을 아무리 찾아도 UTC를 로컬 시간으로 변경하는 방법?이 없다... 그래서 시도한 방법이 메타데이터가 없는 사진만 UTC 시간대의 시간으로 사진 촬영 시간 메타 데이터를 생성하게 한다 . 그 작업이 끝나면 다시 메타데이터가 없는 사진만 사진 촬영시간 에 9시간을 더하는 형태로 진행했다. (UTC 시간에서 우리나라 시간대가 9시간 차이난다.) 물론, 이것도 외국에서 찍은 사진은 시간대가 잘못 표시될것이다. (모든 시간대를 한국시간대로 변경해 버리기 때문에... 사진 찍은 해당 외국 시간과 UTC와의 시간차를 입력이 필요하다.)

이것은................ 구글을 욕하고 사진 하나 하나 편집 하던지... 그냥......................포기 할수 밖에 없을 듯한다.

 

exiftool -if "not defined $DateTimeOriginal" -tagsfromfile "%d%F.json" "-DateTimeOriginal<photoTakenTimetimestamp" -d %s -overwrite_original --ext json -r "사진디렉토리"

위 명령어는 구글포토가 사진을 정렬하는 기준인 메타데이터의 DateTimeOriginal이 없는 사진일 경우 json 파일의 PhototakneTime 의 timestamp 항목의 UTC 시간대로 DateTimeOriginal값을 설정하는 명령어이다.

이 작업이 메타데이터가 없는 모든 사진에 적용이 되었다면,

exiftool -if "not defined $CreateDate" -tagsfromfile "%d%F.json" -DateTimeOriginal+=09:00 -overwrite_original --ext json "사진디렉토리"

위 명령어로 메타데이터 중 CreateDate 항목이 없는 사진의 DateTimeOriginal시간에서 09:00시간을 더하게 설정해준다.

메타데이터가 없는 사진은 처음에 DateTimeOriginal 항목에 UTC 촬영 시간대가 적용되고 그 후, 09:00시간을 더하는 순서이다. 두번째에서는 CreateDate로 메타데이터 비교 변수를 바꿨다... 이유는??? 묻는거 차제가 어이없는거임... 

 

 

 

젠장.. 구글 놈들.

 

C#에서 16bit grayscale PNG 파일을 Bitmap.FromFile 또는 Image.FromFile로 읽을 시 32bit argb 4바이트로 변환되어 읽게 된다.

16bit gray 이미지를 얻기 위해서는 다음과 같이 처리한다.

 


 

Stream imageStreamSource = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];
int stride = (int)bitmapSource.PixelWidth * (bitmapSource.Format.BitsPerPixel / 8);
byte[] data = new byte[(int)bitmapSource.PixelHeight * stride];


bitmapSource.CopyPixels(data, stride, 0);

PNG 파일을 FileStream으로 읽고 PngBitmapDecoder로 BitmapSource를 얻는다.

그후 CopyPixels로 raw데이터를 복사한다.

 

'프로그래밍 > C#' 카테고리의 다른 글

Window class name is not valid  (0) 2014.08.06
C# array char to String 변환  (0) 2013.08.14
쓰레드 종료 지연 문제  (0) 2013.08.14
변수 타입  (0) 2013.08.14

openlivewriter_tistory.z01
10.00MB
openlivewriter_tistory.z02
10.00MB
openlivewriter_tistory.z07
10.00MB
openlivewriter_tistory.z08
10.00MB
openlivewriter_tistory.zip
1.15MB
openlivewriter_tistory.z04
10.00MB
openlivewriter_tistory.z05
10.00MB
openlivewriter_tistory.z06
10.00MB
openlivewriter_tistory.z03
10.00MB

오랫동안, 바빠서 블로그에 글을 못 올렸다.

 

그러다가 , 몇일전 작업 정리를 하려는 용도로 블로그에 글을 올리려고 습관적으로 Open live writer를 실행했다.

그런데 티스토리에서 동작하지 않는 현상을 발견했다. 아니… 알고는 있었다 . 시간 내서 이거 살펴 보는게 힘들뿐이었다.

그리고 Open live writer의 기능도 요즘 시대의 기능에서 많이 떨어진 상태라.. 도태 되는 프로그램에 시간 할애하는게 아까웠다.

 

그냥…

 

다시 손 좀 봤다..(난 이게 편해서……………)

내가 티스토리를 카카오랑 통합했었고, 티스토리 OPEN API의 OAuth 가 기존과 달라진점이 있어서 수정해서 올린다.
티스토리를 카카오랑 통합한 계정에 대해서만 테스트 되었고, C# 에서 기본으로 제공하는 Webbrowser가 브라우징에
스크립트 오류가 계속 발생해서 CEF 크로미엄 임베디드 프레임워크 를 붙여서 웹 브라우징에 사용했다. 그렇다..
그래서 티스토리를 하나 연동 하려고 배포되는 파일이 겁나 많다… 어떻게 해서든 안쓰려고 했는데… 어쩔 수 없었다...
마이크로소프트 사를 욕하도록 하자.

압축 했는데 파일이 83MB나 된다.

이 압축 파일을 Openlivewriter가 설치된 폴더에 압축을 푼다.
그럼 OpenLiveWriter.BlogClient.dll을 덮어쓸 거냐고 묻는다. 덮어써라.. 만약 덮어쓸거냐고 묻지 않는다면 파일 복사가
잘못 된거다.

그리고 Open Live Writer를 실행한다.

기존 티스토리를 사용했었던 사용자는 다음과 같이 창이 나올 것이다.


image

위에 이미지 링크  https://www.tistory.com/guide/api/manage/list 을 웹브라우저 주소창에 입력한다.

로그인 하고 그러면..

image

위 부분이 보인다. 여기서 인증관리 하단 [설정]을 클릭한다.

image

위 화면이 나오는데 내 계정 정보라 지웠다. 여기의 APP ID, Secret Key, Callback 부분을 각각 Tistory Information 창에 입력하고 [OK] 버튼을
클릭한다.

image

 

image

그럼 위 창이 다시 발생하는데.. 그렇다… [카카오계정 로그인]을 누르고 아이디 , 패스워드를 입력하면 되는것이다. 웹페이지 계정 로그인과 동일한다.

잘 진행되었다면 아래창이 나올 것이다.

image

위 화면이 나오면 [허가하기] 버튼을 클릭하면 Open Live Writer와 티스토리 연동은 끝이다.

 

외부 프로그램과 티스토리 연결 시 보안이 기존보다 강화(?) 아니 변경 되었다.

 

우리의 티스토리는 10MB 파일미만만 첨부가 되어서 zip 을 10MB로 잘라서 배포한다.

 

회사 웹메일을 사용하던중 크롬의 문제인지, 웹사이트 문제인지는 모르겠지만 새탭으로 메일 사이트가 무한 생성되는 문제가 발생된지 어언 10개월이 지났다 이를 해결하려고 크롬디버깅, 웹사이트 소스 분석하다가 지쳐서 그냥 아웃룩을 사용하기로 하고 모두 덮었다. 솔직히 일하면서 이런 문제 때문에 시간 할애하면서 앉아 있는 내가 한심해서 였기 때문이다.

아웃룩 설치하고 계정 등록하고 이것 저것 설정 맞추고 사용하려고 하니, 딱 아웃룩 계정 데이터 (OST)저장 공간이 문제가 발생했다. 현재 C드라이브 SSD 는 용량이 250G (????) 밖에 안된다.  D드라이브는 1T . 계정 데이터 저장 위치를 D 드라이브로 옮겨야 되는데… 안 옮겨진다.

마이크로소프트 사이트도 검색해 보고 구글도 검색해 보고 했지만 시키는데로 해도 안된다.

이건,….뭐하자는건지.. 제작사도 도움 안되고 믿었던 구글마저도 도움이 안된다.

이제까지 저장공간을 옮기기 위해서 내가 해본 건

1) OST 파일을 잘나내기 해서 옮기고자 하는 드라이브로 이동시키고 아웃룩을 재실행. (똑같은 위치에 파일이 다시생성된다)

2) 메일 계정 데이터 탭에서 저장 파일 위치 변경. (아예, 저장 위치 변경 버튼 자체가 활성화 되지도 않는다)

3) 레지스트리 Outlook 항목에 ForceOSTPath 생성 및 계정 데이터 파일 기본 생성 위치 설정. (안된다…. 구글 검색시 90%가 이 방법을 제시한다)


포기하고 다시 웹메일로 돌아갔다……..

그런데 우연히(?) 검색해보다가 메일 계정이 IMAP 일 경우 OST (오프라인 메일 데이터) 파일은 ForceOSTPath 가 아닌 ForcePSTPath로 생성해야 한다고 한다. 버그인건지 뭔진 모르겠다…

그래서 생성해봤다… 옮겨졌다!~~~~~~~~~~~~~~~~~ …ㅡㅡ;;;


정리하자면 Outlook의 OST 파일을 변경 하려면…

1) 레지스트리 HKEY_CURRENT_USER\Software\Microsoft\Office\xx.0\Outlook 이동

(xx.0 : xx는 Office 버전으로 해당 버전 번호는 검색해야함)

2) Outlook 항목을 선택후 > 새로만들기 –>확장 가능한 문자열 선택

3) ForceOSTPath 입력

4) ForceOSTPath 선택 후 오른쪽 마우스로 수정을 선택 후 OST 파일을 옮기고자 하는 디렉토리 경로 설정.

5) Outlook 항목을 선택후 > 새로만들기 –>확장 가능한 문자열 선택

6) ForcePSTPath 입력

7) ForcePSTPath 선택 후 오른쪽 마우스로 수정을 선택 후 OST 파일을 옮기고자 하는 디렉토리 경로 설정.

8) 레지스트리 종료

다음 링크는 마이크로소프트사에서 제시한 방법이다. ForceOSTPath만 언급되어있다..

https://support.microsoft.com/ko-kr/help/2752583/you-cannot-change-the-location-of-the-offline-outlook-data-file-ost-in

mp3 splitter.zip




이 프로그램은 MP3 파일을 시작 시간 정보를 이용하여 각각의 개별 파일로 자르는 프로그램이다.

image


1. 파일열기
  파일열기 버튼을 [클릭]하여 MP3 파일을 선택한다.
  (탐색기에서 파일을 드래그 하여 프로그램에 드랍해도 됨)
  image


2. 저장 폴더 선택
  잘려진 MP3 파일들이 저장될 폴더를 지정한다.
image

3. 시간 데이터 읽기
  MP3 파일을 자르기 위한 시간정보를 입력하기 위해서 시간데이터 읽기 버튼을 [클릭]한다.
(시간 정보 포맷으로 저장된 txt 파일을 드래그 하여 목록창에 드랍해도 됨)
image

  시간 데이터 읽기 버튼을 클릭하면 다음과 같은 시간 정보 입력창이 생성된다.

image

시간 정보를 입력한다..

image

위와 같이 입력하고 [확인] 버튼을 클릭한다.

* 시간정보 데이터 포맷
  - 시간 정보 데이터는 입력 MP3 의 시작위치 정보만 입력하는 포맷과 시작위치, 종료위치를 입력하는 두 방식이 있다. 

  시작위치만 존재하는 포맷 :
   [파일이름] [시작위치]

  시작,종료 위치가 존재하는 포맷 :
    [파일이름] [시작위치] [종료위치]

   각 포맷의 구별은 공백으로 구별된다.


- 시작 위치 정보만 입력했을 경우는 종료시간이 자동으로 생성되는데 종료시간 위치가 다음 파일 시작 위치 전으로 입력되고 제일 마지막 파일의 종료 위치는 MP3의 마지막 시간으로 자동 입력된다.

image

* 시작위치와 종료 위치를 기록한 포맷일 경우는 두 파일의 시간대가 겹치는 경우는 지원하지 않는다.(시간대가 겹치만 제일 우선 시작시간 파일만 생성됨)


4. 변환

  시간정보까지 입력이 되면 변환 버튼을 클릭하면 각각의 파일로 생성된다.
image 


아…….이런거…

귀찮아…

* 저작권 관련하여 모든 책임은 사용자에게 있습니다.


   


티스토리 로그인 관련해서

에러가 발생한다고 하여 로그인 관련 부분 수정해서
OpenLiveWriter.BlogClient.dll 파일만 배포 합니다.

(zip 압축 파일 해제 후 OpenLiveWriter.BlogClient.dll 파일을 덮어쓰기 하면됨.)


- 로그인 실패 시 로그인창이 별도로 팝업 되도록 수정함.



OpenLiveWriter.BlogClient.zip


개인적인 일과 OS 만드는 과정에서 너무 지식이 부족함을 느끼고.. 한동안 공부만 했다.

이해 안되는 개념은 이해 될때까지 예제와 문서 읽으면서 공부를 하긴 했는데 역시나 OS 만드는 것에 대한 지식이 너무 방대함을 느끼고…좌절(?).

오래된 노트북 책장속에 꼽아 놓고, 가끔 켤 때 마다 보이는 바탕화면에 OS 만들기 폴더를 볼 때 마다 내 자신이 한심해지는 것 같아 더더욱 의도적으로 외면하게 되었다.

그러다가 죽은 노트북 살리면서 생각지도 않는 의욕이 불타 올라 , 다시 시작.


우선 페이징을 설명하기 전에 가상 메모리에 대해서 설명이 필요하다.

가상 메모리 단어에서 어느 정도 무엇을 내포된 의미를 알 수 있듯이 메모리를 가상화 한다는 거다.

?????? 메모리??? 내컴퓨터에 달려있는 램???

그렇다. 이 램을 가상화 한다는 거다. 가상화 라는 단어가 어려울진 모르겠는데 쉽게 내컴퓨터에 2G짜리 램 하나 달려 있는데 OS에서 4G 달려 있는 것처럼 속인다(?)라는 거다. 사기???? 맞다.. 사기치는 거다. 짜임새 있고 논리적으로…. 프로세스(프로그램)며 OS까지 전부 다 개별적으로 4G를 쓸 수 있게 해주는 황금 알을 낳게 해주는 기술이다. (배를 갈라보자…)

그럼 왜 사기 치는 걸까???
(당연하지 않나? 돈이 없어서.. ㅋㅋㅋㅋㅋ)

점점 소프트웨어들의(프로그램,OS) 기능이 커짐에 따라 메모리도 많이 소모하게 되었는데 이게 물리적인 메모리 램은 한정되어 있는 상황에서 서로 메모리 가져오기 전쟁을 벌어야 했기 때문이다.
MS-DOS 시절 한글 띄워 보겠다고 한글 램 상주 프로그램 실행 후 게임을 실행할 때를 생각해 보자… 메모리 부족으로 실행되지 않는다. 그러면 램 상주 프로그램 종료 시키고… 이것저것 최적화 해서 게임 실행 했었던 시절을 떠 올려 보니 이해가 쉬워 진다. 프로그램들은 메모리를 쓰고 싶은데 딴놈이 그놈의 메모리를 차지 하고 있으니 사용자가 간섭해서 종료 시키고 최적화 시켰던 그 시절…(추억이 새록새록하다.)

유한한 메모리 공간이 가상 메모리 기술을 사용한다고 해서 갑자기 없던 메모리가 3차원 우주공간에 생성되어 그 공간을 사용하는 그런 공상 과학적인 그런건 아니다. 앞에서 말했던 것처럼 속이는 거다. 어떻게????

우선 가상메모리는 개별 프로그램 및 OS에게 너에게 주어진 메모리 공간은 4G이다.(난 32bit OS를 목표로 하기 때문에 4G로 표기한다.) 라고 넉넉한(?) 메모리 공간을 제시한다. 그러면 좋아라 하겠지…. 마구마구 메모리 할당하고 쓸것이다. 지지고 볶고 . 어라 저놈도 메모리 크게 잡네?? 나도 잡자 … 마구 마구 할당 하면 그래 버블이 발생한다. 버블이 발생하면? 죽는거지 뭐… (갑자기 옆길로……샜다.)

가상 메모리는 개별 프로그램들에게 메모리 공간 4G와 독립적 메모리 공간을 약속한다. 4G공간은 물론 가상 공간인 것일 테고 독립적 메모리 공간이라 함은 각 프로그램들의 메모리 공간은 서로 접근할 수도 없고 독립적으로 메모리 0번지 ~0xFFFFFFFF 까지 나만의 공간을 만들어 준다는 것이다.
예를 들어 A프로그램이 메모리 0x100000에 어떤 데이터를 써 놨다고 하자. 그게 온라인 커뮤니티 아이디 , 패스워드라고 한다면 B라는 프로그램은 A프로그램이 0x100000 메모리 아이디, 패스워드를 저장해 놓은 걸 알고 있는 상황에서 메모리 0x100000 를 읽어 보면???? 아무것도 없다.  이는 각 프로그램마다 제공된 메모리 공간은 독립적으로 타 프로그램과 공유하지 되지 않는다는 의미인 것이다.

(독립된 가상 메모리는 실제 컴퓨터 메모리상의 주소와 일치 하지 않는다. A프로그램 0x100000 가상 메모리 주소는 실제 메모리 0x100000에 적재되지 않는다. 가상 메모리상의 주소는 실제 메모리 주소가 결정되지 않는 논리적 가상의 주소일 뿐이다. 이렇게 되지 않는다면 A프로그램과 B프로그램이 0x100000을 사용하게 된다면 메모리가 독립적 사용이 불가능 하게 된다. 이는 페이징에서 좀더 설명한다.)

그리고 가상 메모리를 프로그램 별 4G로 준다는 의미는 무엇인가? 분명히 앞서 설명한 바에 의하면 각 프로그램은 실제 램 2G가 설치된 컴퓨터에도 사기친(?) 4G를 제공한다고 했다. 그렇다면 위에서 예를 들었던 A,B 프로그램 두개가 독립적인 메모리 공간으로 4G를 가지고 있으므로 4G X 2 = 8G 라는 공간이 컴퓨터에 발생이 필요 할 텐데 가상 메모리는 물리적 메모리 2G로 어떻게 8G라는 공간을 만들어 놓을까?? (사기는 그럴듯 해야 사기빨이 받는 법이다…)

이런저런 아키텍처를 연구하는 사람들이 가만히 프로그램들을 살펴보니 4G가 공간을 주더라도 0x00000000 ~ 0xFFFFFFFF 메모리 공간에 차곡차곡 메모리를 쌓아 쓰지 않는 점을 밝혀 냈단다. 또한 프로그램 이라는게 4G메모리를 전체 할당해서 사용한다고 해도 메모리를 사용(CPU가 사용 시점)하는 시점에는 전체가 아닌 부분만 사용한다는 패턴을 찾아 냈다.  그러니까 메모리를 4G 전체 할당 한 상태에서 실제 CPU가 사용하는 메모리는 극히 작은 부분만 필요하다는 것이다.

   
image

즉, A,B 프로그램에서 8G를 사용할 경우, 실제 CPU가 사용하는 부분만 메모리에 올리고 나머지 부분은 우리가 흔히 OS사용하면서 보았던 페이징 파일로 디스크에 저장해 놓는다. 즉 실제 컴퓨터 메모리 2G는 A프로그램과 B프로그램 전체의 메모리를 저장하지 않고 페이징 파일로 저장해 놨다가 필요 할 때 실제 컴퓨터 메모리로 필요한 만큼 올리는 것이다. (필요할 때 필요한 만큼 꺼내 쓴다….역시나 실제 메모리에 올려 놓은 데이터가 더이상 쓰지 않거나 당분간 쓰지 않을 것 같을 때는 다시 파일로 보낸다.) 이렇게 실제 메모리와 디스크에 메모리 데이터를 서로 교환 작업함으로써 각 프로세스가 독립된 4G 공간의 메모리를 확보 할수 있게 되는 것이다.


페이징이란 앞서 설명한 가상 메모리를 구현 할 수 있게 만드는 메모리를 관리 기법을 말한다. 위 가상 메모리 설명에서 CPU가 필요로 할 때 페이징 파일에서 실제 메모리로 필요한 만큼 꺼내 쓴다라고 설명했다. 이때 실제 메모리로 페이징 파일에서 데이터를 옮기는 데이터량의 최소 단위를 페이지 말한다. 다시 말하면 메모리의 크기를 페이지 단위로 나눠서 데이터를 이동시킨다 라고 할 수 있다. 여기서 메모리를 페이지 단위로 나눠서 관리하는 기법을 페이징 이라고 말한다고 한다. (메모리를 페이지 단위 쪼개는 작업이라고 볼 수 있다.) 페이지는 2 제곱 값으로 지정 될 수 있으며 보통 4096byte(4kb) 으로 설정된다. (리눅스나 윈도우도 4KB)
메모리를 페이지 단위로 나누는 작업 자체가 페이징이라고 했지만 좀더 심화된 작업이 있다. 위에 가상 메모리 4G 를 구현하기 위해서는 페이징 이라는 작업을 해줘야 내 OS에 4G 가상 메모리 공간을 만들 수 있다. 조금 많이 난해하고 어렵다. 가상 메모리라는 용어하고 페이징이 결합하면서 실제 주소, 가상 주소 단어가 등장하게 된다. 이 단어가 글에서 왕복된 설명이 나오는 순간.. 머리가 글을 읽는 눈을 쫒아 가지 못하고 … 퍼진다. (그래도 진행해 보자….)

각 프로세스별 4G 가상 메모리 공간을 만들기 위해선 가상 메모리 4G 공간을 페이지 단위로 나눈다. 이 나눠진 페이지들을 표로 만들고 각 페이지 마다 번호를 붙여 보면 0부터 1048574 까지 번호가 부여 될 것이다. (4294967295(4G) ÷ 4096(페이지) = 1048575가 나온다. ) 1048575개의 페이지는 1MB 공간을 뜻하는 것이다. 즉 가상 메모리 4G를 구현하기 위해서는 실제 메모리 1MB의 할당이 필요해지며 여기에 가상 메모리 4G를 실제 메모리에 연결하기 위해서 각 페이지 마다 연결 참조 포인트 4Byte를 추가하면 4M 바이트의 공간이 각 프로세스 마다 고정적으로 생긴다는 결혼이다.

image
image

프로세스 마다 4MB 공간을 필요로 하다는 말은 프로세스 마다 고정적인 4MB의 메모리를 사용한다는 말인데 이건 정말 큰 메모리이다. 위 계산은 한 프로그램이 4G를 다 사용 할 때의 계산으로 작은 메모리(100kb 미만 메모리 할당)만 사용하는 프로그램도 4M의 고정적인 메모리를 할당 하고 실행된다.
이에 작은 메모리를 사용하는 프로그램과 많은 메모리를 사용하는 프로그램들의 독립적 메모리 공간과 4G의 가상 메모리를 제공하고 각각의 사용 메모리별 형평성(?), 계산 속도 최적화를 밤낮 연구하다가 방법을 만들어 냈다. (밤낮 연구했는지 그냥 알고 있는 내용을 구현했는지 난 모른다. 똥 싸다가 생각해 냈는지도 모른다. 또는 그냥 어렵게 만들려고 했을지도 모르겠고.. 그냥 이런 방식이 있다는걸 제안했다..)

우선 4바이트를 가진 1024개의 배열을 만든다. 총 크기는 4kb 이다. 이걸 프로그램 실행 때마다 할당 한다. 4M에서 4kb로 1024배로 줄었다. 오~~~~~~~~~~~. 다이어트를 제대로 해 버렸다. 이건 다이어트 수준이 아니라 병수준이다… 흠… 여튼… 4M를 4kb로 줄이는 대신 복잡해 졌다. 뭐든 복잡한게 간단해지면 그 반대 급부로 무언가가 발생한다…(절대량은 변하지 않는다??? ㅋ)

자 , 이 4kb가 어떻게 4G를 공간을 표현하는지 살펴 보자.

우선 4byte 크기로 1024 개의 배열을 만든다. 이 배열의 각 인덱스(요소) 들은 또다른 4byte크기의 배열의 시작 주소를 가르킨다. 어렵지~~~ ㅋㅋㅋㅋㅋ… 1024개의 배열이 있는데 배열의 각 인덱스는 4byte크기의 1024 배열을 가지고 있다 라고 표현해도 어려울 것이다. 이건 그림으로…

image
1024개의 배열의 각 인덱스는 1024개의 배열의 첫 시작 주소를 가지고 있다. 1024의 배열의 크기가 4096 이고 각 배열 인덱스가 4byte 1024 배열을 가지고 있으므로 4096 + (1024 x 4096) 은??? 약 4Mb이다. 기존 4MB 고정 보다 4G 전체 할당 했을 시 보다 4kb 더 많긴 하지만 이렇게 하면 1Mb의 작은 메모리를 할당하는 프로그램들은 4kb + 4kb 즉 8kb만 프로그램 할당 되므로 뭐… 나름 괜찮다고 볼수 있다. 
왜 8kb 냐고??? 음… 프로그램 실행때 기본 생성되는 4kb와 첫번째 배열 인덱스 하나는 총 4Mb까지의 메모리를 가르킨다. 주소를 가르키는 4byte가 1024개 있으므로 4MB이다.
즉 첫번째 배열의 각각의 인덱스는 메모리 주소 4MB 제곱으로 메모리 주소를 가르킨다라고 할 수 있다.


이제 4G 주소 공간 표현을 개념적으로 알아봤으니 실제로는 어떻게 계산되는지를 알아보자.

주소를 나타내는 포인터는 4바이트이다. (당연하지 않겠나… 4G까지 가르킬려면 4바이트가 필요하다) 이 주소를 32비트로 표현해서 비트 23번째 비트부터 32번째 비트를 첫번째 배열 인덱스값. 13번째 부터 22번째 비트까지를 첫번째 배열이 가르키는 배열의 인덱스값으로 구분한다. 그리고 나머지 1번째 부터 12번째 비트는 오프셋 값으로 구분하면 된다.

image
이해를 돕기 위해 그림을 그렸다. 위 그림은 가상 주소 0x1234가 어떻게 실제 메모리를 가르키게 되는지를 표현한 그림이다.
1. 23bit~32bit가 0 이므로 첫번째 배열(주황색) 인덱스 0을 가르킨다.
2. 첫번째 인덱스 0은 두번째 배열(연두색)의 주소를 가르키고 있다.
3. 13bit~22bit는 1 번째 인덱스를 가르킨다.
4. 그러면 첫번째 배열 인덱스0이 가르키는 두번째 배열 1번째 인덱스를 가르킨다고 볼수 있다.
5. 두번째 배열 1번째 인덱스는 실제 메모리 주소를 가르키고 있다. 어느 주소인지는 모른다. 할당 할 당시에 주소이기 때문에 임의의 주소일 것이다. 이 임의의 주소에서 564번째를 가르킨다.
실제 메모리도 4096 단위로 나눠져 있는 주소 단위이다. 두번째 배열 1이 가르키고 있는 주소는 4096 단위로 정렬된 주소이므로 이 주소에서 564 오프셋 만큼 떨어진 지점을 가르키고 있다.


이 가상 주소 변환 작업은 고맙게도 CPU가 해준다고 한다. 아니 CPU안에 있는 MMU 라는 놈이 해준단다. 그리고 위 첫번째 배열 이니 두번째 배열이니 하는 배열도 각자 용어가 따로 존재한다. 
난 이해를 돋기 위해 배열 이라고 사용했다. (뭐…..프로그램상으로 배열로 처리…) 이는 배열이 아닌 테이블이라고 불린다. 또한 첫번째 배열이라고 칭했던건 Page Directory Entry(PDE)라고 하며 첫번째 배열 PDE가 가르키는 배열(테이블)은 Page Table Entry(PTE) 라고 불리고 있다.
각 프로그램마다 첫번째 배열. 즉 PDE 4kb가 할당되어져 있다. 이를 CPU가 어느 프로그램을 선택해서 실행이라는 나쁜(?)짓을 할려고 할 때 이 PDE를 CPU에 등록한다. 즉 CPU가 작업 하는 프로그램을 변경하는 시점(컨텍스트 스위칭 이라고 하는데…..후에….)에 PDE 테이블 주소만 설정해 주면 알아서 다 해 준다.




이로써 개념 설명은 끝났다.

지금까지 바람 OS는 보호모드로 진입후 키보드 처리 하는 단계까지 구현되어 있는데 이제 가상 메모리 처리를 함으로써 명실상부한 32비트 OS로 거듭날 예정이다. 물론 구현에서 제대로 된 동작까지는 ……휴…갈길이 멀다… 어떤일이 펼쳐 질지는… 또 한 2년 잠수할지도….





'프로그래밍 > OS 만들기' 카테고리의 다른 글

OS 만들기 #19 키보드 처리 및 쉬어가기.  (0) 2015.08.16
OS 만들기 #18 IDT - 3  (0) 2015.08.12
OS 만들기 #17 IDT - 2  (0) 2015.08.10
OS 만들기 #16 IDT - 1  (0) 2015.07.30
OS 만들기 #15 커널-키보드 입력  (0) 2015.02.09

그래….

내가 미친놈이다…

팔랑귀라서.. 회사 동료가 SONY 노트북 좋고 디자인도 이쁘다라는 말에 넘어가 2013년에 SONY 노트북을 거금을 들여서 구매했다.

뭐 그땐 그런대로 쓸만 했었지.. 다만, 키보드 치다 보면 자판 뜨거워 지는건 덤…. 여튼 이런저런 내 불만을 수용할 만한 제품이 있더라도 비쌀것이고 그냥 노트북 본연의 기능만 되면 된다는 생각에 잘 사용했다.

그런데 어느날 갑자기 윈도우 화면에 Windows 10 업그레이드 팝업 창이 뜨길래 마이크로소프트의 신작 소프트웨어 설치는 베타 테스터가 된다라는 생각하에 과감히 닫기.. 닫기.. 닫기.

근데 이게 반복 되니 귀찮아 졌다. 또 Windows 10 평판이 나쁜 편도 아니고 … 해서….업그레이드 동의…

그 때부터이다. 지옥이 시작된게…. 너무 느린 부팅 속도며, CPU는 3.0Ghz를 넘어가고 디스크는 100%로에 노트북 팬은 죽어라 돌아가며 가슴에 열불이 난 나의 거친 숨결과 함께 주위를 더 데워 주었다.
그래서 SONY 사이트로 접속… 헉… SONY가 노트북 사업을 접었네??? 이게 뭐야…


“팔아먹고 튀었다.”



그리고 Windows 10의 해당 제품의 지원은 안된다 라는 의미의 문구들.

고가에 산 노트북이 갑자기 폐품으로 떨어지는 순간이었다.

아…씨…………………………………………………………SONY 망해라…………………………


여튼 사용은 해야 할것이 아닌가? 그래 어떻게 해서든 쓸만하게는 만들어야 한다.

VAIO 컨트롤이니 뭐니 잡다한 쓰레기 SONY의 프로그램들부터 걷어 냈다. 아 놔~ 개떡같은 SONY. 쓰레기도 한 무더기로 쌓아났네…

그리고 SONY 사이트에 최소한의 양심이 있는지 남겨놓은 제품 최종 Windows 7 용 드라이버들을 각각 다운받아 설치했다. 어차피 Windows 10 에서 호환이 될테니….

그래도 나아지는점이 없었다…. 그렇게 노트북은 고이 접어 얼마 꽂혀 있지 않는 책들 사이에 영면(?)에 들었다.


VPCCB37FK의 사양

vpccb37fk사양





VPCCB37FK 의 검색으로 알아낸 사양

CPU : I7-2640M (2세대. 제조사에서는 램 8G가 최대라고 하나 CPU에서는 16G까지 확장 가능하다고한다)
메인보드 : HM65 Express (이젠 인텔에서 조차 지원안해서 드라이버도 없다. intel 6시리즈)
그래픽카드 : Intel HD 3000, AMD 6630M (HD3000 드라이버는 인텔에서 윈도우10 드라이버가 없다)


*******************************************************************************

VPCCB37FK 의 Windows 10에서 문제점 및 조치사항.

1. 부팅 속도가 현저히 늦다. 


  - Windows 7 기준으로 늦다. Windows 10이 아무리 무거워도…이리 늦을 수 있나? Windows 10 로고 화면 뜨고 데이터 읽는 표시인 원이 돌아가는 화면에서 검은 화면으로 전환 되고 한 20~30초 뒤에 로그인 창이 보인다. 
  - Windows10을 Windows 7에서 업그레이드해서 발생한 상황일것 같아 포맷하고 Windows 10을 설치했지만 같은 증상임.
  - 디스크 액세스에 따른 지연 현상으로 판단하여 SSD 로 바꾸었으나 같은 증상임.
  - 그래픽 카드 충돌로 인한 검은 화면으로 전환 될수 있다는 문제 보고를 읽었다. *드라이버를 최신으로 변경했지만 여전히 같은 현상.

  - 오늘도 부팅 시 검은 화면으로 전환 되었다가 한참 뒤에 로그인 창이 뜨는 문제에 대해서 깊이 뜯어보고 검색해 보았다. 보통 검은 화면으로 전환되었다가 한참뒤에 로그인창이 뜨는 문제는 그래픽 드라이버의 충돌 문제라고 한다. 그래.. 이말이 일리가 있는게 그래픽 드라이버를 설치 않할 때는 부팅이 빠르게 진행된다. 그래픽 드라이버의 문제로 판단하여, VPCCB37FK에 두개 달려있는 그래픽 드라이버를 하나씩 삭제해보았다. 그래도 똑같다. ..

역시나 이 문제는 고쳐지기 힘드나 보다라고 생각하다…
https://answers.microsoft.com/en-us/insider/forum/all/windows-10-black-screen-before-login-how-to-solve/c0806491-c3ac-440f-a2f5-db4b43d8adf7 이 주소의

Here is the fix for those with AMD and Intel HD 3000 video drivers and Windows 10
May work other configurations. I only fixed 3 different systems with similar configs.
Issue happens because the 2 video drivers don't play nice together. These steps fix that.
Also it is highly recommended to install the latest system BIOS.
Obtain DDU http://www.wagnardmobile.com/DDU/dow...0v16.1.0.1.exe. This removes the video drivers.
Obtain UnifL drivers https://sourceforge.net/projects/les...0.exe/download
1. Run DDU and remove AMD drivers, after restart remove Intel Drivers
Let DDU disable Windows automatic driver installs
2. Install Catalyst 16.2.1 UnifL This will give you a set of drivers.
3. Run UnifL-Automatic-Installation Assistant (as admin). This should install the Intel drivers
4. Run setup.exe from the AMD folder. Install ONLY AMD Display driver (no CCC)
Black screen delay is gone.

글을 보게 되었다… 오……

HD3000 인텔 그래픽카드와 AMD 카드.. 나랑 유사하다..

그래서 저 문구에서 하라는대로 했다.

ㄱ. Display Driver Uninstaller 다운로드. Catalyst_16.2.1_UnifL_V1.0 다운로드.
ㄴ. 안전모드 부팅 후 Display Driver Uninstaller 실행
ㄷ. 재부팅 후 Catalyst_16.2.1_Unifl_V1.0 실행. 재부팅

오~~~~~~~~~~~~~~~~~~~

부팅시 검은 화면에서 한참 대기 하는 문제가 사라졌다!!!!!!!!!!!!!

와우~

이걸로 문제해결!!!

이제 디스크 100% 문제만 해결하면~~~~~~ ㅎㅎㅎ

죽은 자식 살아난다..

그리고 SONY는 죽어라 씨발.



--------

       



2. 디스크 100% .

         
  - 바탕화면으로 전환되고 나서 팬이 요란하게 돌아가며 작업관리자 성능 부분을 보면 디스크가 100을 유지하고 있다. Windows 고유 기능 기본 서비스 기능이 디스크를 사용하고 있긴 하다.
그런데 100% 가 말이되나??? 이러다가 30분 정도 아무것도 안하고 두면 떨어진다.  이때부터 노트북을 어느정도 사용할 수 있다. SATA Controller Driver의 문제 인것으로 우선은 판단한다. 또는 하드디스크 문제(?)

  - 디스크를 SSD로 교체함. 그리고 기존 HDD는 기존에 달려있는 DVD 떼어 버리고 그곳에 D드라이브로 추가해서 달았음.
C드라이브 (SSD)에 한해서는 디스크 100% 발생안함. 그러나 D드라이브 엑세스 시점에도 디스크 100% 발생함. D드라이브 엑세스 시점에서는 Windows 버벅임. (폴더 보이거나 파일 리스트 보거나 등등)

  - SATA Controller Driver를 그나마 최신것으로 변경함. 장치 관리자에서 Intel Mobile Express Chipset SATA AHCI Controller 속성의 하드웨어 ID를 알아냄. PCI\VEN_8086&DEV_1C03&SUBSYS_9081104D 이 걸 가지고 구글에서 검색해서 2015-05-22일자 12.8.20.1002 드라이버를 설치함. (검색 도중 HP사이트에서 이 드라이버를 다운받았음… SONY 개새뀌.) 그러나 현상은 개선되지 않음.

2019.03.25

  하드디스크를 교체 하니 디스크 100% 현상이 사라졌다….

그렇다 ㅠㅠ

        

                                




불법 시디키를 썼던지 어떤 이유에 의해서 윈도우 10 시디키 변경을 하게 될 경우를 위하여 이곳에 기록한다.


1. 키보드에서 Window 키 + X 키를 누른 후 A 를 눌러  관리자 권한의 Windows Power Shell을 실행한다.


2. slmgr /cpky 을 입력하여 레지스트리에서 현재 라이센스 키를 삭제한다.


3. slmgr /upk 을 입력하여 컴퓨터에서 라이센스 키를 삭제한다.


4. slmgr /ipk [제품키] 를 입력하여 라이센스를 등록한다.


5. slmgr /dli 를 입력하여 라이센스 상태를 확인한다.


6. slmgr /xpr 을 입력하여 라이센스 유효 기간을 확인한다.




+ Recent posts