[Linux:Kernel] Documentation/printk-formats.txt

이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under GPL license).

변수가 아래 타입이라면,           printk형식 지시자를 사용하세요:
———————————————————
                int                     %d 나 %x
                unsigned int            %u 나 %x
                long                    %ld 나 %lx
                unsigned long           %lu 나 %lx
                long long               %lld 나 %llx
                unsigned long long      %llu 나 %llx
                size_t                  %zu 나 %zx
                ssize_t                 %zd 나 %zx

가공되지 않은 포인터 값은 %p로 출력되는 것이 ‘좋습니다’. 커널은 포인터
형식을 위해 다음의 확장된 형식 지시자를 지원합니다:

심볼/함수 포인터:

        %pF     versatile_init+0x0/0x110
        %pf     versatile_init
        %pS     versatile_init+0x0/0x110
        %pSR    versatile_init+0x9/0x110
                (__builtin_extract_return_addr() 변환으로)
        %ps     versatile_init
        %pB     prev_fn_of_versatile_init+0x88/0x88

        심볼과 함수 포인터를 출력하기 위해서, (‘S’)로 오프셋과 함께, 혹은 (‘s’)로
        오프셋 없이, ‘S’와 ‘s’ 지시자들로 심볼 이름을 나타냅니다. KALLSYMS 없는
        커널 상에서 사용되면, 심볼 주소가 대신 출력됩니다.

        ‘B’ 지시자는 오프셋과 함께 심볼 이름을 나타내고, 스택 트레이스를 출력할
        때 사용되어야 합니다. 이 지시자는 Tail-Call이 사용되고, noreturn GCC 속성으로
        표시되었을 때 일어날 컴파일러 최적화의 효과를 고려하게 합니다.

        ia64, ppc64, 그리고 parisc64 아키텍처에서 함수 포인터들은 실제로는
        가장 먼저 풀어야 할 함수 기술자들입니다. ‘F’와 ‘f’ 지시자는 이 해결을
        수행하여 ‘S’와 ‘s’ 지시자와 같은 기능을 제공합니다.

커널 포인터:

        %pK     0x01234567 나 0x0123456789abcdef

        권한이 없는 사용자에게 가려져야 할 커널 포인터를 출력하기 위해서 사용.
        %pK의 동작은 kptr_restrict sysctl에 의존적입니다.
        – 더 자세한 사항은 Documentation/sysctl/kernel.txt를 보세요.

구조체 자원:

        %pr     [mem 0x60000000-0x6fffffff flags 0x2200] or
                [mem 0x0000000060000000-0x000000006fffffff flags 0x2200]
        %pR     [mem 0x60000000-0x6fffffff pref] or
                [mem 0x0000000060000000-0x000000006fffffff pref]

        구조체 자원을 출력하기 위해 사용. ‘R’과 ‘r’ 지시자는 디코딩된 플래그
        멤버들이 있게(‘R’) 혹은 없게(‘r’) 자원을 출력합니다.

phys_addr_t 타입의 물리 주소:

        %pa[p]  0x01234567 나 0x0123456789abcdef

        CPU 데이터 경로의 너비와 상관없이, 빌드 옵션에 의해서 다양하게 될 수 있는
        phys_addr_t 타입(그리고 resource_size_t 같은 그 변형)의 출력을 위해서 사용.
        참조로 넘김.
        

dma_addr_t 타입의 DMA 주소:

        %pad    0x01234567 나 0x0123456789abcdef

        CPU 데이터 경로의 너비와 상관없이, 빌드 옵션에 의해서 다양하게 될 수 있는
        dma_addr_t 타입의 출력을 위해서 사용. 참조로 넘김.

16진수 문자열의 비가공 버퍼:
        %*ph    00 01 02  …  3f
        %*phC   00:01:02: … :3f
        %*phD   00-01-02- … -3f
        %*phN   000102 … 3f

        명확한 구분자로 된 16진수 문자열로 작은 버퍼(64 바이트 길이까지의)를
        출력할 때 사용. 더 큰 버퍼는 print_hex_dump()의 사용을 고려하세요.

