vim서 TAB(탭) 4 space



vimrc서 과 이 해 다.


set softtabstop=4                              ; TAB를 때 몇 을 동?

set tabstop=4                                  ; 하나의 TAB을 몇 칸으로 인식? 

set shiftwidth=4                               ; <<, >>을 눌렀을 때 몇 칸을 이동?

set expandtab                                  ; TAB을 space로 인식

;set noexpandtab                                ; TAB을 TAB으로 인식                         

Posted by code cat
리눅스2012. 4. 17. 10:46

우선 이게 되는지는 나도 정확히 모르겠으나, 될 거 같다. 안될 이유가 있는가??


그냥 대놓고 startx하면 Xauthority 가 없다 이런 에러가 날 것이다.

우선 기본적으로 ssh -X 계정이름@호스트이름으로 접속해 보자.


접속되고 나면 Xwrapper.config를 바꿔야 하는데, /etc/X11/Xwrapper.config는 다음과 같이 3가지 값을 가질 수 있다.
    root
    anybody
    console
allowed_users=anybody로 값을 바꾸자.


그 후 만약 startx 하고 돌렸는데,


    "Server is already active for display 0"


하고 나오면 당연히 서버가 display 0을 쓰고 있을 것이다.

그래서 startx -- :1로 display 1으로 실행시킨다. 나중에 돌리다 보면 필요하겠지만, display 1로 실행시킨 녀석을 죽일라면


    rm -rf /tmp/.X1-lock


을 사용하자.

그런데 이제는 "Failed to load module "fglrx" 가 나온다.

(==) Log file: "/var/log/Xorg.1.log", Time: Mon Apr 16 20:22:59 2012
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
(EE) Failed to load module "fglrx" (module does not exist, 0)

그럼 다음과 같이 해보자.


    sudo dpkg-reconfigure -phigh xserver-xorg

그리고 다시 start -- :1을 실행. 여기서 display 1이 안될 수도 있으니, 위에 말한 rm -rf /tmp/.X1-lock을 사용하고 다시 해보자.

이번엔 이렇게 나온다.
_XSERVTransSocketINETCreateListener: ...SocketCreateListener() failed
_XSERVTransMakeAllCOTSServerListeners: server already running


Fatal server error:
Cannot establish any listening sockets - Make sure an X server isn't already running

이 경우, 위에서 lockfile을 날려서거나, lock file을 만들지 않는 어떤 넘이 벌써 포트로 listening 중이기 때문이다.
이럴 땐 이렇게 해보자.


netstat -ln


여기서 무슨 값을 봐야 하나면, x서버는 6000대의 포트 + display 값로 listening을 한다. 그러니 6001을 보자.


      netstat -ln | grep "6001"

여기서 막혔는데 좀 더 봐야겠다.

'리눅스' 카테고리의 다른 글

[EXT4] barrier=1 혹은 0에 대한 옵션 설명  (0) 2013.11.24
[Mint Linux] gnome shell emulation  (0) 2012.09.08
ext4분석  (0) 2012.04.10
EXT4 파일 시스템 굽기(2)  (0) 2012.03.18
GOT (Global Offset Table)  (0) 2012.03.02
Posted by code cat
리눅스/커널2012. 4. 16. 09:07

아키텍쳐 별로 tag를 만들어서 분석 시 좀 더 편하게 분석 하는 방법이 있는데, (뭐 물론 아키텍쳐별로 파일 다 지우고 하겠다면 안 말린다)


1. tag 생서시에는

make tags ARCH=<architecture name>


2. cscope 생성시에는

make cscope ARCH=<architecture name>


물론 <architecture name>은 그냥 아키텍쳐 이름만 써주면 된다. 예를 들어 arm을 분석한다면,


make cscope ARCH=arm


이렇게 해 주면 된다.

'리눅스 > 커널' 카테고리의 다른 글

__user  (0) 2012.07.01
__initcall(), module_init()  (0) 2012.07.01
Virtual Linux Manager 정리 1  (0) 2012.03.18
GCC, typeof  (0) 2012.02.23
Documentation/arm/booting  (0) 2011.09.25
Posted by code cat
리눅스2012. 4. 10. 15:43

다음의 글은 아래의 출처에서 가져왔음을 밝힌다.

출처:http://www.ibm.com/developerworks/kr/library/l-anatomy-ext4/



Linux 커널이 새롭게 발표될 때마다 몇 가지 뛰어난 기능이 포함되어 있듯이 이번 12월에 발표된 2.6.28 릴리스에도 우수한 기능이 포함되어 있다. 이 릴리스는 현재 개발 작업이 한창 진행 중인 Btrfs와 같은 여러 가지 우수한 기능 중에서 안정적인 ext4 파일 시스템이 최초로 적용된 릴리스이다. 이 차세대 Extended File System에서는 확장성과 신뢰성이 향상되었으며 뛰어난 새 기능도 추가되었다. Ext4는 1TB 디스크를 최대 백만 개까지 사용할 수 있는 파일 시스템으로 확장할 수 있다.

 

 

