개인적인 일과 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년 잠수할지도….





그래….

내가 미친놈이다…

팔랑귀라서.. 회사 동료가 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% 현상이 사라졌다….

그렇다 ㅠㅠ

        

                                



+ Recent posts