MAC/FDDI 주소:

        %pM     00:01:02:03:04:05
        %pMR    05:04:03:02:01:00
        %pMF    00-01-02-03-04-05
        %pm     000102030405
        %pmR    050403020100

        16진수 표기로 된 6바이트 MAC/FDDI 주소를 출력할 때 사용. ‘M’과
        ‘m’ 지시자는 바이트 구분자가 있게(‘M’) 혹은 없게(‘m’) 주소를 출력합니다.
        기본 바이트 구분자는 콜론(‘:’)입니다.

        FDDI 주소들이 쓰이는 곳에서 ‘F’ 지시자는 기본 구분자 대신에 대시(‘-‘)
        구분자를 사용하기 위해서 ‘M’ 지시자 이후에 사용될 수 있습니다.

        블루투스 주소를 위해서 리틀 엔디언으로 된 블루투스 주소의 보이는 형태의
        거꾸로 된 바이트 순서 맞춤을 사용하기 위해서 ‘R’ 지시자가 쓰이면 좋습니다.

IPv4 주소:

        %pI4    1.2.3.4
        %pi4    001.002.003.004
        %p[Ii]4[hnbl]

        IPv4의 점으로 구분된 10진수 주소를 출력할 때 사용. ‘I4’와 ‘i4’ 지시자는
        앞 쪽 0들이 있게(‘i4’) 혹은 없게(‘I4’) 주소를 출력합니다.

        덧붙는 ‘h’, ‘n’, ‘b’, 그리고 ‘l’ 지사자들은 각각 호스트, 네트워크,
        빅 또는    리틀 엔디언 주소를 나타내는데 사용됩니다. 아무 지시자가 없다면,
        기본 네트워크/빅 엔디언 오더가 사용됩니다.

IPv6 주소:

        %pI6    0001:0002:0003:0004:0005:0006:0007:0008
        %pi6    00010002000300040005000600070008
        %pI6c   1:2:3:4:5:6:7:8

        IPv6 네트워크-오더 16비트 16진수 주소를 출력할 때 사용. ‘I6’와 ‘i6’
        지시자는 콜론 구분자가 있게(‘I6’) 혹은 없게(‘i6’) 주소를 출력합니다.
        앞 쪽의 0들은 항상 사용됩니다.
        
        덧붙는 ‘c’ 지시자는 ‘I’ 지시자와 함께 http://tools.ietf.org/html/rfc5952에
        쓰여 있는 압축된 IPv6 주소를 출력하는데 사용할 수 있습니다.

IPv4/IPv6 주소 (일반적인, 포트와 함께, flowinfo, 범위):

        %pIS    1.2.3.4         나 0001:0002:0003:0004:0005:0006:0007:0008
        %piS    001.002.003.004 나 00010002000300040005000600070008
        %pISc   1.2.3.4         나 1:2:3:4:5:6:7:8
        %pISpc  1.2.3.4:12345   나 [1:2:3:4:5:6:7:8]:12345
        %p[Ii]S[pfschnbl]

        그 타입이 AF_INET인지 AF_INET6인지 구분할 필요 없이 IP 주소를 줄력할 때
        사용. ‘IS’ 또는 ‘iS’를 통해 지정된 유효한 ‘struct socketaddr’로의
        포인터는 이 형식 지시자에게 넘겨질 수 있습니다.

        덧붙는 ‘p’, ‘f’, 그리고 ‘s’ 지시자는 포트(IPv4, IPv6), flowinfo(IPv6),
        범위(IPv6)를 지정하는데 사용됩니다. 포트는 “:” 접두어를 갖고, flowinfo는
        ‘/’, 그리고 스코프는 ‘%’를 갖고, 각각 실제 값이 뒤 따릅니다.

        IPv6 주소의 경우에 http://tools.ietf.org/html/rfc5952에서 기술된
        압축된 IPv6 주소는 지시자 ‘c’를 사용하면 사용됩니다. IPv6 주소는
        추가적인 지시자        ‘p’, ‘f’, ‘s’의 경우에
        https://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07 에
        제안된 것처럼 ‘[‘, ‘]’로 둘러싸입니다.

        IPv4 주소의 경우, 덧붙는 ‘h’, ‘n’, ‘b’, 그리고 ‘l’ 지시자가 잘 사용될 수
        있고, IPv6 주소의 경우에는 무시됩니다.

        더 많은 예제:

        %pISfc          1.2.3.4         나 [1:2:3:4:5:6:7:8]/123456789
        %pISsc          1.2.3.4         나 [1:2:3:4:5:6:7:8]%1234567890
        %pISpfc         1.2.3.4:12345   나 [1:2:3:4:5:6:7:8]:12345/123456789