Extended File System의 약사


 

VFS(Virtual File System) 스위치

VFS는 상위 계층 파일 시스템 사용자의 기본 파일 시스템에 대한 세부 사항을 추상화하는 계층이다. 이러한 기능을 제공하는 VFS를 바탕으로 Linux는 지정된 Linux 시스템에서 여러 파일 시스템을 동시에 지원할 수 있다.

 

Linux를 지원하는 최초의 파일 시스템은 Minix 파일 시스템이었지만 이 파일 시스템에는 몇 가지 심각한 성능 문제가 있었기 때문에 Extended File System이라는 파일 시스템이 Linux를 위해 특별히 개발되었다. Remy Card가 설계한 첫 번째 Extended File System(ext)은 1992년 4월에 Linux에 채택되었다. ext 파일 시스템은 0.96c 커널에 구현된 VFS(Virtual File System) 스위치를 최초로 사용했으며 최대 2GB 크기의 파일 시스템을 지원했다.

 

두 번째 Extended File System(ext2) 또한 Remy Card가 구현했으며 1993년 1월에 발표되었다. 이 파일 시스템은 Berkeley FFS(Fast File System)와 같은 당시의 다른 파일 시스템의 발전된 아이디어를 채택했다. Ext2에서는 지원되는 파일 시스템의 크기가 2TB로 확장되었으며 2.6 커널에서는 ext2 파일 시스템의 최대 크기가 32TB로 확장되었다.

 

세 번째 Extended File System(ext3)은 일부 경쟁 파일 시스템에 비해 성능이 떨어지기는 했지만 Linux 파일 시스템의 맥락에서는 크게 발전한 모습을 보여 준 파일 시스템이다. ext3 파일 시스템에서는 예기치 않게 시스템이 중단되었을 때 파일 시스템의 신뢰성을 높여 주는 저널링 개념이 도입되었다. Silicon Graphics의 XFS 및 IBM® JFS(Journaled File System)와 같은 경쟁 파일 시스템의 성능이 더 좋기는 했지만 ext3은 이미 ext2를 사용하고 있는 시스템에서 직접 업그레이드할 수 있는 기능을 지원했다. Ext3은 2001년 11월에 발표되었으며 Stephen Tweedie가 구현했다.

현재, 네 번째 Extended File System(ext4)이 발표되었다. Ext4에는 성능, 확장성 및 신뢰성을 향상시킨 수많은 새 기능이 도입되었다. 가장 눈에 띄는 특징은 ext4가 1EB(exabyte)의 파일 시스템을 지원한다는 것이다. Ext4는 ext3를 유지 관리해 온 Theodore Tso가 이끄는 개발자 팀에 의해 구현되어 2.6.19 커널에 채택되었다. 그리고 지금은 2.6.28 커널에 이르러 안정적인 상태로 유지되고 있다(2008년 12월 현재).

Ext4에는 다양한 경쟁 파일 시스템의 유용한 개념이 적용되었다. 예를 들어, 익스텐트를 사용하여 블록을 관리하는 방법은 JFS에서 구현했으며 또 다른 블록 관련 기능인 지연된 할당은 XFS와 Sun Microsystems의 ZFS에서 구현했다.

새로운 ext4 파일 시스템에서는 혁신적으로 개선된 다양한 기능을 볼 수 있다. 새롭게 추가된 기능, 현재 파일 시스템의 한계를 뛰어 넘은 우수한 확장성, 오류에 효과적으로 대응할 수 있는 신뢰성 및 뛰어난 성능에 이르기까지 파일 시스템의 모든 부분에서 개선된 사항을 발견할 수 있다.


Ext4에는 새 기능이 매우 많이 포함되어 있기는 하지만 그 중에서도 가장 중요한 특징은 이전 버전인 ext3과의 쌍방 호환성이며 앞으로 더 높은 성능을 제공하게 될 미래의 Linux 시스템을 내다보고 시간 소인의 기능도 향상되었다.

이전 버전 및 후속 버전과의 호환성

ext3은 오늘날 Linux에서 가장 많이 사용되고 있는 파일 시스템 중 하나이기 때문에 ext4로의 마이그레이션은 큰 어려움 없이 쉽게 수행할 수 있어야 한다. 이를 위해 ext4는 쌍방 호환성을 고려하여 설계되었다(그림 1 참조). Ext4는 ext3 파일 시스템을 ext4 파일 시스템으로 마운트할 수 있도록 후속 버전으로의 호환성을 제공한다. ext4를 충분히 활용하려면 파일 시스템 마이그레이션을 수행하여 새로운 ext4 형식으로 변환한 후 사용해야 한다. ext4 파일 시스템을 ext3로도 마운트할 수 있기는(이전 버전과의 호환성) 하지만 ext4 파일 시스템에서 익스텐트(성능 섹션 참조)를 사용하지 않는 경우에만 가능하다.


