이해가 안가는 Instruction

조회 수 1109 추천 수 0 2010.03.17 23:54:49

분석하고 있는 부분은 다음과 같습니다.

 

percpu_from_op [ arch/x86/include/asm/percpu.h ]

 

 

 

typeof(var)   ret__;

 

asm(op "l "__percpu_arg(1)",%0"         \
                     : "=r" (ret__)                      \
                     : "m" (var));

 

위 소스를 전처리기를 거쳐서 최종 치환한 형태는 아래있습니다.

 

int   ret__;

 

asm("mov" "l "%fs:%P1",%0"         \
                     : "=r" (ret__)                      \
                     : "m" (var));

 

참고로 여기서 var는 per_cpu__cpu_number 입니다.

 

"=r"은 범용레지스터 (eax, ebx, ecx, edx)에 해당하는 것으로 레지스터를 출력하겠다는 의미일테고,

"m"은 메모리로 per_cpu__cpu_number를 입력하겠다는 것인데, 그 위에 Instruction 부분이 이해가 안갑니다.

"mov" "l "%fs:%P1",%0"  <<<--- 이부분의 뜻이 뭔가요 ?

 

전체적으로 종합해서

 

asm("mov" "l "%fs:%P1",%0"         \
                     : "=r" (ret__)                      \
                     : "m" (var));

 

위 문장의 의미는 무엇이 되나요 ?

 

 

 

 


이상훈

2010.03.18 00:01:50
*.36.40.20

이런 테스트 프로그램을 짜봤는데, 어셈 처리하는 부분에서 Segmentation Fault가 발생합니다.

 

#include <stdio.h>

 

struct kernel_symbol{
        unsigned long value;
        const char *name;
};

 

int cpu_number = 10;

 

#define MODULE  ""