UUID/GUID 주소:

        %pUb    00010203-0405-0607-0809-0a0b0c0d0e0f
        %pUB    00010203-0405-0607-0809-0A0B0C0D0E0F
        %pUl    03020100-0504-0706-0809-0a0b0c0e0e0f
        %pUL    03020100-0504-0706-0809-0A0B0C0E0E0F

        16바이트 UUID/GUID 주소를 출력하기 위해 사용. 덧붙는 ‘l’, ‘L’, ‘b’,
        그리고, ‘B’ 지시자는 리틀 엔디언 오더를 소문자(‘l’) 또는 대문자(‘L’)
        16진수 문자로 – 그리고 빅 엔디언 오더를 소문자(‘b’) 또는 대문자(‘B’)
        16진수 문자로 표시하는데 사용됩니다.

        아무 추가 지시자도 붙지 않으면 기본으로 리틀 엔디언 오더에 소문자로
        출력될 것입니다.

dentry 이름:
        %pd{,2,3,4}
        %pD{,2,3,4}

        dentry 이름을 출력하는데 사용; 만약 우리가 d_move()로 경쟁 상태를 만들면,
        그 이름은 오래된 것과 새 것이 섞일 것입니다. 웁스를 일으키지 않습니다.
        %pd dentry는 우리가 사용하곤 했던 %s dentry->d_name.name와 같지만 더
        안전합니다. %pd<n>은 마지막 n 컴포넌트를 출력합니다. %pD는 struct file에
        같은 동작을 합니다.

struct va_format:

        %pV

        struct va_fotmat 구조체를 출력하는데 사용. 이들은 다음과 같은 va_list와
        형식 문자열을 포함합니다:

        struct va_format {
                const char *fmt;
                va_list *va;
        };

        형식 문자열이나 va_list 인자들의 정확성을 확인하기 위한 어떤 메카니즘 없이
        이 기능을 사용하지 마세요.

u64는 %llu/&llx로 ‘출력해야’ 합니다:

        printk(“%llu”, u64_var);

s64는 %lld/%llx로 ‘출력해야’ 합니다:

        printk(“%lld”, s64_var);

Example:
<type>이 그 크기의 설정 옵션(예를 들면, sector_t, blkcnt_t)이나 그 크기의 아키텍처
(예를 들면, tcflag_t)에 의존적이라면, 가능한 가장 큰 타입의 형식 지시자를 쓰고
명시적으로 형을 변환하세요.
예제:

        printk(“test: sector number/total blocks: %llu/%llu\n”,
                (unsigned long long)sector, (unsigned long long)blockcount);

다시 알림: sizeof() 결과는 size_t 타입입니다.

여러분의 협력과 주의에 감사합니다.
By Randy Dunlap <rdunlap@infradead.org> and
Andrew Murray <amurray@mpc-data.co.uk>
그리고 우리말 번역에 양정석 <dasomoli@gmail.com>

[Ubuntu] root 인증서 설치

프록시를 사용하는 환경에서 https 프로토콜을 사용할 때 인증 오류가 나는 경우, ca-certificate 인증 문제일 경우가 많다. 프록시 사용에 따른 인증서를 제공한다면 이걸 시스템 전역적으로 설치해주면 해결된다. 절차는 간단하다.

$ sudo mkdir /usr/share/ca-certificates/extra
$ sudo cp foo.crt /usr/share/ca-certificates/extra/
$ sudo dpkg-reconfigure ca-certificates

하고나서 껐다켜야 잘 되던데? 왜그런거지..

출처: http://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate

발생한 문제를 둘 모두가 긍정적이고 적극적인 자세로 풀어가라. 인내하지 마라.