그림 1. ext4의 쌍방 호환성

 


이러한 호환성 특징 외에도 ext3 파일 시스템을 ext4로 마이그레이션하는 작업을 점차적으로 수행할 수 있다. 즉, 옮기지 않은 기존 파일을 기존 ext3 형식으로 유지하면서 새 파일(또는 복사한 기존 파일)을 새로운 ext4 데이터 구조로 관리할 수 있다. 이러한 방법을 통해 온라인으로 ext3 파일 시스템을 ext4 파일 시스템으로 마이그레이션할 수 있다.

 

시간 소인 정밀도 및 범위 향상

 

놀랍게도 ext4 이전의 Extended File System에서는 초 단위의 시간 소인을 사용하고 있다. 이 시간 소인은 많은 설정에서 효과적으로 사용되었지만 프로세서의 처리 속도가 빨라지고 통합 기능(멀티 코어 프로세서)이 향상되었을 뿐만 아니라 고성능 컴퓨팅과 같은 다른 애플리케이션 도메인에서 Linux가 사용되면서 그 한계가 드러나고 있다. Ext4의 시간 소인은 기본적으로 나노초 LSB로 확장되어 후속 버전과의 호환성을 보장한다. 또한 두 개의 추가 비트를 통해 시간 범위도 500년 이후까지 사용할 수 있도록 확장되었다.


확장성

 

업그레이드할 파일 시스템의 가장 중요한 특성 중 하나는 증가하는 수요에 대응할 수 있는 확장성이다. 여러 가지 방법으로 확장성을 강화한 Ext4는 ext3 한계를 극복하고 파일 시스템 메타데이터 관리를 위한 토대를 새롭게 마련하였다.

 

파일 시스템 제한 확장

 

ext4의 첫 번째 가시적인 차이점은 파일 시스템 볼륨, 파일 크기 및 서브디렉토리 제한에 대한 지원이 향상되었다는 것이다. Ext4는 최대 1EB(1000PB)의 파일 시스템을 지원한다. 오늘날 적용되고 있는 표준에 따르면 많은 용량처럼 보이기는 하지만 스토리지 사용량이 지속적으로 늘어나고 있다는 점을 감안하면 ext4가 미래를 염두에 두고 개발되었음을 명확히 알 수 있다. ext4에서 허용되는 최대 파일 크기는 16TB(4KB 블록 가정)이며, 이는 ext3의 최대 파일 크기의 8배에 해당한다.

마지막으로 ext4에서는 서브디렉토리 제한도 32KB 디렉토리 깊이에서 거의 무한대로 확장되었다. 이러한 확장이 무리한 확장으로 보인다면 1EB의 스토리지를 사용하는 파일 시스템의 계층 구조를 생각해 봐야 한다. 디렉토리 인덱싱도 해시된 B 트리 형태의 구조로 최적화되었다. 따라서 제한이 크게 확장되었음에도 불구하고 ext4에서는 매우 빠른 조회가 가능하다.

 

익스텐트

 

ext3의 주요 단점 중 하나는 할당 방법에 있었다. 여유 공간에 대한 비트 맵을 통해 파일이 할당되었는데 이 방법은 빠르지도 않고 확장성도 좋지 않았다. Ext3의 형식은 작은 파일에 매우 효율적이지만 큰 파일에는 비효율적이다. Ext4에서는 할당 기능을 향상시키고 더욱 효율적인 스토리지 구조를 지원하기 위해 ext3의 메커니즘을 익스텐트로 대체했다. 익스텐트는 연속되는 블록 시퀀스를 나타낸다. 이처럼 익스텐트를 사용하게 되면 블록의 저장 위치에 대한 정보를 유지하는 대신 연속 블록으로 구성된 긴 목록의 저장 위치에 대한 정보가 유지되기 때문에 저장되는 전체 메타데이터의 용량이 줄어든다.

ext4의 익스텐트는 계층화된 접근 방법을 통해 작은 파일을 효율적으로 나타내며 익스텐트 트리를 사용하여 대용량 파일을 효율적으로 나타낸다. 예를 들어, 단일 ext4 inode에는 4개의 익스텐트를 참조할 수 있는 공간이 있으며, 이 경우 각 익스텐트는 연속 블록 세트를 나타낸다. 대용량 파일(조각화된 파일 포함)의 경우, inode는 인덱스 노드를 참조할 수 있으며, 각각의 인덱스 노드는 여러 익스텐트를 참조하는 리프 노드를 참조할 수 있다. 이 고정 깊이 익스텐트 트리는 대용량 스파스 파일에 대한 효과적인 표현 스키마를 제공한다. 또한 노드에는 파일 시스템 손상을 방지하기 위한 자동 검사 메커니즘이 있다.