#define TEST(sym, sec)                                        \
        extern typeof(sym) sym;                               \
        static char b_##sym[]                                 \
        __attribute__((section("data.module"), aligned(1)))   \
        = MODULE #sym;                                        \
        static struct kernel_symbol __ksymtab_##sym           \
        __attribute__((__used__))                             \
        __attribute__((section("ksymtab" sec), unused))       \
        = { (unsigned long)&sym, b_##sym }

 

#define __stringify_1(x...)     #x
#define __stringify(x...)       __stringify_1(x)

 

#define __percpu_seg            fs

#define __percpu_arg(x)         "%%"__stringify(__percpu_seg)":%P" #x

 

int main(void){
        TEST(cpu_number, "");
        typeof(int) ret__;
        char *string = "hihi";
        printf(__percpu_arg(1)"\n");
        asm("mov" "l "__percpu_arg(1)",%0"         \
              : "=r" (ret__)                       \
              : "m" (__ksymtab_cpu_number));
        return 0;
}

백창우

2010.03.18 00:27:00
*.33.115.195

초기화 되지 않은 %fs를 base로 해서 그렇습니다.

아래와 같이 바꾸어 보시기 바랍니다.

 

#define __percpu_seg            ds

 

백창우

2010.03.18 00:48:25
*.33.115.195

음... 그리고 percpu 영역은 user mode에서는 접근이 불가능합니다.

백창우

2010.03.18 00:12:24
*.33.115.195

아래와 같이 될것 같습니다.

 

movl %fs:var, %eax

 

var이 local variable이면 위 var 부분이 %ebp에서 var만큼 offset으로 설정될 겁니다.

 

 

 

 

 

이상훈

2010.03.18 00:22:04
*.36.40.20

var가 per_cpu__cpu_number라는 변수가 되던거 같은데,

%ebp에서 per_cpu__cpu_number만큼 offset으로 설정된다는 의미가 무엇인가요 ?

 

%ebp의 위치에서 per_cpu__cpu_number만큼을 이동시킨 offset값을 eax에 집어넣는다는 뜻인가요 ?

백창우

2010.03.18 00:29:17
*.33.115.195

%ebp에서 per_cpu__cpu_number만큼 offset으로 설정된다는 의미가 무엇인가요 ?

 

-  만약 var이 local variable이였다면 다음과 같이 되었을 것입니다.

movl %fs:-[%ebp에서 var의 offset](%ebp), %eax

 

 

 

이상훈

2010.03.18 01:33:32
*.36.40.20

아하 ... fs에 ebp에서 per_cpu__cpu_number까지의 offset값을 eax에 집어넣는다는 뜻이군요 ? ㅎㅎ

김남형

2010.03.18 01:06:22
*.141.205.244

percpu 영역은 GDT 내에 전용 디스크립터를 따로 만들어두고 접근한다는 것을 이해하시는 것이 중요합니다.

따라서 일반 변수처럼 (암시적으로 사용되는) ds 세그먼트 레지스터를 사용하지 않고 fs를 이용해서 접근해야 합니다.

창우님 말씀처럼 percpu 영역은 user 모드에서 접근할 수 없지만

user 모드에서 percpu와 비슷한 효과를 내는 것으로 TLS (thread local storage)가 있습니다.

(물론 개념이나 적용되는 상황이 다릅니다만.. ;;)

둘 다 세그먼트 디스크립터를 조작해야 하기 때문에 고려할 사항이 많습니다.

이상훈

2010.03.18 01:34:41
*.36.40.20

x86이 이런 부분이 골치아픈거 같은데, ARM도 Segment Register 역할을 하는 것이 있나요 ?

백창우

2010.03.18 08:57:49
*.101.139.144

없습니다. ARM은 훨씬 simple합니다.

 

이상훈

2010.03.18 11:07:03
*.36.40.20

망할 intel ... CPU Spec Architecture Manual만 해도 ... 5권이 넘으니 ㅋㅋㅋ

ARM은 비교적 적은거 같습니다(Inetl에 비해서 ...)

List of Articles
번호 제목 글쓴이 날짜 조회 수
122 Multi Threading시 Delayed Branch가 오류를 만들 수 있습니까 ? [6] 이상훈 2010-04-12 3900
121 INTEL의 EFI(Extensible Firmware Interface)가 무엇인가요? [8] 김태훈 2010-04-11 2365
120 Hardware Virtual Machine에서 Nested Page Tables 정확한 역활과 이점이 무엇인가요? [6] 김태훈 2010-04-11 2312
119 ARM 보드에서 잘못된 파일 크기 읽어오는 현상 [6] 김태훈 2010-04-07 2299
118 Wiki Page와 Link연동 관련 문의 [3] 이상훈 2010-04-06 1890
117 게시판 글에 이미지 삽입 방법 ... ? [5] 이상훈 2010-04-06 1976
116 Pipeline Scheduling과 몇 가지 질문 [5] 이상훈 2010-04-05 2008
115 창우님께 스터디 진행에 대해 도움을 요청 드립니다~ [2] 최원재 2010-04-05 1921
114 이게 뭔 소릴까요 ... ? [2] 이상훈 2010-04-01 1808
113 Dynamic Argument란 ? [15] 이상훈 2010-03-30 1778
112 USIM으로 할 수 있는것들? [2] 백창우 2010-03-29 2010
111 흠 ... 특정 주소값 [3] 이상훈 2010-03-27 1889
110 임베디드 OS 만들기 내용과 관련하여 문의드립니다. [6] 송인재 2010-03-25 2124
109 make에서 질문 [2] 이상훈 2010-03-22 2026
108 sparsemem에 대한 질문이 있습니다. [5] 안정모 2010-03-20 2165
107 이것이 의미하는 바가 무엇인가요 ? [2] 이상훈 2010-03-20 1591
106 hardware speculation관련 질문합니다. [3] 이상철 2010-03-18 1154
» 이해가 안가는 Instruction [11] 이상훈 2010-03-17 1109
104 LC_MESSAGES, setlocale이 뭐하는걸까요 ~~ ??? [2] 이상훈 2010-03-17 951
103 GMP와 MPFR [2] 이상훈 2010-03-17 1023



XE Login