‘부부 사이에는 어떤 문제든 늘 일어난다. 그게 살아 있는 부부다. 원만하고 건강한 부부란, 아무 문제가 없는 부부가 아니라 발생한 문제를 두 사람 모두 긍정적이고 적극적인 자세로 풀어 가는 부부다. 물론 싸움에만 집착하여 서로 잘잘못을 가리는 것도 문제다. 하지만 정반대로 세월이 약이라고 인내만을 미덕으로 삼는 것도 잘못이다. 인내는 좋은 미덕이 틀림없으나 모든 걸 해결해 주지는 못한다. “어차피 대화도 안 통하는데 내가 참지”라고 침묵한다면 문제는 더욱 심각하다.’

“나는 죽을 때까지 재미있게 살고 싶다” 290p.

어찌 부부 관계만 이러랴.

말을 할 때 명심할 열가지 조언

‘말을 할 때는 다음의 열 가지를 명심하라.

첫째, 상스러운 말은 하지 마라. 욕이나 비하하는 말은 말 가운데 가장 낮은 하수다.
둘째, 상대가 제일 싫어하는 말은 절대 하지 마라. 누구나 정말 듣기 싫은 말이 있다. 그 말은 뇌관이다. 건드리면 폭발한다.
셋째, 남과 비교하는 말은 피하자. 세 살 먹은 아이부터 팔십 살 먹은 노인까지, 남과 비교하면 정말 기분 나쁘다.
넷째, 인격을 무시하는 말로 공격하지 마라. 자존심을 건드리면 관계를 회복하기 어렵다. 두고두고 원망만 들을 뿐이다.
다섯째, 상대 가족을 헐뜯지 마라. 본질과는 아무 상관도 없는 상대의 가족은 어떤 상황에서도 건드리지 마라.
여섯째, 폭탄선언은 제발 참아라. ‘우리 헤어져’, ‘이혼하자’, ‘사표내야지’ 등 이런 이야기는 정말 마지막에 하는 말이다.
일곱째, 유머 있는 대화의 기술이 필요하다. 무슨 이야기든 심각할 필요는 없다.
여덟째, 분명한 말은 오해를 남기지 않는다. 확실한 ‘예스’와 확실한 ‘노’는 연습해야 잘할 수 있다.
아홉째, 비비 꼬는 꽈배기 말은 하지 마라. 마음이 꼬여 있을 때는 침묵하는 게 낫다.
열째, 사람을 죽이는 독 있는 말도 있다. 말은 세상에서 가장 무서운 독이 되기도 하고 명약이 되기도 한다.’

“나는 죽을 때까지 재미있게 살고 싶다” 안의 “말실수를 하고 후회한 적이 많은 사람들에게” 222~223p.

나도 경험으로 얻었던 몇가지 조언에 더해서 구구절절 맞는 조언들. 뼈저리다.

상대의 특별한 점을 기억하라

‘대놓고 “당신은 무슨 일을 잘 하냐”고 묻기도 한다. 보통 사람들은 그런 질문에 답하기를 좋아하고, 질문을 한 상대방에게 호감을 가진다’

‘자, 50여 년 경력의 정신과 의사가 일러 주는 인간관계의 비결은 상대의 특별한 점을 기억하라는 것이다.’

“나는 죽을 때까지 재미있게 살고 싶다” 220~221p.

좋은 질문이다. 답하는 사람이 흥이 나는 질문이니까. 질문자에게 호감이 생기는 것이 당연하다.

좋은 질문 하니까 생각나는데, 얼마 전 누군가가 지인들에게 “너는 내가 왜 좋아?”라고 자주 묻는단 이야기를 들었다. 이 또한 좋은 질문이다.
답변자는 일단 질문자를 내가 좋아하는가-질문자에 대해서- 생각할테고, 질문자를 좋아한다면, 그 이유에 대해 생각해 볼 것이고, 이를 말로 할테니까.
좋아하지는 않더라도 그와의 관계를 해치기 싫은 사람이라면 이유는 어찌됐던 이래서 좋다고 말로 할테니까.
그를 싫어하는 사람이라면, 그리고 질문자가 답변자가 자신을 좋아한다고 오해하고 있었다면 그게 아님을 알 수 있을테니까.
그를 싫어하는 사람에게, 그리고 질문자가 그 사실을 알고 있다면 저 질문이 나오지 않겠지.
어떠한 것을 밖으로 꺼내어 말로 하는 것은 큰 차이를 일으킨다. 사실일 경우, 생각이 더 확고해지고, 사실이 아닐 경우는 자기합리화의 과정을 거치기 때문이다. 그래서 말이 결국 사실-여기선 질문자를 좋아한다는 사실-이 된다.