성능

새 파일 시스템을 측정하는 데 사용되는 가장 중요한 속성 중 하나는 기본 성능이다. 성능은 가장 어려운 분야 중 하나이다. 왜냐하면 파일 시스템의 용량이 커지고 신뢰성에 대한 기대가 높아질수록 성능 저하가 발생할 수 있기 때문이다. 하지만 ext4는 확장성과 신뢰성을 제공하는 동시에 성능 향상을 위한 여러 가지 향상된 기능도 제공한다.

 

파일 레벨 사전 할당

 

데이터베이스 또는 컨텐츠 스트리밍과 같은 특정 애플리케이션에서는 드라이브에 대한 순차 블록 읽기 최적화를 사용하고 블록에 대한 읽기 명령 비율을 최대화하기 위해 연속 블록에 저장되는 파일을 사용한다. 연속 블록 세그먼트를 제공할 수 있는 익스텐트 외에도 과거에 XFS에서 구현되었던 대로 매우 큰 연속 블록 섹션을 원하는 크기로 사전 할당하는 매우 강력한 방법도 있다. Ext4에서는 지정된 크기의 파일을 사전 할당 및 초기화하는 새로운 시스템 호출을 통해 이 기술이 구현되었다. 그런 다음 필요한 데이터를 기록한 후 데이터에 대한 제한적인 읽기 성능을 제공할 수 있다.

 

블록 할당 지연

 

할당 지연은 파일 크기를 기반으로 하는 또 하나의 최적화 방법이다. 이 성능 최적화 방법은 블록을 디스크에 강제로 기록할 때까지 디스크의 물리적 블록을 할당하지 않고 기다린다. 이 최적화 방법의 핵심은 디스크에 기록할 필요가 있을 때까지 물리적 블록의 할당이 지연되기 때문에 더 많은 블록을 연속 블록에 할당 및 기록할 수 있다는 것이다. 이 방법은 파일 시스템에서 작업이 자동으로 수행된다는 점을 제외하면 지속적인 사전 할당과 유사하다. 하지만 파일 크기가 미리 알려져 있는 경우에는 지속적인 사전 할당이 가장 효과적인 방법이다.

 

멀티 블록 할당

 

최적화를 위해 향상된 마지막 기능은 ext4의 블록 할당자이다. 이 최적화 방법 또한 연속 블록과 관련되어 있다. ext3의 경우 블록 할당자는 한 번에 하나의 블록을 할당하는 방식으로 작동한다. 여러 개의 블록이 필요한 경우 연속 데이터를 연속되지 않은 블록에서 찾을 수 있었다. Ext4에서는 디스크에 연속되어 있을 수 있도록 여러 블록을 동시에 할당하는 블록 할당자를 사용하여 이 문제를 해결했다. 이전 최적화와 마찬가지로 이 최적화에서도 순차 읽기 최적화를 위해 디스크에서 최적화할 관련 데이터를 수집한다.

 

멀티 블록 할당의 또 다른 특징은 블록을 할당하는 데 필요한 처리 리소스의 용량에서 찾아볼 수 있다. 한 번에 하나의 블록만을 할당하는 가장 단순한 형태의 방법을 사용하는 ext3의 경우에는 블록 할당을 수행하기 위해 블록마다 한 번의 호출이 필요했다. 하지만 여러 블록을 동시에 할당하는 경우에는 블록 할당자에 대한 호출 횟수가 많이 줄어들기 때문에 할당 속도가 빨라지고 필요한 처리 리소스의 양도 줄어든다.


 

ext4에서는 파일 시스템이 매우 큰 크기로 확장될 수 있기 때문에 신뢰성에 대한 관심도 당연히 커질 것이다. Ext4에는 이러한 우려를 해소할 수 있는 여러 가지 자동 보호 및 자동 복구 메커니즘이 마련되어 있다.

 

파일 시스템 저널에 대한 체크섬 검사

 

ext3과 마찬가지로 ext4도 저널링 파일 시스템이다. 저널링저널(디스크의 연속된 영역에 있는 전용 순환 로그)을 통해 파일 시스템의 변경 사항을 기록하는 프로세스이다. 그런 다음 로그에 기록된 변경 사항에 따라 물리적 스토리지에 실제 변경 사항이 적용된다. 이 방법을 사용하면 좀 더 안정적으로 변경 사항을 구현할 수 있으며 작업 중에 시스템 오류 또는 전원 문제가 발생하더라도 일관성을 유지할 수 있다. 결과적으로 파일 시스템의 손상 가능성이 줄어드는 효과를 얻을 수 있다.

저널링을 사용하더라도 올바르지 않은 항목이 저널에 있다면 손상 가능성은 여전히 존재한다. 이 문제를 해결하기 위해 ext4에서는 저널에 대한 체크섬 기능을 구현하여 올바른 변경 사항만 기본 파일 시스템에 적용되도록 보장한다. 참고자료 섹션에서 ext4의 중요한 기능인 저널링에 대한 추가 참고자료를 볼 수 있다.

