LD_PRELOAD를 이용하여 함수들을 후킹하는 도중, 인자의 개수가 정해진 것이 아니라 가변적인 함수라면 어떻게 후킹을 해야 하는지 고민을 한 적이 있습니다. 대표적인 예가 printf, sprintf류의 포맷팅 함수들입니다. 이런 함수들은 포맷 문자의 개수에 따라 뒤따라 들어가는 인자의 개수가 계속 늘어날 수 있습니다. 이 포스팅에서는 이런 함수들을 LD_PRELOAD를 이용해 후킹하는 방법에 대해서 설명합니다.
우선 가변 인자 함수를 만드는 방법에 대하여 알아보아야 합니다. 관련된 내용은 여기에 자세히 잘 정리되어 있습니다.
위 내용을 참고하여 fprintf 함수를 후킹하는 코드를 작성하면 다음과 같이 나오게 됩니다.
위 코드와 LD_PRELOAD를 이용하면 바로 fprintf 함수를 후킹하는 것이 가능합니다. 하지만 아직 완전하지는 않습니다. 문제는 바로 원본 함수인 fprintf 함수를 실행시킬 수가 없기 때문입니다. 이미 스스로 fprintf 함수를 정의해버렸기 때문에 그냥은 libc 함수를 호출할 수 없고, 만약 dlsym(RTLD_NEXT, "fprintf")을 이용해 libc의 fprintf 함수 주소를 가져오면 실행은 시킬 수 있겠지만 fprintf는 말 그대로 가변 인자 함수이기 때문에 인자가 몇 개 들어갈지 알 수 없는 상황에서 사용할 수가 없습니다.
이럴 때 사용할 수 있는 대체 함수들이 libc에 정의되어 있습니다.
fprintf의 경우에는 vfprintf라고 하며, 이 두 함수의 선언부는 다음과 같습니다.
1
2
int fprintf(FILE *fp, const char * format, ...);
int vfprintf(FILE *fp, const char * format, va_list arg );
위와 같이 코드를 작성하고 위아래로 함수 실행 전과 후에 원하는 후킹 행위를 추가로 작성하면 원본 함수 실행에 영향을 미치지 않고 후킹을 수행할 수 있습니다. fprintf는 vfprintf라는 함수가 있었고, 이외에도 libc에는 vfscanf, vprintf, vsprintf등 가변 인자 함수에 대응하는 va_list 인자 함수들이 정의되어 있습니다. 이런 함수들을 후킹할 일이 있다면 위 함수들을 찾아서 가져다 쓰면 되겠습니다.
최근 개인적으로 리눅스 환경에서 C/C++을 혼합해서 쓸 일이 생겼는데, 그때 extern "C"를 사용하면서 알게 된 점들을 작성해 보려고 합니다. 해당 프로젝트는 'https://github.com/skyclad0x7b7/MiniHook' 요놈인데, LD_PRELOAD라는 환경변수를 이용하여 간단하게 함수들을 후킹하여 프로세스가 어떤 행위를 했는지 로깅하는 툴입니다. 윈도우 악성코드 자동 분석 시스템은 많이 만져 봤지만 리눅스는 한번도 해본적이 없었기 때문에 윈도우에서와 비슷한 방식으로 자동 분석이 가능하지 않을까 하여 만들어 보게 되었습니다.
우선 extern "C"란 무엇인가에 대해 알아보아야 합니다. extern "C"라는 키워드는 C++ 소스에서 선언한 전역 변수나 함수를 C에서 사용해야 할 경우에 쓰입니다. 그 이유는 함수명이나 특정 전역변수명을 '심볼'로 저장하는 방식이 다르기 때문입니다.
위의 간단한 소스코드를 예로 들겠습니다. test라는 함수 안에서 Hello World를 출력하고 종료하는 프로그램입니다. 위 소스코드를 각각 gcc와 g++로 컴파일하고, readelf 명령을 이용해 만들어진 바이너리 안의 심볼을 찾아보았습니다.
gcc로 컴파일한 경우 test라는 함수명이 그대로 출력되지만, g++로 컴파일한 경우 _Z4testv 라는 복잡한 이름으로 변경된 것을 볼 수 있습니다. 이는 C와 C++의 함수 특성에서 차이가 발생하기 때문입니다. C++에는 '함수 오버로딩'이라고 하는 기능이 있는데, 이는 같은 함수명이라고 하더라도 전달받는 타입이 달라진다면 새 함수로 선언 및 사용이 가능한 특징입니다. int func(int a)라는 함수와 int func(double a) 라는 함수를 둘 다 선언하고 정의하더라도 문제가 없게 된다는 것입니다. 하지만 이렇게 했을 시, func라는 함수명만으로 해당 함수들을 구별하는 것이 불가능해집니다. 그래서 C++ 컴파일러들은 각 컴파일러마다 자신들만의 규칙으로 함수 이름을 변경합니다. 이것을 '네임 맹글링(Name Mangling)'이라고 합니다.
이렇게 네임 맹글링이 되는 대상은 함수만 있는 것이 아니고, 심볼을 통해 접근해야 하는 전역변수도 똑같이 적용됩니다. 여기서 몇번 테스트를 거치며 깨달은 점이 있는데, C++ 소스에서 선언한 전역변수라고 하더라도 모든 전역변수가 다 네임 맹글링이 되지는 않는다는 점입니다.
test.h에서 선언한 전역변수를 test.cpp에서 가져다가 정의하는 소스코드입니다. 위 소스코드를 컴파일한 후 마찬가지로 readelf로 심볼을 확인해보겠습니다.
실제로 네임 맹글링이 적용된 것은 std::string 타입인 TestString과 std::vector<std::string> 타입인 TestVector뿐이라는 것을 알 수 있습니다. 단순 int형이었던 TestInt의 경우에는 네임 맹글링이 적용되지 않았습니다. 여기서 예측 가능한 것은 C에서도 사용하는 일반적인 타입들(함수 포인터, 기본 타입 변수들)의 전역변수의 경우에는 네임 맹글링이 적용되지 않는다는 것입니다.
또 이걸 조사하다가 스택오버플로우에서 재밌는 글을 하나 발견했는데, 바로 static 전역변수의 경우는 일반적인 C 타입의 변수라고 할지라도 네임 맹글링을 진행한다고 합니다. 사실 잘 생각해 보면 당연한 것인데, static 전역변수라고 함은 다른 소스코드에서는 접근할 수 없는 변수이므로 다른 소스코드 안에 같은 이름을 가진 다른 변수가 있을 수 있기 때문에 충돌을 피하기 위해 맹글링을 하는 것이 맞습니다. 또한 저 답변의 implicitly static 이라는 말이 뭔가 해서 다시 조사를 해 봤습니다.
결론만 말하면, C++에서 전역변수에 static const를 붙이는 것과 const만 붙이는 것은 동일한 동작을 합니다. 즉 const로 선언한 전역변수의 경우에는 extern 키워드를 붙여주지 않는 이상 static 변수로 취급되기 때문에 네임 맹글링이 진행됩니다. 여기까지 정리하면 C++에서 전역변수로 선언한 일반 타입의 변수들의 경우, const 혹은 static 변수에 대해서만 네임 맹글링이 진행된다고 볼 수 있겠습니다.
어쨌든 네임 맹글링이 되는 조건은 이렇게 된다고 치고, 다시 돌아와서 이런 이유로 네임 맹글링이 일어나기 때문에 C++ 헤더 안에서 test라고 선언한 함수를 C에서 그대로 가져다 쓰려고 하면 네임 맹글링에 의해 변환된 심볼을 알 방도가 없기 때문에 에러가 발생할 수밖에 없습니다. 이를 가능하도록 해주는 것이 extern "C" 키워드입니다. extern "C"를 이용하여 변수나 함수를 선언할 경우 네임 맹글링이 진행되지 않습니다.
재작년, 그러니까 2017년 11월에 친구 둘과 짧게 도쿄 여행을 다녀온 이후 처음으로 해외여행을 갔다왔습니다. 처음으로 나가는 나홀로 해외여행이었지만 목적지가 이미 한번 간 적이 있는 도쿄인데다 일본어에는 자신이 있었기 때문에 아무런 걱정 없이 길을 나설 수 있었습니다. 이번 여행의 주 목적은 애니메이션 '내 여동생이 이렇게 귀여울리가 없어'의 성지순례(무대탐방)였습니다. 성지순례란 작중에서 배경으로 등장한 장소에 실제로 가보는 것을 뜻하는데, 내여귀의 경우 치바 현과 도쿄가 주 무대였으므로 이번에는 도쿄로 가기로 했습니다. 치바 현도 가야 하지만 시간과 체력상 나중에 가는 걸로 했습니다. 성지순례 관련 내용은 따로 포스트로 올렸으므로 여기서는 여행 자체에 대한 내용만 작성합니다.
출국하는 비행기 안에서의 한 컷. 저번 2017년 11월 첫 도쿄 여행때는 저가항공사를 탔었는데 이번에 아시아나 항공을 타보니 확실히 비교가 됩니다. 일단 좌석의 앞뒤가 확실히 넓어져서 앉는게 편해졌고, 비행기 자체가 무척 크고 시설도 깔끔합니다.
무엇보다 무려 기내식이 나옵니다. 제육덮밥이었던것 같은데 맛은 그냥저냥 근처 식당에서 먹는 듯했습니다. 먹을때 음료를 선택 가능하고, 다 먹고 나면 커피도 줍니다.
나리타 공항에 도착하면 보이는 여러 나라의 인삿말들입니다. 이제 입국심사를 하고 오늘의 숙소로 이동합니다.
나리타 공항 제 2터미널 지하 1층에 있는 나인아워스라는 캡슐호텔인데, 제 1터미널에서 셔틀버스를 타면 바로 제 2터미널까지 올 수 있습니다. 제 2터미널에서 안내데스크에 나인아워스 호텔의 위치를 물어 찾아갔습니다. 숙박비는 1박에 5000엔정도 나왔네요.
나인아워스 호텔에 대한 정보들은 인터넷에 잘 나와있으니 스킵하고, 저는 이번에 일본에 도착한 후 바로 편의점에서 충전기를 살 생각이었는데 막상 들어오고 잠옷으로 갈아입고 나니 나가기가 애매해져서 그냥 아무것도 하지 않고 자기로 했습니다. USB를 꽂아서 바로 충전 가능한 포트는 없고 110v 콘센트만 있어서 휴대폰이나 카메라는 전혀 충전하지 못했네요. 그래도 10000mAh짜리 보조배터리를 들고온 덕분에 별 문제는 없었습니다.
나인아워스는 캡슐호텔인 만큼 주변 소리가 무척 잘 들리고, 마찬가지로 내 소리가 남들에게 잘 들릴 것이라는 부담감이 느껴져 지내기가 좀 불편했습니다. 화장실이나 샤워실 시설은 더할 나위 없이 잘 되어있었지만 면도기나 로션 등의 화장품 제공은 되지 않습니다. 딱 하루 지내기에 괜찮지만 연박은 힘들 것 같네요. 도착하고 적당히 나리타 공항 성지순례를 하다가 호텔 들어와서 바로 잤습니다.
뒤척이면서 제대로 잠은 못 잤지만 아침 일찍 일어나서 샤워를 한 후, 체크아웃을 하고 3박을 할 예정인 '토요코인 칸다 아키하바라'까지 가기 위해 스카이액세스를 타러 갑니다. JR패스라거나 뭐 여러가지 교통비를 아끼는 방법은 있겠지만 저는 그런거 생각하면서 다니는게 귀찮아서 그냥 스이카를 사서 충분히 돈을 충전해놓고 다녔습니다. 위 사진의 동그라미 친 곳에 스이카 자동판매기가 있습니다.
스카이액세스라고 해서 모든 차량이 다 제가 원하는대로 아사쿠사바시나 히가시니혼바시 역까지 가주지는 않습니다. 역중에서도 羽 표시가 붙어 있는 '하네다 공항 방면'의 스카이액세스를 타야 하는데, 배차 간격이 무척 넓으니 주의해서 타야 합니다. 저는 운 좋게도 몇분 후에 오는 열차가 있어 바로 탑승이 가능했습니다.
스카이액세스를 타고 그대로 달려 히가시니혼바시 역에서 내린 후 수백 미터를 걸어 도착한 숙소 '토요코인 칸다 아키하바라'입니다. 토요코인은 전 세계에 퍼져 있는 비즈니스 호텔인데, 토요코인 클럽카드에 가입하여 회원이 되면 여러 가지 좋은 혜택이 따라오므로 꼭 가입하는 것을 추천드립니다. 들어가서 캐리어만 맡겨두고 아키하바라로 출발했습니다.
하필이면 여행으로 잡아놓은 5일 중 하루를 제외한 모든 날이 비가 와서 날씨가 꿀꿀한 상태였습니다. 비도 조금씩 내렸지만 금방 그쳐서 우산을 살 필요까지는 없었습니다. 이 강은 호텔에서 아키하바라 역까지 가기 위해서는 꼭 건너야 하는 곳이라 나중 가서는 그냥 친숙해졌습니다.
역시 아키하바라. 덕들의 성지. 요즘 유행하는 만화 & 애니메이션인 '오등분의 신부'입니다. 안봐서 모르기는 하지만 왼쪽 밑의 '니노'라는 캐릭터의 성우가 '타케타츠 아야나'라는 걸 듣고 안봐도 최애캐는 저 아이가 될 거라는걸 예상했습니다. 애니메이션 작화 및 연출 문제로 말이 많던데 볼지 말지 고민되네요.
아키하바라의 명물 라디오 회관입니다. 볼때마다 왠지 사진을 꼭 찍어가고 싶게 생겼습니다.
적당히 길에서 한 컷... 사실 이것도 성지순례용으로 찍은 것 같기는 한데 잘 기억이 안나므로 패스합니다.
왼쪽에는 요즘 유행하는건지 어마금 3기나 주문토끼 등 애니메이션이 그려진 광고와 메이드 카페 광고판이 보입니다.
UDX 부근 성지순례 도중 발견한 케모프레 관련 스티커가 붙여진 문. 무슨 가겐지는 모르겠지만 열심히 이 가게에는 레어 아이템이 있다면서 홍보하는 모습입니다.
인터넷으로 아키하바라 맛집을 검색할 때마다 나오는 긴조 스시. 얼마나 맛있는지 보려고 11시쯤 찾아가봤는데 '마다 다메(아직 안돼)' 라면서 내보내더군요.
배는 고프고 찾아간 가게는 아직 미영업 상태고 해서 그냥 근처 식당 들어가서 가츠동이나 시켜 먹었습니다. 갓 만들어서 그런지 적당히 싸게 먹을만 했습니다. 가격은 490엔.
계속 돌아다니다가 다리가 아파서 호텔 체크인 시간인 오후 3시까지 아키하바라 역 Atre 3층에 있는 스타벅스에서 콜드브루 한잔 마시면서 시간을 때웠습니다. 한국이나 일본이나 스타벅스 커피 맛은 똑같더라구요.
적당히 돌아다니다 체크인 시간이 되서 들어온 토요코인 호텔입니다. 비즈니스 호텔인 만큼 넓거나 하지는 않지만 있을건 다 있고 깔끔합니다. 딱 혼자 다닐때 편하게 지내기 좋은 호텔이네요. 단점이라면 방 문을 열 때 열쇠가 잘 안돌아가서 힘들었다는 점과 의외로 방음이 그렇게 잘 되지는 않아서 복도에서 나는 소리가 잘 들린다는 점입니다.
저녁 먹으러 나가면서 한 컷. 딱 호텔과 아키하바라 사이에 있는 사거리라 자주 보게 되는 건물입니다.
저녁을 먹으러 아까 갔다가 퇴짜맞았던 긴조스시에 입장 성공했습니다. 메뉴는 여러가지가 있기는 한데 잘 모르겠고 왼쪽 위에 있는 여러가지 다 나오는 세트메뉴로 골랐습니다. 저기에 200엔짜리 콜라 한잔 더해서 총 200엔정도 나왔습니다.
수조에서 자신의 운명도 모른채 헤엄치는 싱싱한 물고기...
자기 자리 앞쪽에 저렇게 번호가 씌여진 팻말을 하나 놔주는데, 이걸 들고 카운터로 가면 계산을 해줍니다.
한화로 20,000원에 육박하는 가격의 스시인데 총 10피스 나옵니다. 종류는 제각각인데, 성게알은 처음 먹어봐서 신기한 맛이었네요. 약간 쓰지만 못 먹을 정도는 아니었고 그냥 제 취향은 아니었던걸로...
이쿠라(いくら)라고 불리우는 연어알입니다. 영롱하네요. 히나마츠리라고 하는 만화 & 애니메이션에서 주인공인 히나가 그렇게 좋아하는 음식인데 저는 별로였습니다.
총평은 그저 그런 스시 가게... 맛집이라고 불릴 정도는 아닌 것 같습니다.
저녁식사 후 시부야로 가는 길에 발견한 뱅드림 포스터가 붙여진 전철입니다. 역시 일본...
안그래도 밤의 시부야는 사람이 많은데, 일본인 친구에게 듣자하니 하필이면 월급날 바로 직후의 금요일 밤이라 시부야에 사람이 미어터졌습니다. 신호가 바뀔 때마다 우르르 몰려다니는데 정말 휩쓸려서 파도를 타는 느낌이었습니다.
빌리지뱅가드라는 잡화점에서 발견한 대한민국의 맛, 불닭볶음면입니다.
일본인들에게 핵불닭을 팔다니 일본인을 전부 죽일 셈입니까.
여기서 머그컵 한세트와 AliA라는 신인 밴드의 앨범을 하나 구매했습니다. AliA는 위의 밴드인데, 특이하게도 전자바이올린 담당이 한명 있어서 노래에 신비감을 더하더라구요. 듣자마자 반해버려서 구매했는데 특전으로 친필 사인지까지 받아서 무척 기분이 좋았습니다.
그 다음으로 들린 시부야의 명물 타워레코드입니다. 생각했던것보다 그리 별건 없었네요. 제가 찾던 우타이테 하나땅이나 유이콘누의 앨범이 전혀 없었던게 좀 실망스러웠습니다. 오히려 아마츠키나 게로같은 남성 우타이테의 앨범은 많았는데 어째서 저 두분이 없는걸까요.
시부야에서의 쇼핑을 마치고 호텔로 돌아와서 도수 3%짜리 음료수(술)인 호로요이를 마시고 잤습니다. 이것도 한국에서 사면 3000원은 하는 녀석인데 일본에선 150엔이면 사더군요;
토요코인에서 처음으로 자고 일어났는데, 한국에선 그렇게 일어나려고 해도 졸려서 못일어나더니 여행 왔다는 흥분으로 인한 아드레날린때문에 알람 시간보다 오히려 30분 일찍 눈을 뜨고 말았습니다. 미친듯이 걸어다닌 덕분에 다리도 아프고 온몸이 쑤셨지만 어쨌든 일어나서 샤워 한번 하고, 바로 오다이바로 향했습니다.
오다이바로 가기 위해 지하철역으로 향하던 중, 위에서 찍었던 강을 다른 곳에서 찍어본 샷입니다. 확실히 날이 개니까 사진이 훨씬 산뜻해지네요. 참고로 토요코인과 가까운 지하철역은 아사쿠사바시와 히가시니혼바시 역으로 총 두개가 있는데, 둘 다 아사쿠사선 라인이고 거리도 크게 차이는 없지만 아사쿠사바시가 약간 더 가깝습니다. 이 강도 아사쿠사바시와 토요코인 사이에 있습니다.
아사쿠사선을 타고 조금 올라가서 신바시 역까지 도착하면 유리카모메로 환승이 가능합니다. 오다이바로 갈수 있는 가장 빠르고 간편한 방법이므로 사실상 타는 것이 필수인데, 이게 JR선이 아니라서 여러 패스들로 통과가 불가능합니다. 하지만 스이카는 만능이기 때문에 여기서도 문제 없이 탈 수 있습니다. 귀찮은거 싫어하시는 분들은 그냥 스이카 쓰세요. 유리카모메는 가장 앞과 뒤쪽 칸이 이렇게 유리로 되어있기 때문에 사진을 찍기 좋은 각이 자주 나옵니다.
원래는 빅사이트쪽부터 돌면서 내려오려고 했지만 빨리 내려서 사진을 찍고 싶은 마음에 다이바 역에서 내려서 돌아다니며 사진을 찍었습니다. 아침 8시가 조금 넘은 시간이었음에도 주말이라 그런지 사람이 좀 있었습니다. 원래 저 아쿠아 시티에서 밥을 먹으려고 했는데 왠일로 배가 고프지 않아서 결국 오다이바에서는 식사를 하지 않았습니다.
아쿠아시티 바로 옆에 있는 자유의 여신상(가짜)입니다. 당연하게도 실제 자유의 여신상보다 크기는 한참 작습니다. 요 주변이 사진찍기 좋은 스팟이라 관광객들이 많았고, 특히 이거 찍을때 한국인 여행객 한분이 옆에서 셀카를 찍고 계시더라구요.
성지순례용으로 들렀던 마린하우스입니다. 아침이라 뭔가 문을 연 곳은 없었고 일본에는 흔히 있는 자판기들이 늘어서 있습니다. 아침이라 좀 쌀쌀하기도 했고 커피가 땡겨서 따뜻한 블랙커피를 뽑아 마셨습니다.
마린하우스 바로 옆에 있던 이상한 석상. 뭔진 잘 모르겠습니다...
요 주변이 해안가라서 풍경사진 찍기 참 좋습니다. 바다를 배경으로 찍은 사진만 수십장이지만 적당히 골라서 올립니다. 아침에 바닷바람 맞으면서 여유롭게 걷는것도 나름 기분 좋았습니다.
계속 걷다가 시계가 하나 있길래 배경에 넣고 찍어봤습니다. 대강 9시 50분쯤 되는 시각이었네요.
성지순례 장소가 도무지 찾을 수 없어서 계속 헤매던 도중 바닥을 보니 관계자 외 출입 금지라고 되어 있어 급하게 빠져나왔습니다. 요 주변에서만 세 군데가 넘는 스팟이 있는데 주변이 다 공사중이라 어쩔수 없이 포기해야 했네요.
성지순례하러 들어갔던 공원에서 나오다가 발견한 분수. 예뻐서 한컷 찍었는데 옆에서 다른분도 사진을 찍어가셨습니다.
계속 걷다보니 왠지 사람이 비정상적으로 많아서 잘 보니 이 날 오다이바에서 마라톤이 있었더군요. 그래서 계속 무척 많은 사람들이 뛰어다녔습니다.
나름 유명한 오다이바의 대관람차...
웅장함을 자랑하는 도쿄 빅사이트입니다. 매년 여름과 겨울, 여기에서 코미케가 열리고 사람들로 가득해진다고들 하죠. 언제 한번 코미케때 와보고는 싶은데...
가까이서 보니 웅장함 + 100
오다이바를 충분히 다 돈 후에 호텔로 돌아와 아키하바라 역 옆에 있는 '모토무라 규카츠'에서 밥을 먹었습니다. 규카츠는 처음 먹어봤는데 일본에서 먹어본 음식 중 가장 맛있었습니다. 기본이 130g이고 더블이라고 하여 260g짜리도 시킬 수 있는데, 위 사진은 기본인 130g짜리를 시킨 모습입니다. 양이 꼭 괄도네넴띤처럼 하나는 좀 적고 두개는 많더군요. 결국 다음날 와서 260g짜리로 시켜다가 배부르게 먹고 나왔습니다. 밥은 한번에 한해서 리필이 가능합니다.
비도 안오고 맑아서 훨씬 기분좋고 산뜻하게 돌아다닐 수 있었던 아키하바라의 하늘입니다.
음반 사려고 여기저기 돌아다니다가 발견한 최애 성우 타케타츠 아야나. 노래는 잘 못부르지만 귀여우면 됐지 뭐 어떻습니까...
토라노아나였던가, 잘 기억은 안나는데 분명히 덕후들 책 파는 곳이었는데 어째선지 Javascript나 Firebase같은 익숙한 단어들이 등장하는 프로그래밍 참고서적들... 어째서 이런 것이 있는 것인가;
저녁엔 킨시쵸도 들렀지만 거기선 성지순례만 하고 바로 빠졌으니 패스하고, 오시아게에 있는 스카이트리에 가서 성지순례 + 사진촬영 하고 왔습니다. 올라가보고 싶긴 했는데 돈도 들고 다리도 아파서 빨리 돌아가고 싶었습니다.
시간이 좀 남은 김에 아사쿠사에 들리려고 지하철을 탔다가 발견한 벚꽃 아쿠아리움 포스터. 마침 딱 오픈한 직후라 다음날 시간 남을때 가볼까 싶었지만 결국 그 계획은 세워지지도 못했습니다.
1년 반만에 보는 센소지 신사. 별건 없지만 그냥 이쁩니다.
오미쿠지를 뽑았는데 길이 나왔네요.
해석은 귀찮아서 굳이 하진 않았습니다.
1년 반 전에 왔던곳을 추억삼아 돌아다녀 봤습니다. 저번 여행의 마지막 쇼핑을 장식했던 돈키호테입니다.
저번 여행에 묵었던 호텔. 시설도 좋고 깔끔했던 기억이 남아있습니다. 밑에서 파는 음식은 무척 비쌌지만...
그리고 아사쿠사에 온 주 목적인 타코야끼집. 저번 여행때 여기서 타코야끼를 먹었던 것을 기억하고 있어 다시 한번 찾아와 봤습니다.
주인 아주머니께 재작년 11월에 여기에 왔었고, 다시 여행 온김에 이 타코야끼가 기억나서 한번 들렀다고 했더니 기억해줘서 고맙다며 다음에 또 와달라고 하셨습니다. 언제가 될지 모르지만 다시 도쿄에 여행 오면 또 센소지 신사는 오게 될테니 한번쯤 다시 가보는것도 좋아 보이네요.
호텔로 돌아오면서 찍은 밤하늘. 보통이라면 잘 안보이지만 카메라 설정을 여기저기 만져 주니 어두운 하늘도 잘 보이게 찍히는게 신기했습니다.
이 날은 아침부터 비가 내렸습니다. 비때문에 가장 다니기 불쾌하고 힘들었던 날이기도 합니다.
4일차는 뭐 아키바에서 돌아다니면서 친구들한테 부탁받은 물건들도 사고 여러가지 부족했던 덕질물품도 사고 나서 바로 끝나버린 터라 사진 찍은게 거의 없네요;; 굳이 따지면 저 사진 한장이 있는데 아침에 비와서 우산 하나 사서 아키하바라로 향하는 도중 '다케시마', '반공'이라고 씌여진 차에서 무척 웅장한(마치 북한 노래 같은) 노래가 엄청 크게 울려 퍼지면서 다녔기 때문에 한번 찍어본 겁니다. 일본에도 한국에도 저런 사람은 여전히 남아있구나 하는 생각이 듭니다.
5일차는 바로 한국으로 돌아오기 위해 나리타 공항에 일찍 도착하여 면세점에서 엄청나게 많은 쇼핑을 하고 비행기에 탑승했습니다. 아시아나 항공에 대해 딱히 나쁜 감정 없이 잘 이용했었는데 나리타 공항에서 셀프 수화물 시스템도 갖춰져있지 않았고 직원들이 너무 늦게 와버린 것 때문에 체크인 후 1시간동안 아무것도 못한채 기다리다가 겨우 탑승동으로 이동할 수 있었습니다.
면세점에서는 친구가 부탁한 아이코스 담배와 헤네시 XO, 그 외 각종 과자나 기념품을 사서 들어갔습니다. 양이 어마어마했던 터라 혹시나 세관에서 걸리지 않을까 걱정을 좀 했습니다.
요건 비행 도중 창문에서 발견한 이상한 구멍인데... 바깥쪽에서 무언가가 유리 일부를 뚫고 박힌 듯한 모습이었습니다. 괜히 무척 불안해졌었네요. 인천공항 도착 후에는 캐리어에 가방에 커다란 쇼핑백까지 딱 세관에 걸리기 좋은 모습이었지만 별 문제 없이 통과하여 집까지 돌아올 수 있었습니다. 무척 피곤한 여행이었지만 사진도 많이 찍었고 사온 것도 많고 즐거웠습니다.
친구가 사달라고 해서 구매한 칼로리메이트 * 10, 버터간장.
컵라면 두 종류와 밑의 모에한 라면은 그냥 사고 싶어서 개인용으로 산 녀석입니다. 특히 저 아래의 라면의 경우 2개 들어있는 주제에 거의 1000엔에 육박하는 가격이었지만 트위터나 픽시브에서 예쁜 그림을 자주 그려주시는 커피귀족이라는 일러스트레이터의 그림이었기 때문에 눈 딱 감고 질렀습니다.
케이온! 히라사와 유이 & 나카노 아즈사 피규어. 작품 자체가 꽤 오래됐다 보니 이제 피규어나 각종 굿즈들도 찾아보기 힘들게 되었습니다. 요즘 대세는 뱅드림 / 아이마스 / 러브라이브이기 때문에... 어쨌든 전부터 아즈사 피규어는 하나 갖고 싶었고 같은 종류 피규어가 함께 있는 김에 같이 사버렸습니다. 특히 아즈사가 들고 있는 저 머스탱의 경우 실물이 집에 있는 만큼 더욱 가치가 높네요. 다만 기타에 줄이 걸려 있지 않아서 디테일은 조금 떨어지는게 아쉬웠습니다.
휴족시간과 센카 퍼펙트휩 클렌징 폼. 휴족시간은 일본에서 밤에 쓰다 남은것을 가져온 것이고, 센카의 경우 직접 쓰려고도 샀지만 친구들이 사다 달라고 한게 좀 있어서 여러개 들어있는걸로 사왔습니다. 확실히 좋은 클렌징 폼입니다.
각종 앨범류 1.
4월은 너의 거짓말의 앨범은 정말 꼭 사고싶었던 것이었기 때문에 두개 합쳐서 1만엔이라는 가격에도 전혀 신경쓰지 않고 질렀습니다. 나머지 앨범들도 좋아하는 곡들이라 보자마자 질렀습니다. 그중에서도 특히 눈물났던건 하나땅의 앨범(상단 오른쪽에서 두번째). 저 앨범은 2013년에 발매된 것으로 정말 찾기 힘든 녀석인데다 좋은 곡들이 많이 수록된 앨범이라 꼭 사고 싶었습니다.
각종 앨범류 2.
데코니나의 사랑 미혹 엘레지와 라이브튠, 케이온의 앨범입니다. 셋 모두 정말 좋아하는 아티스트이기 때문에 망설임 없이 질렀습니다.
귀여운 목소리 덕분에 항상 유튜브에서 즐겨 듣고 있는 리카님의 앨범과, 방송 도중 한번 귀엽다며 보여준 적이 있던 머그컵입니다. 앨범은 아니메이트에서, 컵은 빌리지뱅가드에서 구매했습니다. 컵 찾느라고 고생을 좀 했네요. 앨범의 경우 딱 저거 하나만 남아있고 최근에 발매된 '吾輩は利香である'는 없어서 너무 아쉬웠습니다.
빌리지뱅가드에서 위 앨범을 찾다가 귀에 들어와서 확 꽂혀버린 신인 밴드 AliA의 앨범과 친필 사인지입니다. 보컬이나 멤버들 연주가 무척 시원시원한데다 특이하게도 멤버에 전자바이올린을 쓰는 사람이 있어서 곡이 무척 환상적인 분위기를 내줍니다. 듣자마자 반해버려서 지금도 무한재생중인 아티스트입니다.
친구가 사다달라고 부탁한 아이코스와 제가 먹으려고 한 헤네시 XO입니다. 1리터짜리도 있었지만 예산도 좀 아슬아슬해지고 도수 높은 술인데 그렇게 많이 살 필요까진 없을 것 같아서 그냥 350ml짜리로 샀습니다. 달콤한 과일향이 나는게 정말 좋습니다.
그 외 면세점에서 구입한 각종 과자와 아키하바라 티셔츠입니다. 어쩌다보니 잔뜩 샀는데 언제 다 먹을지 모르겠네요.
친구 부탁으로 아키하바라 애니메이트에서 구매한 '일하면 패배' 티셔츠.
마찬가지로 친구가 사달라고 했던 렘 태피스트리. 원래 다른 일러스트 태피스트리를 사달라고 했지만 찾을 수가 없어서 이걸로 대체했습니다. 이건 호텔에서 휴대폰으로 찍은 사진입니다.
이번 여행의 주 목적은 제목에도 씌여있듯이 내여귀의 성지순례(무대탐방)이었습니다. 본래라면 치바도 성지순례 장소에 포함되어야 하나, 여행 기간이 애매하게 짧고 체력적으로 뒷받침이 되지 않을 것 같아서 치바는 나중에 내청코 성지순례하면서 같이 하기로 했습니다. 도쿄 자체도 워낙 넓어서 일부 지역은 제외하고 크게 아키하바라/시부야/킨시쵸/오시아게/오다이바 + 나리타 공항 총 6가지 지역을 돌기로 하고 계획을 잡았습니다. 이 포스트에서는 실제 다녔던 시간 순서별 지역의 성지순례 사진 및 애니메이션 스크린샷을 첨부하며, 구체적인 여행 내용은 다른 포스트에서 작성하겠습니다.
※ 성지순례 글의 특성상 스포일러가 대량 포함되어 있습니다. 주의하시기 바랍니다.
성지순례는 위의 지도를 참고하였습니다.
나리타 공항 (成田空港)
애니메이션 내에서는 1기 15화에서 쿄우스케가 키리노를 데리고 올 때 딱 한번 등장한 장소입니다. 코우사카 가가 위치한 곳이 치바이며, 이곳은 하네다보다는 나리타 공항과 가깝기 때문에 작중에서도 여기를 사용한 것 같은데 이번 여행에서 제가 사용한 공항도 나리타였기 때문에 상당히 편하게 성지순례를 다닐 수 있었습니다. 이곳의 경우 공항이라는 특성 때문인지 작중 장면과 크게 달라진 부분은 없었습니다.
나리타 국제공항 제 1터미널 남쪽 윙 4층 외부
1기 15화
나리타 국제공항 제 2터미널 1층 A존
1기 15화
나리타 국제공항 제 2터미널 1층 A존
1기 15화
나리타 국제공항 제 2터미널 1층 A존
1기 15화
나리타 국제공항 제 2터미널 1층 A존
1기 15화
나리타 국제공항 제 2터미널 2층 A존
1기 15화
아키하바라 (秋葉原)
이 작품의 메인 무대라고도 할 수 있는 덕후들의 성지, 아키하바라입니다. 이번 여행에서 가장 많은 시간을 보냈고 가장 많은 돈을 쓴 곳이기도 합니다. 장소 특성상 찍어야 할 사진은 무척 많았지만 막상 찍으려고 보니 너무 변해버려서 찾을 수 없거나 차가 다녀서 찍을 수 없는 위치의 성지도 있었기에 못 찍은 사진도 많아서 아쉬웠습니다.
아키하바라 AKB48 카페
2기 1화
아키하바라 UDX 앞
1기 10화
아키하바라 UDX 앞
1기 10화
아키하바라 UDX 앞
1기 10화
아키하바라 UDX 앞
1기 10화
아키하바라 UDX 앞
1기 15화
아키하바라 UDX 주차장
1기 10화
아키하바라 가챠폰 회관
1기 2화
아키하바라 게이머즈 본점
2기 4화
아키하바라 맥도날드 앞
2기 16화
아키하바라 맥도날드 앞
2기 16화
아키하바라 애니메이트 앞
2기 14화
아키하바라 타이토 스테이션 앞
2기 오프닝
아키하바라 역 전기상점가출구 부근
1기 12화 TRUE ROUTE
아키하바라 역 전기상점가출구 부근
1기 오프닝
아키하바라 역 전기상점가출구 부근
2기 1화
아키하바라 오노덴 본관
2기 4화
2기 OP 만세이 다리 교차로
이건 꼭 찍고 싶었는데 차가 다니고 있어서 못찍었네요. 분명 아키바에 차가 다니지 않는 날이 있었던 걸로 기억하는데 제가 갔던 날은 늘 차가 다니더군요...
시부야 (渋谷)
작중 그리 많은 비중을 차지하지는 않는 시부야입니다. 하필이면 간 날이 3월 1일, 월급날 직후의 금요일 밤이라 안그래도 밤에 사람이 넘쳐나는 시부야가 정말 사람으로 가득했습니다. 촬영이 끝나고 빌리지뱅가드와 타워레코드에서 쇼핑도 했는데 이날은 정말 너무 많이 걸어서 힘들어 죽는줄 알았습니다.
시부야 109
1기 10화
시부야 역 하치코 동상 앞
1기 10화
재밌게도 동상 밑에 고양이 두 마리가 누워있어서 안그래도 많은 인파가 다 몰려있어서 사진 찍기 참 힘들었습니다.
시부야 역 앞
1기 10화
오다이바 (大台場)
카나코가 제프 도쿄에서 공연하거나, 아야세가 모델 일을 하거나, 코미케가 열리거나 등 많은 일이 일어나는 장소입니다. 실제로 도쿄 여행 시 관람 장소로 주로 거론되는 장소인 만큼 성지순례 외에도 사진을 잔뜩 찍었습니다. 아침 8시에 호텔에서 나와서 바닷바람 맞으면서 걷는 것도 상당히 기분 좋았습니다.
오다이바 국제전시장역 앞
2기 5화
오다이바 시오카제마루
1기 9화
실제로 가보니 주변은 전부 공사중이고 저 구조물도 사라져서 바위만 남아있더군요 ㅠㅠ
오다이바 야구라 다리
2기 6화 엔딩
오다이바 마린하우스
1기 9화
오다이바 이스트 프롬나드
1기 4화
오다이바 이스트 프롬나드
1기 4화
오다이바 제프 도쿄
2기 10화
오다이바 제프 도쿄
2기 10화
제프 도쿄 반입구 옆
2기 10화
제프 도쿄 반입구 옆
2기 10화
제프 도쿄 반입구 옆
2기 10화
킨시쵸 (錦糸町)
제 기억상으론 작중 단 한 번 등장하고, 가장 결정적인 장면이었습니다. 2기 14화에서 쿄우스케가 키리노에게 고백하는 장면이었죠. 가장 인상깊었던 장면이었기 때문에 꼭 찍고 싶었던 곳이었고, 오다이바->킨시쵸->오시아게 순으로 올라가는 길에 마침 있던 장소이기 때문에 열심히 가서 찍었습니다. 완전히 밤이 되지 않은 시간대였기 때문에 제대로 분위기가 나지 않았던 게 아쉽네요.
Parlour 미토야 4층
2기 14화
미토야가 어떤 건물인가 했더니 파칭코 가게였던 듯 합니다.
요렇게 생긴 가게이니 혹시 가실 분은 참고하시면 되겠습니다.
킨시쵸 역 앞
2기 14화
킨시쵸 역 앞
2기 14화
킨시쵸 역 앞
2기 14화
지금보니 흔들렸네요 ㅠㅠ
오시아게 (押上)
스카이트리가 있는 곳입니다. 대부분 스카이트리가 배경인 관계로 그냥 스카이트리라고 해도 되지만 지역명을 썼습니다. 2기 14화에서 등장하여 키리노가 그동안 이를 악물고 갈고 닦은 육상 실력으로 쿄우스케를 따돌리고 도망치는 장소이죠. 성지순례와는 별개로 밤에 빛나는 스카이트리가 너무 예뻐서 몇 번이고 촬영했습니다.
이전에 이 책을 이용하여 OS 개발을 해보려고 생각했다가 이미 cygwin이나 binutils등의 버전이 달라져서 제대로 개발 환경을 구현하지 못해 버그가 무척 많이 발생했기 때문에 반쯤 포기하고 있었습니다. 그러던 중 이 책의 저자이신 한승훈님께서 개발 환경이 모두 구축된 VM을 세팅하여 공유하고 계셨다는 사실을 알게 되었습니다.
압축을 푼 이후 VirtualBox를 이용하여 실행 가능하며, 기본적으로 1-Core RAM 2GB로 설정되어 있어서 좀 더 원활한 개발 환경을 위해 저는 2-Core에 RAM 4GB로 늘려주었습니다. OS는 Windows XP였습니다.
마침 책도 회사에서 생일에 지원받은 상품권을 이용해 두권 모두 사두었기 때문에 차근차근 진행해 나가면서 정리하고 진행상황을 작성해보려고 합니다. 블로그에 글을 남기는것도 이렇게 공개된 곳에 작성하면 나태해지지 않고 계속할 수 있을 것이라고 생각했기 때문입니다. :)
어쨌든 이 VM 이미지 하나로 모든 개발환경의 준비는 끝났지만, 위 링크의 글에도 나와있다시피 QEMU의 경우 가상머신 내에서 동작시키면 상당히 속도가 느리고 키보드/마우스 입력이 제대로 되지 않는 문제가 있으니 메인 OS에 설치해두는게 좋겠습니다. QEMU는 여기에서 다운로드 및 설치할 수 있습니다. 이제 진행한 내용들을 정리하겠습니다.
[운영 모드]
x86-64 프로세서에는 크게 다섯 가지 운영 모드가 있고, 각각은 다음과 같습니다.
- 리얼 모드 : 최대 1MB의 주소 공간을 지원하며 16비트 모드로 동작함. 전원이 켜지거나 리셋되면 항상 이 모드로 진입하며, BIOS의 여러 기능들을 사용할 수 있음.
- 보호 모드 : 최대 4GB의 주소 공간을 지원하며 32비트로 동작함. 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 하드웨어적으로 제공함.
- IA-32e 모드 : 최대 16EB의 주소 공간을 지원하며 32비트 호환 모드, 64비트 모드의 두 가지 서브모드로 동작함.
- 시스템 관리 모드 : 전원 관리, 하드웨어 제어 등 특수 기능을 제공함.
- 가상 8086 모드 : 보호 모드 내부에서 가상의 환경을 설정하여 리얼 모드처럼 동작함.
여기서 리얼 모드 및 보호 모드에 관해서는 '성공과 실패를 결정하는 1%의 Windows 구조와 원리' 책을 읽으면서 공부하여 정리했던 내용이 있었습니다. GDT와 LDT 관련하여 의문점이 남은 상태로 찝찝하게 글을 마무리했었는데 진행하면서 이 부분에 대해서도 이해가 가능하면 좋겠네요.
[운영 모드 전환 다이어그램]
각각의 운영 모드는 위와 같은 과정을 통해 다른 모드로 전환될 수 있습니다.
[레지스터]
운영 모드에 따라 사용하는 레지스터의 종류도 달라지는데, 크게 16비트 레지스터, 32비트 레지스터, 64비트 레지스터로 나타낼 수 있습니다. 다만 GDTR(Global Descriptor Table Register)이나 IDTR(Interrupt Descriptor Table Register) 등 특수한 목적을 지닌 레지스터는 다른 크기를 갖습니다. 범용 레지스터의 용도와 크기, 명칭 등은 이미 대체로 알고 있으므로 다른 블로그의 링크로 대체합니다.
※ PC에 연결된 디바이스를 제어할 때 I/O 어드레스를 지정할 수 있는 어드레스는 DX 레지스터 뿐입니다. 이처럼 범용 레지스터가 특수한 용도로 사용되기도 합니다.
특이한 점은 IA-32e 시스템의 64비트 서브모드의 경우 64비트 모드이므로 어드레스의 크기가 64비트라 Insturction Pointer인 RIP 레지스터는 64비트 크기이지만, 기본 오퍼랜드 크기는 32비트로 고정이기 때문에 RIP 레지스터에 대한 상대 어드레스로의 접근은 RIP±2GB밖에 되지 않고 그를 초과하는 범위에 접근할 때는 무조건 jmp 명령어를 사용해야만 접근이 가능하다는 점입니다. 32비트 오퍼랜드로는 최대 4GB까지 표현이 가능하므로 음수/양수로 각각 2GB씩밖에 상대 참조가 가능한 것입니다.
세그먼트 레지스터(Segment Register)는 16비트 레지스터로 어드레스 영역을 다양한 크기로 구분하는 데에 사용됩니다. 운영 모드에 따라 역할이 조금씩 달라지는데, 리얼 모드에서는 단순히 고정된 크기의 영역을 지정하기만 하지만 보호 모드와 IA-32e 모드에서는 접근 권한, 세그먼트의 시작 주소와 크기 등을 지정하는데에 사용되기도 합니다. 각 세그먼트 레지스터의 역할은 다음과 같습니다.
- CS : 코드 영역을 가리키는 레지스터로 점프 명령이나 인터럽트 관련 명령으로만 값을 변경 가능
- DS : 데이터 영역에 접근할 때 암시적으로 사용됨
- ES : 문자열과 관련된 작업을 처리할 때 암시적으로 사용됨
- FS/GS : DS/ES 레지스터와 함께 데이터 영역을 가리키는 레지스터로, 데이터 영역에 접근할 때 DS 레지스터 이외의 세그먼트 레지스터를 사용할 시 각각의 세그먼트 레지스터 접두사를 사용해야 함
- SS : 스택 영역을 가리키는 레지스터로, SP/BP 등 스택 관련 레지스터를 통해 스택에 접근할 때 암시적으로 사용됨
컨트롤 레지스터(Control Register)는 운영 모드를 변경하고 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터입니다. 각 컨트롤 레지스터의 역할은 다음과 같습니다.
- CR0 : 운영 모드를 제어하는 레지스터. 리얼 모드에서 보호 모드로 전환하는 역할 및 캐시, 페이징 기능 등을 활성화시키는 역할을 함
- CR1 : 프로세서에 의해 예약된 레지스터
- CR2 : 페이지 폴트 발생 시 페이지 폴트가 발생한 선형 주소가 저장되는 레지스터
- CR3 : 페이지 디렉터리의 물리 주소와 페이지 캐시에 관련된 기능을 설정하는 레지스터
- CR4 : 페이지 크기 확장, 메모리 영역 확장 등의 기능을 활성화하고 프로세서에서 지원하는 각종 확장 기능을 제어하는 레지스터
- CR8 : 태스크 우선순위 레지스터의 값을 제어하는 레지스터. 프로세스 외부에서 발생하는 인터럽트를 걸러주는 필터 역할을 함. IA-32e 모드에서만 접근 가능.
[메모리 관리 기법]
- 세그먼테이션(Segmentation) : 세그먼트 레지스터를 이용하여 원하는 크기만큼 메모리를 나누어 사용
- 페이징(Paging) : CR3 레지스터에 페이지 디렉터리라는 자료구조의 물리 주소를 설정하여 일정 크기만큼 메모리를 나누어 사용
리얼 모드에서의 메모리 관리 기법
위에 작성한 바와 같이 리얼 모드는 최대 1MB까지 주소 공간을 사용합니다. 이 모드에서는 세그먼테이션만 지원하며 크기는 64K로 고정입니다. 메모리에 접근할 때 사용하는 범용 레지스터와 세그먼트 레지스터의 크기는 모두 16비트인데 주소 공간을 1MB까지 지원하는 이유는, 세그먼트 레지스터의 값에 0x10을 곱한 값에 범용 레지스터의 값을 더하여 접근하기 때문입니다.
예를 들어, FS가 0x1000이고 범용 레지스터가 0x1234라고 한다면 FS의 값인 0x1000에 0x10을 곱하여 0x10000에 범용 레지스터의 값인 0x1234를 더합니다. 최종적으로 0x11234 주소에 접근하게 됩니다. 16비트의 최댓값은 (2^16)-1이고 여기에 0x10을 곱한 후 범용 레지스터의 값까지 더하면 정확히 1MB 크기 내의 주소에 접근이 가능하게 되는 것입니다.
보호 모드에서의 메모리 관리 기법
- 디스크립터 : 메모리 영역의 정보를 저장하는 자료구조. 세그먼트에 대한 정보를 나타내는 디스크립터를 '세그먼트 디스크립터' 라고 함.
보호 모드에서는 세그먼테이션과 페이징 기법을 모두 사용합니다. 다만, 여기에서는 세그먼트 레지스터가 직접적으로 메모리 주소를 가리키지 않고 세그먼트 디스크립터 자료구조의 Offset을 가리킵니다. 이를 따라서 레지스터의 명칭도 세그먼트 레지스터에서 세그먼트 셀렉터로 변경되었습니다. 세그먼트 디스크립터들은 메모리상에 위치하는 자료구조의 일종으로 GDT(Global Descriptor Table)이라고 불리는 곳에 모여 있습니다. GDT는 연속된 디스크립터의 집합으로, 최대 8192개의 디스크립터를 포함할 수 있는 테이블 형태의 자료구조입니다. 프로세서는 원하는 디스크립터를 참조하기 위해 GDT의 시작 주소와 크기를 저장하는 구조체의 주소를 담는 GDTR 레지스터를 이용합니다. 선형 주소는 리얼 모드에서와 같은 방식으로 세그먼트 디스크립터의 베이스 어드레스에 범용 레지스터의 값을 더하여 구하지만, 범용 레지스터의 값이 세그먼트 디스크립터에 정의되어 있는 세그먼트의 크기를 넘어설 경우에는 예외를 발생시켜 오류가 발생했음을 알립니다.
위의 세그먼테이션을 통해 찾아낸 선형 주소의 경우 페이징 기법이 사용되지 않는다면 리얼 모드에서와 같이 물리 메모리와 1대 1로 매칭됩니다. 페이징은 물리 메모리를 페이지(Page)라고 불리는 일정한 크기로 나누고, 선형 주소화 실제 물리 주소를 나눠 놓은 페이지로 연결하는 방식을 말합니다. 페이징을 이용하면 실제 물리 메모리 크기보다 더 큰 영역의 선형 주소도 물리 페이지를 통해 연결하기만 하면 사용 가능하므로 주소 공간을 훨씬 더 넓게 사용할 수 있는 장점이 있습니다(* 가상 메모리의 원리). 또한 프로세스끼리 공유하는 메모리도 한 물리 페이지를 여러 선형 주소에 연결하는 것으로 간단하게 해결이 가능합니다.
[페이징 사용 시 선형 주소]
4KB 크기의 페이지로 나누는 3단계 페이징을 사용할 경우 선형 주소는 디렉터리/테이블/오프셋으로 이루어지며, 물리 메모리를 4KB 페이지로 나누어서 관리합니다. 4바이트인 선형 주소 내에서 0~11비트는 4KB 크기인 페이지 내부의 물리 주소를 나타내기 위해서 사용되며, 나머지 디렉터리와 테이블 값은 페이지 디렉터리와 페이지 테이블에 있는 엔트리의 Offset을 가리킵니다. 페이지 디렉터리의 시작 주소는 위에서 언급했던 CR3 컨트롤 레지스터에 저장되어 있습니다.
2. 선형 주소의 페이지 디렉터리 인덱스를 이용해 원하는 페이지 디렉터리를 찾고, 내부의 디렉터리 엔트리 값을 찾습니다.
3. 디렉터리 엔트리를 이용해 페이지 테이블의 시작 주소를 찾습니다.
4. 선형 주소의 페이지 엔트리 인덱스를 이용해 원하는 페이지 테이블을 찾고, 내부의 테이블 엔트리 값을 찾습니다.
5. 테이블 엔트리를 이용해 4KB 크기 페이지의 물리 어드레스를 구하고, 그곳에 선형 주소의 오프셋 값을 더해 실제 물리 주소로 변환합니다.
IA-32e 모드의 메모리 관리
IA-32e 모드는 32비트 호환 모드 및 64비트 모드로 동작하는데, 32비트 호환 모드의 경우는 보호 모드와 똑같이 작동합니다. 64비트 모드로 동작할 경우 말 그대로 64비트이므로 사용 가능한 최대 어드레스는 2^64인 16EB나 되는 크기의 주소까지 사용이 가능합니다. 64비트 모드로 동작한다고 하더라도 보호 모드와는 큰 차이는 없고, 주소 공간이 확장되면서 약간의 차이가 생겼을 뿐입니다.
첫 번째 차이는 세그먼트 디스크립터에 설정된 베이스 어드레스와 그 크기에 관계 없이 모든 세그먼트가 베이스 어드레스는 0, 크기는 64비트 메모리 전체로 설정된다는 점입니다. 즉, 사실상 64비트 모드에서는 세그먼테이션 기법을 사용하지 않게 되었다고 봐도 무방합니다. 따라서 기존에 개발했던 32비트 OS가 세그먼테이션을 이용해 커널 및 유저 영역을 구분하고 있었다면 이는 IA-32e 모드에서는 유효하지 않게 되었으므로 페이징이나 다른 방식을 고려해야 합니다.
두 번째 차이는 호환 모드와 64비트 모드의 구분을 위해 코드 세그먼트 디스크립터에 L 필드라는 값이 추가된 것입니다(위의 세그먼트 디스크립터 그림 참조). 이 필드를 1로 설정하면 64비트 모드로, 0으로 설정하면 32비트 호환 모드로 동작합니다.
IA-32e 모드의 페이징은 보호 모드와는 달리 주소 공간이 64비트로 늘어났기 때문에 물리 주소 확장(PAE: Physical Address Extension)이 기본으로 활성화됩니다. 또한 기존의 4KB 크기의 3단계 페이징이 5단계로 늘어납니다. 이를 위해 새로 페이지 맵 레벨 4 테이블(PML4)과 페이지 디렉터리 포인터 테이블(PDPT)이 새로 생겼고, 이는 보호 모드에서 설명했던 다른 테이블과 같은 방식으로 참조가 이루어집니다.
선형 주소의 크기가 64비트로 늘어난 만큼 늘어난 공간에 PML4와 디렉터리 포인터 값을 추가로 넣었습니다. 기존과 마찬가지로 CR3→PML4->디렉터리 포인터 엔트리→페이지 디렉터리 엔트리→페이지 테이블 엔트리→물리 주소 순서대로 참조를 진행합니다. 여기서 선형 주소의 48~63번째 비트가 부호 확장으로 채워진 것을 볼 수 있는데, 그렇다고 2^48의 주소를 사용할 수 있는것이 아니라 프로세서에 따라 최대 2^40까지의 물리 메모리만을 사용 가능합니다.
64비트로 늘어난 어드레스로 인해 IA-32e 모드의 페이지 엔트리의 크기는 8바이트로 늘어났습니다. 하위 4바이트는 보호 모드와 같은 구조이며, 상위 4바이트에는 베이스 어드레스와 예약된 영역, 임의 사용 가능한 영역, EXB라는 값으로 구성됩니다. 이중 EXB 필드는 해당 페이지에서 명령어가 실행되는 것을 막을 수 있는 필드로, 이 값을 이용하여 데이터 영역에서 명령어가 실행되는 것을 막을 수 있어 더욱 안전한 OS를 만들 수 있습니다. (Windows의 DEP나 Linux 계열의 NX와 같은 메모리 권한 계열 미티게이션 비슷한 모양)
여기까지 '64비트 멀티코어 OS 원리와 구조' 3장의 내용이었습니다. 다행히도 이전에 메모리 세그먼테이션이나 페이징에 대해 약간 공부한 적이 있어서 이해하기 그렇게 어렵지는 않았습니다. 틈나는대로 한번씩 읽으면서 자신의 지식으로 만들 필요가 있어 보입니다.
후우카라는 작품 자체는 사실 잘 모르고 있었는데, 유튜브에서 우연히 듣게 된 이 노래가 너무 좋았기 때문에 현재 원서로 구매해서 읽어보고 있습니다. 2~3권까지 읽다가 잠시 내려놨는데 빠른 시일 내로 어서 다시 읽기 시작해야겠네요. 케이온이나 뱅드림같은 모에계 밴드물은 아니고 나름 진지하게 음악하는 고교생들의 청춘 성장 밴드물이라고 할 수 있겠습니다.
Wings of Light라는 제목의 이 노래는 '후우카' 완결 기념으로 제작된 특별곡으로, 실제 '후우카' 애니메이션에서 주역 '아키츠키 후우카' 역을 맡으신 성우 Lynn님께서 불러주셨습니다. 여기에서 음원 및 가사를 제공하고 있으며 상업적 이용이 아니라면 마음껏 사용이 가능합니다. 일어 가사의 출처도 저곳임을 밝힙니다. 나중에 꼭 기타로 쳐보고 싶은 곡입니다.
단순히 친구랑 밥 먹고 커피 마시고 하면서 찍은 사진을 이렇게 블로그에 올리는건 처음이긴 한데, 일단 무엇이든 기록으로 남겨서 나쁠 건 없다는 생각에 이렇게 글을 올립니다 :D
가게 앞에서 찍는걸 깜빡해서 네이버 거리뷰에서 가져왔습니다. 낙성대역 8번출구 앞으로 좀 나가면 양옆 다른 건물들에 비해 약간 안쪽으로 들어가있어요. 여기는 학교&회사 선배님이 소개해주셔서 같이 간 이후 맛도 가격도 훌륭해서 자주 가고 있습니다. 글 올린 시점 기준으로 매주 월요일과 화요일은 쉰다고 해요.
메뉴는 이렇게 있고, 가격은 무척 저렴한 편입니다. 기억상 500원을 추가하여 양 추가를 선택할 수 있다고 알고 있습니다. 음료의 경우 주문할 경우 캔과 함께 얼음컵과 빨대를 갖다줍니다. 피자를 시키면 핫소스도 같이 줘요.
이날 군대에서 휴가나온 친구와 함께 갔었는데, 저는 위의 오븐미트 스파게티를 시켰습니다. 오븐스파게티라 접시가 무척 뜨거우니 먹을때 데지 않도록 주의해야 합니다.
함께 주문한 플레인또띠아피자. 스파게티만으로는 조금 아쉽다면 하나 주문해서 같이 먹어도 괜찮습니다. 마늘빵도 주문하면 바삭하게 구워서 갖다줘서 배 채우기 좋더라구요.
전체적으로 내부 구조가 그렇게 넓은 편은 아니고, 인기는 많은 편이라서 식사시간대에는 대기가 있을 수도 있습니다. 테이크아웃도 된다고 알고 있기는 한데 한번도 해본적은 없네요. 착한 가격과 맛 때문에 자주 찾아가는 맛집입니다 :)