상대의 특별한 점을 기억하라는 건 디테일의 힘과도 상통한다. 상세하게 나를 기억하는 사람이 어찌 싫을까.

이러나 저러나, 호감의 이야기를 보고 예전의 내가 생각나서 적는다. 난 오래전 아마 모두의 사랑을 받고 싶었던 것 같다. 나를 싫어하는 사람도 나를 좋아하게 하고 싶었던 것 같다. 그래서 내가 먼저 내민 손을 받아주지 않는 상대를 서운해하고, 원망했고, 이해할 수 없었다. 나중에서야 내 욕심임을 알았지만.
요즘은 나를 싫어해도, 내가 먼저 내민 손을 치워도 그냥 그러려니 한다. 그럴 수 있음이다. 사람 맘은 내 맘대로 되는 것이 아니다. 그저 조용히 손을 다시 거둘 뿐이다.

최선을 다하지 말고, 여력을 남겨라

‘나는 ‘최선’이라는 말이 싫다. 최선은 내가 가진 100을 다 쓰라는 말이다. 그러면 씨앗을 먹어 치운 농부처럼 내일을 기약할 수 없게 된다.’

‘이 많은 일을 할 수 있었던 것은 늘 나의 능력을 30퍼센트 가량 아껴 두었기 때문이다.’

“나는 죽을 때까지 재미있게 살고 싶다” 안의 “내가 ‘최선을 다하라’라는 말을 싫어하는 이유”

난 이 깨달음이 늦었다. 입사하고 한창 의욕이 과해 잠도 안자고, 몸 깎아가며 일하던, 내가 맡지 않아도 될 몫까지 끌어 안고, ‘책임감’이란 단어에 취해서 나를 태우던 그 때, 지친 나를 다른 부서의 한 선임님은 ‘기름을 채워야 또 달리지. 기름도 안채우고 계속 달리면 멈춰요’라며 반강제로 스타벅스로 데려가 한가로이 라떼를 먹였다.

여력을 남겨라. 남는 힘이 없으면 모든 일이 귀찮아진다. 그 일 외에 아무 것도 할 수 없게 된다. 그리고 그 남는 일들이 점점 쌓인다. 정말 돌이킬 수 없게 된다. 건강을 해치는건 덤이다. 그런데 그 덤을 얻으면, 네 인생 전체가 사라진다.

[ARM] Cortex-A 페이징

ARM Cortex-A 페이징에 대해서 잘 적혀있는 글 발견!
설명하면서 쓴 단어의 정의들도 정확하다. 설명도 간략하면서 쉽게 되어 있다.

http://kth3321.blogspot.kr/search?q=ARM+Cortex-A+%ED%8E%98%EC%9D%B4%EC%A7%95 

아참, 본문의 내용 중 예제에 Offset에 따른 물리 주소를 그저 Offset을 더하는 것으로 설명되어져 있는데, 이 부분은 잘못된 것으로 보인다. 실제로는 32비트 주소 값 혹은 pgd/pte 의 주소+a를 갖고 있으므로 Base + Offset * 4(=32 bits) 의 물리 주소를 참조한다.

[Linux:Kernel] AArch64 리눅스의 메모리 배치

이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under the GPL license).

Documentation/arm64/memory.txt

     AArch64 리눅스의 메모리 배치
     ============================

Author: Catalin Marinas <catalin.marinas@arm.com>
번역  : 양정석 <dasomoli@gmailREMOVETHIS.com>
Date  : 20 February 2012

이 문서는 AArch64 리눅스 커널이 사용하는 가상 메모리 배치를 설명합니다.
이 아키텍처는 4KB 페이지 크기의 4단계 변환 테이블과 64KB 페이지 크기의
3단계 변환 테이블을 허용합니다.

AArch64 리눅스는 유저와 커널 양 쪽 모두 39비트 (512GB) 가상 주소를 허용하는
4KB 페이지 설정의 3단계 변환 테이블을 사용합니다. 64KB 페이지는 오직
2단계 변환 테이블이 사용되지만 메모리 배치는 같습니다.