Ext4는 사용자의 필요에 따라 여러 가지 모드의 저널링을 지원한다. 예를 들어, ext4는 메타데이터만 저널링되는 모드(Writeback 모드), 메타데이터가 저널링된 후 저널을 바탕으로 메타데이터가 기록될 때 데이터가 기록되는 모드(Ordered 모드) 및 메타데이터와 데이터가 모두 저널링되는 모드(가장 안정적인 Journal 모드)를 지원한다. Journal 모드는 파일 시스템의 일관성을 보장하는 가장 좋은 방법이기는 하지만 모든 데이터가 저널을 통과하기 때문에 가장 느린 방법이기도 하다.

 

온라인 조각 모음

 

ext4에는 파일 시스템 내의 조각을 줄여 주는 기능(순차 블록 할당을 위한 익스텐트)이 통합되어 있기는 하지만 파일 시스템을 장기간 사용할 경우에는 어느 정도의 조각이 발생하는 것은 피할 수가 없다. 이 문제를 해결하여 성능을 향상시키기 위해 파일 시스템 및 개별 파일에 대한 조각 모음을 수행하는 온라인 조각 모음 도구가 제공된다. 온라인 조각 모음 도구는 인접한 익스텐트를 참조하는 새 ext4 inode에 파일을 복사하는 단순한 도구이다.

온라인 조각 모음의 또 다른 특징은 파일 시스템 검사(fsck)에 필요한 시간이 짧다는 것이다. Ext4에서는 inode 테이블에 있는 블록 그룹 중 사용되지 않고 있는 블록 그룹이 구별되기 때문에 fsck는 해당 블록 그룹 전체를 생략하여 빠르게 검사 프로세스를 수행할 수 있다. 파일 시스템의 크기가 증가하게 되면 필연적으로 내부 손상이 발생하기 마련이며 이러한 문제를 해결하기 위해 운영 체제는 파일 시스템에 대한 유효성 검증을 수행한다. 그리고 이러한 유효성 검증을 통해 ext4가 전반적으로 높은 신뢰성을 갖추고 있음을 알 수 있다.


미래의 모습

 

Extended File System은 분명 1992년에 처음 발표된 ext부터 2008년의 ext4에 이르기까지 Linux 내에서 길고도 의미 있는 역사를 가지고 있다. Linux를 위해 특별히 설계된 첫 번째 파일 시스템이면서 가장 효율적이고, 안정적이며 강력한 파일 시스템 중 하나였음을 입증해 보였다. XFS, JFS, Reiser 및 IRON 결함 허용 파일 시스템 기술 등의 다른 새 파일 시스템의 아이디어도 통합되어 있는 Ext4는 파일 시스템 관련 리서치에서 꾸준한 발전을 보여 주고 있다. 앞으로 개발될 ext5의 모습을 예측하기에는 너무 앞선 감이 있지만 엔터프라이즈 환경을 대비한 Linux 시스템을 이끌게 될 것이라는 점만은 분명하다.


참고자료

교육

제품 및 기술 얻기

  • kernel.org에서 최신 커널 릴리스를 다운로드할 수 있다.

  • developerWorks에서 직접 다운로드할 수 있는 IBM 시험판 소프트웨어를 사용하여 Linux와 관련된 후속 개발 프로젝트를 구현해 볼 수 있다.

토론

필자소개

M. Tim Jones

M. Tim Jones는 임베디드 펌웨어 아키텍트이자 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(현재 2판), AI Application Programming(현재 2판) 및 BSD Sockets Programming from a Multilanguage Perspective의 저자이다. 정지 위성을 위한 커널 개발에서 시작해 임베디드 시스템 아키텍처와 네트워크 프로토콜 개발에 이르기까지 다양한 분야에 대한 공학 지식을 가지고 있다. 콜로라도주 롱몬트 소재의 Emulex Corp.에서 컨설턴트 엔지니어로 활약하고 있다.

      


Posted by code cat
리눅스/커널2012. 3. 18. 20:20

출처: virtual linux manager by Mel Gorman

memory 는 bank로 나뉘어짐
bank는 node라고 불리며,
node는 struct pglist_data로 표현됨.(UMA일때도 마찬가지)

pglist_datapg_data_t로 참조된다. 
시스템의 모든 node는 NULL로 끝나는 pgdata_list 이라는 리스트로 관리된다.
그리고 각 node는 pg_data_t->node_next로 다른 node와 연결된다.

UMA의 경우 contig_page_data라는 하나의 pg_data_t 구조체를 사용한다.(노드가 하나 이니까)

각 node는 'zone' 이라 불리는 여러개의 블록으로 나뉜다.

zone은 struct zone_struct 이라는 구조체로 정의되며, zone_t로 사용자정의된다.

zone의 종류에는,
ZONE_DMA 
ZONE_NORMAL
ZONE_HIGHMEM
(ZONE_MOVEABLE)
이 있다.
 
신경써야 할 부분은 ZONE_NORMAL이다.  ZONE_HIGHMEM은 ZONE_NORMAL의 상위 위쪽 부분이다.

시스템의 메모리는 page frame이라는 고정된 chunk들로 이루어져 있다.
각각의 physical page frame들은 struct page라는 구조체로 표현되며,
이 모든 구조체들은 mem_map이라는 배열에 저장된다.
(mem_map은 보통 ZONE_NORMAL 시작부분이나 지정된 커널 로딩 영역 뒤에 저장된다)

2.1 Nodes
리눅스는 page를 할당할 때, node-local alloocation policy를 사용해서
현재 실행 중인 CPU에서 가장 가까운 node의 메모리를 할당한다.

pg_data_t, 즉 pglist_data는 다음가 같이 정의되어 있다.


  node_zones ZONE_HIGHMEM, ZONE_NORMAL_ZNOE_DMA가 있다. 
  node_zonelists  zone들이 할당되는 순서를 가지고 있다.  free_area_init_core()에 호출 된 mm/page_alloc.c의 build_zonelists()가  순서를 정한다.
  nr_zones zones의 갯수 
  valid_addr_bitmap 메모리 node에 있는 "holes" 에 대한 비트맵 
  bdata boot memory allocator  
  node_start_paddr node의 시작 주소(physical)   Page Frame Number(PFN)에 기록하는게 좋다.   PFN은 physicla memory의 index이며, page-sized unit 단위로 세어진다.
PFN 은 (page_phys_addr >> PAGE_SHIFT) 로 손쉽게 정의될 수 있다. 
  node_start_mapnr 전역 mem_map안의 page offset.  
 free_area_init_core()에서 mem_map과 지역적 mem_map사이의 페이지 개수로 계산됨 
  node_size zone안의 총 page 수 
  node_id  node ID (NID).  0부터 시작함 
  node_next 위에서 말한 node list의 다음 node를 가리킴 
             
앞서 말했듯이, 시스템의 모든 node들은 pgdat_list라는 리스트에서 관리되며, init_bootmem_core()에 의해 이 리스트에 추가된다.


2.2 Zones

각 zone들은 struct zone_struct으로 구성된다. (linux/mmzone.h 참조)

내용은 다음과 같다.

  lock zone을 보호하는 spinlock 
  free_pages zone에 존재하는 free page  

  pages_min,   page_low, pages_high 

 
  zone_pgdata pg_data_t 를 가리킨다.
  zone_mem_map 전역 mem_map 
  zone_start_paddr node_start_paddr와 유사 
  zone_start_mapnr node_start_mapnr와 유사 
  name zone 이름, "DMA", "NORMAL", "HighMem" 
  size pages단위로 표현된 zone의 사이즈 

 

2.2.1 Zone Watermarks

시스템에 남아있는 메모리가 적을 경우, kswapd라는 pageout 데몬이 실행되어 page들을 free하기 시작한다.  만약 메모리를 많이 회수해야 한다면, kswapd 데몬은 동기적으로 메모리를 free 한다.(이 방식은 direct-reclaim이라고 불리기도 한다.)

각 zoned은 세가지의 watermark를 가지고 있는데, 이들은 각각 다음과 같다.

 pages_low

 free page의 수가 pages_low에 이르면, kswapd가 buddy allocator에 의해 깨어나서 page들을 free한다

 pages_min

 pages_min에 이르면, buddy allocator는 kswapd를 동기화적으로 돌린다.

 pages_high

 page_high에 이르면 kswapd는 다시 sleep으로 돌아간다.

pages_minfree_area_init_core()에서 메모리 초기화 과정에서 page 단위로 표현된 zone의 크기로 표현되어 계산된다.


2.2.2 Calculating the size of Zones

각 zone의 크기는 setup_memory()에서 계산된다.

PFN은 pages단위로 세어진 실제 메모리 맵(physical memory map)안의 오프셋이다.

min_low_pfn은 첫번째 PFN이며, _end 다음의 첫번째 페이지에 위치한다.  min_low_pfn은 나중에 쓰일 boot memory allocator를 위해 mm/bootmem.c 에 file scope 변수로 지정되어 있다.

unsigned long min_low_pfn;

unsigned long max_low_pfn;

unsigned long max_pfn;

마지막 페이지 프레임인 max_pfn 은 아키텍쳐 의존적으로 계산된다.  x86의 경우 find_max_pfn()으로 e820 map을  통해 가장 높은 값을 갖는 페이지 프레임을 읽는다. (e820은 BIOS를 통해 얻어지는 테이블이며, 어떤 physicla memory가 있는지, 예약되어 있는지등을 알려준다)  