유저 주소는 63:39 비트가 0으로 셋팅되는 반면, 커널 주소는 같은 곳의 비트에
1로 셋팅됩니다. TTBRx 선택은 가상 주소의 비트 63에 의해 결정됩니다.
swapper_pg_dir은 오직 커널 (전역) 맵핑만 포합하는 반면,
유저 pgd는 오직 유저 (비전역) 맵핑만 포함합니다. swapper_pgd_dir 주소는
TTBR1으로 쓰여지고, TTBR0로 절대 쓰여지지 않습니다.


4KB 페이지의 AArch64 리눅스 메모리 배치:

시작 크기 용도
———————————————————————–
0000000000000000 0000007fffffffff 512GB 유저

ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc

ffffffbbffff0000 ffffffbbffffffff  64KB [guard page]

ffffffbc00000000 ffffffbdffffffff   8GB vmemmap

ffffffbe00000000 ffffffbffbbfffff  ~8GB [guard, 추후 vmmemap]

ffffffbffa000000 ffffffbffaffffff  16MB PCI I/O 공간

ffffffbffb000000 ffffffbffbbfffff  12MB [guard]

ffffffbffbc00000 ffffffbffbdfffff   2MB 고정 맵핑

ffffffbffbe00000 ffffffbffbffffff   2MB [guard]

ffffffbffc000000 ffffffbfffffffff  64MB 모듈들

ffffffc000000000 ffffffffffffffff 256GB 커널 논리 메모리 맵


64KB 페이지의 AArch64 리눅스 메모리 배치:

시작 크기 용도
———————————————————————–
0000000000000000 000003ffffffffff   4TB 유저

fffffc0000000000 fffffdfbfffeffff  ~2TB vmalloc

fffffdfbffff0000 fffffdfbffffffff  64KB [guard page]

fffffdfc00000000 fffffdfdffffffff   8GB vmemmap

fffffdfe00000000 fffffdfffbbfffff  ~8GB [guard, 추후 vmmemap]

fffffdfffa000000 fffffdfffaffffff  16MB PCI I/O 공간

fffffdfffb000000 fffffdfffbbfffff  12MB [guard]

fffffdfffbc00000 fffffdfffbdfffff   2MB 고정 맵핑

fffffdfffbe00000 fffffdfffbffffff   2MB [guard]

fffffdfffc000000 fffffdffffffffff  64MB 모듈들

fffffe0000000000 ffffffffffffffff   2TB 커널 논리 메모리 맵


4KB 페이지의 변환 테이블 탐색:

+——–+——–+——–+——–+——–+——–+——–+——–+
|63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
+——–+——–+——–+——–+——–+——–+——–+——–+
 |                 |         |         |         |         |
 |                 |         |         |         |         v
 |                 |         |         |         |   [11:0]  페이지 내의 오프셋
 |                 |         |         |         +-> [20:12] L3 인덱스
 |                 |         |         +———–> [29:21] L2 인덱스
 |                 |         +———————> [38:30] L1 인덱스
 |                 +——————————-> [47:39] L0 인덱스 (미사용)
 +————————————————-> [63] TTBR0/1


64KB 페이지의 변환 테이블 탐색:

+——–+——–+——–+——–+——–+——–+——–+——–+
|63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
+——–+——–+——–+——–+——–+——–+——–+——–+
 |                 |    |               |              |
 |                 |    |               |              v
 |                 |    |               |            [15:0]  페이지 내의 오프셋
 |                 |    |               +———-> [28:16] L3 인덱스
 |                 |    +————————–> [41:29] L2 인덱스 (38:29 만 사용)
 |                 +——————————-> [47:42] L1 인덱스 (미사용)
 +————————————————-> [63] TTBR0/1

KVM을 사용할 때, 하이퍼바이저는 커널 페이지를 EL2에서 커널 VA로부터 고정된
오프셋(커널 VA의 상위 24비트를 0으로 셋팅한)에 맵핑합니다:

시작 크기 용도
———————————————————————–
0000004000000000 0000007fffffffff 256GB HYP 내에서 맵핑된 커널 객체