max_low_pfn은 (x86의 경우) find_max_low_pfn()을 통해 계산되며, 이는 ZONE_NORMAL의 끝을 표시한다.

                          ZONE
_end   
 min_low_pfn                     first page 
                       pages ...
 max_low_pfn            end of ZONE_NORMAL     <- kernel/userspace split point


2.2.3 Zone Wait Queue Table

(생략)

 

2.3 Zone Initialization

zone 들은 kernel page table 이 paginig_init()에 의해 완전히 세팅되고 나면 초기화 된다.  페이지 테이블 초기화에 대해서는 3.6을 참조하자.

아키텍쳐마다 방식에는 다르겠지만, 기본적으로 UMA 일 경우, free_area_init()에 보낼 매개변수를, NUMA일 경우, free_area_init_node()에 보낼 매게변수를 결정한다.  이 매게변수들은 다음과 같다.

  nid 초기화 될 zone을 가지고 있는 NODE의 NODE id 
  pgdat 초기화되는 node의 pg_data_t이며, UMA의 경우 contig_page_data이다. 
  pmap free_area_init_core()에 의해 지정되며, local mem_map의 시작부분을 가리킨다. NUMA는 mem_map을 PAGE_OFFSET에 시작하는 가상 배열로 생각하기 때문에 무시하며, UMA의 경우 pmap은 global mem_map을 가리킨다. 
  zone_sizes 각 zone의 크기를 담고 있는 배열 
  zone_start_paddr 첫번째 zone의 시작 실제 주소(starting physical address) 
  zone_holes zones에 있는 메모리 홀의 총 사이즈를 담고 있는 배열 

free_area_init_core()는 각 zone_t의 내용을 연관성이 있는 정보로 채우는 역활 및 mem_map 배열 할당을 한다.  현 상황에서는 어떤 페이지가 free인지는 알 수 없으며, boot memory allocator의 작업이 끝날 때 까지는 알 수 없다.

 

2.4 Initializing mem_map

mem_map은 시스템 초기화 과정에서 생성된다.

NUMA의 경우, global mem_map이 PAGE_OFFSET에서 시작하는 가상 배열로 취급되며, 각 node 마다 free_area_init_node()를 호출하여 이 가상 배열을 할당한다.  

UMA의 경우, free_area_init()contig_page_data를 node로, global mem_map을 local mem_map으로 동일하게 취급한다.

locla mem_map은 free_area_init_core()에 의해 할당되며, 이를 위한 배열은 boot memory allocator가 alloc_bootmem_node()를 호출하여 할당한다.  UMA의 경우, 이렇게 할당된 메모리는, 위에서 말한 거 처럼, global mem_map이 되나, NUMA의 경우 조금 다르다.  NUMA는 local mem_map을 각 node의 고유한 메모리에서 할당하며, global mem_map의 경우 따로 할당되지는 않으나, (가상 배열로 취급되는)PAGE_OFFSET으로 설정된다.  local map은 pg_data_t->node_mem_map에 저장된다.

node에 존재하는 각 zone들은  가상 mem_map의 주소를 zone_t->zone_mem_map에 저장한다.  이 외의 작업에서는 mem_map을 실제 배열로 취급한다.

 

2.5 Pages

모든 시스템의 physical page frame은 struct page를 가지고 있다.


      





'리눅스 > 커널' 카테고리의 다른 글

__initcall(), module_init()  (0) 2012.07.01
리눅스 커널 분석 시 아키텍쳐별 tag 및 cscope생성  (0) 2012.04.16
GCC, typeof  (0) 2012.02.23
Documentation/arm/booting  (0) 2011.09.25
Linux 3.0 Kernel  (0) 2011.07.31
Posted by code cat
리눅스2012. 3. 18. 14:36

예전에 ext4파일 시스템 굽기에 대해서 적은 글에 대해서 지금와서 생각해보니 나름대로 용도가 있겠지만, 그 당시에 필요했던 용도로 쓰기엔 매우 불편한 방법이었다.

그래서 더 쉬운 방법이 생각났는데, 그거슨..


/dev/sda1 등으로 되어있는 디바이스 파일을 통째로 덤프를 떠서 bin파일로 만든 뒤에 이를 mount시키면 되는 것이다.
덤프를 뜨는 방법은 뭐 간단히 cat을 써도 되고, 프로그램을 하나 만들어서 읽어써 쓰는 작업을 해도 되겠다.

실제로 해보니 너무 간단히 되어 버려서 허탈했다.
그러나 위에서 말했듯이, dd를 사용해서 쓰는 방법도 나름 쓸모가 있다. 예를 들면 원하는 크기의 ext4파일 시스템을 빈 상태로 설정해 준다던가.. 어쨌든 알아두면 유용하게 쓰일 일이 있다.
Posted by code cat

쉘 스크립트가 오동작을 하거나 이해하기 힘든 동작을 보일 때, 디버깅을 하려면 다음과 같이 하면 매우 편하다.


#!/bin/sh       ← #!/bin/bash -x 로 바꾸어 준다.


보통 쉘의 시작 부분은 #!/bin/sh로 되어 있는데, 이는 스크립트가 어떤 쉘에서 동작하는지를 정하는 매직코드이다.

그래서 위와 같이 하면, 쉘 코드가 한줄 한줄 실행되는 걸 볼 수 있어 디버깅하기에 좋다.

Posted by code cat
리눅스2012. 3. 2. 18:02

출처: Secure Coding in C and C++


Linux 의 기본 바이너리 포맷은 ELF(Executable and Linking Format)이다.  ELF는 원래 UNIX System Laboratories(USL)에 의해 ABI(Application Binary Interface)의 일환으로 개발되었다.


ELF 파일의 프로세스 공간은 GOT(Global Offset Table)을 포함하고 있는데, 이 GOT는 절대 주소값을 가지고 있다.  이렇게 절대 주소값을 가지고 있을 경우, 코드 영역의 위치여부나 공유여부에 상관없이 사용 할 수 있게 된다.


실제 테이블의 내용이나 형태는 프로세서의 종류에 따라 다를 수 있지만,   기본적으로 GOT는 다이나믹 링킹 프로세스를 지원하는데 있다.


프로그램에 의해 사용되는 모든 라이브러리 함수는 GOT에 실제 함수의 주소를 가진 엔트리를 가지고 있으며, 이는 라이브러리가 쉽게 프로세스 메모리 안에서 재배치될 수 있게 한다.  프로그램이 실제로 함수를 처음으로 사용하기 전까지는, GOT의 엔트리에는 RTL(RunTime Linker)의 주소를 가지고 있다.  만약 프로그램에 의해 함수가 호출되면, RTL에게 제어는 넘어가며, 함수의 실제 주소가 GOT에 등록된다.  차후의 함수 호출은 RTL을 거칠 필요 없이 GOT를 통해서 호출된다.


GOT 엔트리의 주소는 EFL 파일의 고정된 위치에 있고, 결과적으로 모든 실행 프로세스 이미지들에게 공통적인 주소에 있게 된다.  GOT 엔트리의 위치를 알려면, 'objdump' 커맨드를 사용하여 확인 할 수 있다.
 



'리눅스' 카테고리의 다른 글

ext4분석  (0) 2012.04.10
EXT4 파일 시스템 굽기(2)  (0) 2012.03.18
리눅스 배포판 이름 버젼 알아내기  (0) 2012.03.02
/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /opt  (0) 2012.02.24
Linux: umask  (0) 2012.01.03
Posted by code cat
리눅스2012. 3. 2. 11:05

가끔 일하다보면 다른사람에게 리눅스 배포판 하고 버젼을 알려줘야 할 때가 있다.  그런데 뭐더라??? 할 때가 있는데, 이럴 땐 당황하지 말고, 다음과 같이 하자.


$ cat /etc/*-release


그러면 우분투의 경우,

배포판 아이디,  배포판 릴리즈버젼,  배포판  코드네임, 배포판 설명 등을 보여준다.

참 쉽죠? 

Posted by code cat
리눅스2012. 2. 24. 13:26

머 이리 많냐!!! 싶겠지만, 알고나면 별거 아니다.


/bin

/usr 같은 큰 파티션이 마운트 되기 전에 / 에 위치해야 할 작은 프로그램 전용. 대표적인 예로, /bin/sh이 있겠다.


/sbin

/bin과 같이 /usr같은 큰 파티션이 마운트 되기전에 필요한 것은 동일하지만, /bin과 달리 시스템 관리 프로그램들이 주로 상주한다.


/usr/bin

배포판에서 관리하는 보통의 유저 프로그램이 위치한다.


/usr/sbin

배폰판에서 관리하는 시스템 관리 프로그램들이 위치한다.


/usr/local/bin

배포판 패키지 관리자가 관리하지 않는 보통의 유저 프로그램(예: 로컬에서 컴파일한 패키지들)이 위치한다.


/usr/local/sbin

배도판 패키지 관리자가 관리하지 않는 시스템 관리 프로그램이 위치한다.


/opt

참조: http://codecat.tistory.com/entry/opt


마지막으로, 만일 같은 이름이 프로그램이 여기저기 있다면 어디 먼저 실행이 될까?

그건

echo $PATH

로 $PATH를 찍어보면 제일 먼저 나오는 경로 순으로 찾아서 실행이 된다.



'리눅스' 카테고리의 다른 글

GOT (Global Offset Table)  (0) 2012.03.02
리눅스 배포판 이름 버젼 알아내기  (0) 2012.03.02
Linux: umask  (0) 2012.01.03
JBD error message "barrier-based sync failed"  (0) 2011.08.17
EXT4 파일 시스템 굽기  (0) 2011.08.02
Posted by code cat