보통은 yum install kernel-devel 혹은 yum install kernel-header 등등

yum list | grep kernel 로 뽑아서 대충 설치하면 잘 된다

 

그런데 가끔 안되는 경우가 있으니...

 

/lib/modules/자기리눅스이름(uname -r)/source 혹은 build 파일의 심볼릭 링크 경로를 확인하기 바란다

요 경로를 다시 /usr/src/kernels/리눅스 버전 이런식으로 맞춰주면 오케이

(리눅스 패키지 종류에 따라 정확한 경로는 다를듯)

 

그런데 이게 안되는 골 때리는 경우가 있다

 

분명 다 맞춰줬는데 왜 이러니?

 

 

 

생각해보니까 원래 설치한 페도라에다가 최신버전의 커널패치를 추가로 한지라

yum install kernel-header를 해도 구버전 페도라의 소스만 다운받아서 설치하니 의미가 없던 것이었다

 

이럴 때는 yum-builddep 라는 놈을 사용해야하는 것 같은데 이걸 어케 설치하나 찾아봤더니

yum install yum-utils 더라...

뭐 apt쓰는 분이나 기타 등등은 알아서 ㅋㅋ

 

대충 이름을 보아하니 build에 specific하게 맞춰서 찾아주는듯

혹은 yum install kernel-버전이름 이런식으로 해도 된다고 양키들이 말하는데 앙댄다

 

여튼 yum-builddep kernel-devel 해보니까 뭔가 엄청 깔더니 어........

여전히 module 컴파일이 안되네

EXTRAVERSION을 바꿔서 그런가 음니아럼니아러민아러

 

 

아 컴파일 잘 된당

소스 디렉토리 이름의 규칙을 정확하게 잘 지키니 okay

소스 디렉토리 이름에 EXTRAVERSION이름을 붙이니 컴빠일이 앙대네요

Posted by 쵸코케키

2012. 7. 26. 17:13 devel/man & example

ioctl

ioctl이 뭐하는 녀석이지? 하는 궁금증이 많았는데 친절하고 구체적으로 나와있는글이 거의 없더라

http://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/device-understanding.html

그러다가 위의 링크를 읽어보니 아하~ 하고 깨닫게 되었다

 

int main()
{
int fd; char buf[256];

fd = open("/dev/hdd_info", O_RDWR);
ioctl(fd, 0, buf);

printf("buf : %s\n", buf);
close(fd);
return 0;
}

 

위의 kldp 링크 중에 나와있는 소스코드이다(살짝 수정을 했다 좀...)

open으로 장치 하나 열어서

ioctl로 장치에게 동작 명령 내리고

출력하고 다시 장치 닫는다

 

 

ioctl은 장치에게 그냥 이미 정의되어있는 명령을 내리는(함수를 호출하는) 놈이라는 것을 알게 되었다

대신 장치를 우선 open으로 열고 인자로 그 file descriptor랑 가운데 request number를 넣어서 어떤 함수를 호출할지를 정하는듯

 

그런데 동일한 ioctl을 사용하는데 어떻게 장치마다 각기 다른 function을 호출 할 수 있지?

예를 들면 A파일을 열어서 ioctl에 0req#을 넣어서 하는 행위랑 B파일을 열어서 ioctl에 0req#을 넣어서 하는 행위가 어떻게 다르게 되는거지? (혹은 같게)

 

 

 

미리 device driver에 그런거 등록해놓는듯

 

 

가장 위의 링크를 보니까 struct file_operations에 미리 여러가지 말 그대로 file operation들을 등록할 수 있는데

struct file_operations Fops = {
NULL,
NULL,
hddinfo_read,
NULL,
NULL,
NULL,
hddinfo_ioctl,
NULL,
hddinfo_open,
NULL,
hddinfo_release
};
이런식으로 자기가 쓰고 싶은 놈들을 function 등록 ㅇㅇ

struct니까 멤버 위치당 역할은 고정

위의 코드를 디바이스 드라이버에 작성하고

(Fops와 Fops structure에 포함 등록 되어있는 function들을 정의)

 

insmod한 다음에 이제 유져 프로그램에서 ioctl 하면 그게 인쟈 잘 된다 이런 내용인듯

그렇다면 dd에는 하드웨어 접근 코드들을 넣으면 되겠구나 하는 생각이 들기도 하고

어느정도 권한까지 있으려나

 

여튼 kldp가 짱!짱!

'devel > man & example' 카테고리의 다른 글

arm assembly byte swap 예제 분석  (0) 2016.04.13
dev file  (0) 2015.08.04
const  (0) 2012.07.21
#define function macro  (0) 2012.07.15
#define 문자열 치환 및 합치기  (0) 2012.07.15
Posted by 쵸코케키

2012. 7. 21. 07:13 devel/man & example

const

int test=70;

const int* ptr = &test;

test=30;

 

*ptr = 30 -> x

 

 

 

int* const ptr=&test;

*ptr = 70

 

ptr=&date -> x

'devel > man & example' 카테고리의 다른 글

dev file  (0) 2015.08.04
ioctl  (0) 2012.07.26
#define function macro  (0) 2012.07.15
#define 문자열 치환 및 합치기  (0) 2012.07.15
strstr  (0) 2012.01.28
Posted by 쵸코케키

출처 : 윤성우의 열혈 C 프로그래밍


포인터 배열

int n1=10,n2=20,n3=30, n4=40;

int* ptr[4]

int* ptr[4] = {&n1, &n2 ...};


  

2차원 배열의 포인터

int a2d[2][4] = {1,2,3,4,5,6,7,8};

int (*pptr)[4] = a2d;

int형 변수를 가리키면서 sizeof(int)x4 단위로 증감을 한다

 

pptr[i][j]로 활용

'devel > code' 카테고리의 다른 글

for loop  (0) 2014.03.04
kcompat.h - linux kernel version  (0) 2014.02.26
문자열 배열  (0) 2013.07.06
c에서 linked list 자료형에 관계 없이 접근하기  (0) 2013.01.23
ntohs 같은 byte order 변경 함수  (0) 2012.10.24
Posted by 쵸코케키

#define SQUARE(X) ((X)*(X))

괄호를 마구 치는 이유

 

-> #define sq(x) (x)*(x) 라고 가정하면

 

int num = 120 / sq(2)

-> 120 / 2 * 2

연산자 우선 순위에 의하여 차례로 들어간다

그런고로 120이 num에 저장된다

 

 

크기가 작은 함수, 그리고 호출의 빈도수가 매우 높은 함수를 macro로 정의하는 것이 좋다고 한다

 

 

출처 : 윤성우의 열혈 C 프로그래밍

 

'devel > man & example' 카테고리의 다른 글

ioctl  (0) 2012.07.26
const  (0) 2012.07.21
#define 문자열 치환 및 합치기  (0) 2012.07.15
strstr  (0) 2012.01.28
arm inline assembly  (0) 2011.12.24
Posted by 쵸코케키

출처 : 윤성우의 열혈강의

Preprocessor 항목 부분

 

책을 친구에게 주려고 필요한 부분은 발췌해서 정리 헤헷

 

 

#include <stdio.h>

#define STRING_JOB(A, B) #A "의 직업은 " #B "입니다."

 

int main()

{

printf("%s, \n", STRING_JOB(으아아아, 떨어진드아아아아));

return 0;

}

 

 

 

# operator 역할

#define STRCAT(ABC) #ABC

STRCAT의 argument ABC를 문자열ABC로 치환한다

 

more tip

문자열은 나란히 선언하면, 하나의 문자열로 간주가 된다.

따라서 다음과 같이 문자열을 선언하는 것도 가능하다.

char* str="ABC" "DEF";

이는 다음과 동일하다

char* str="ABCDEF";

char* str=STRCAT(12) STRCAT(34);

 

 

 

문자열을 잇고 싶습니다

## operator

 

#define CON(UPP, LOW) UPP ## 00 ## LOW

int num = CON(22, 77);

-> 선행처리기에 의하여 컴파일 이전에 다음과 같이 치환된다

 

 

int num = 220077;

data type이 int형임을 유의깊게 보시오

 

 

'devel > man & example' 카테고리의 다른 글

const  (0) 2012.07.21
#define function macro  (0) 2012.07.15
strstr  (0) 2012.01.28
arm inline assembly  (0) 2011.12.24
thread starvation  (0) 2011.12.09
Posted by 쵸코케키

#0. git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

#1. vimrc를 카피한다


vimrc.txt


#2. vim +BundleInstall +qa

(서버가 느린지 시간이 꽤 오래 걸린다)


#3. 적당히 원하는 부분 수정해서 사용하도록 한다

(예를 들면 cscope를 autoload로 바꾸든지 등)

http://vim.wikia.com/wiki/Autoloading_Cscope_Database


#4. cscope 생성 할 때 find . ~~ 으로 하면 안되고

find `pwd` ~~ 로 생성해야 한다

SrcExpl에서 acd 를 사용하는데 그게 cscope와 호환이 잘 되지 않는다

그래서 절대 경로로 cscope 파일을 생성해야 함


기타 - NERDtree가 정상적으로 동작하지 않는 경우가 있다

이럴 때는 NERDtree를 껐다가 켜거나(caching error)

엔터키 대신 o키를 사용하여 파일을 열면 된다(원래는 enter를 쳐도 파일이 열려야 정상)


마우스가 은근 불편한데 toggle로 mouse mode를 켜고 끄도록 하면 편리할듯 싶다


vim 컴파일 할 때 ./configure --prefix /usr --enable-cscope 옵션을 줘야 한다

기존 fedora package 7.3은 /usr/bin에 설치되지만 7.4는 /usr/local/bin이 기본


Bundle로 Solarized 색상표가 오동작 하는 경우가 있다

그냥 이럴 때는 패키지를 삭제하고 직접 색상코드를 vim74/color 디렉토리에 넣고 사용하는게 낫다


vim 쓰다 먹통되면 십중 팔구는 ctrl + q 누르면 풀린다 


환경 설정 중 복잡한 부분 설명

F1 - 함수 폴딩(함수 function{} 에서 {에 대고 F1 누르면 접힌다)

F2 - 접은거 풀기

F3 - 뭐더라 까먹었다 ㅠㅠ

F5 - 선언한 원형으로 이동하기, 가장 많이 쓰일듯 싶다


문서 수정 해야 함 


~/.vimrc


set cindent

set smartindent

set autoindent

set mouse=a

 

set ts=4

set nu

set sw=4

set paste

"set expandtab

"au Bufenter * set et

 

set tags+=/usr/src/kernels/linux-2.6.37/tags

set csprg=/usr/bin/cscope

set csto=0

set cst 

set nocsverb

if filereadable("./cscope.out")

    cs add cscope.out

    cs add /usr/src/kernels/linux-3.12.10/cscope.out

else

    cs add /usr/src/kernels/linux-3.12.10/cscope.out

endif

set csverb

 

set wrap

set nobackup

set visualbell

set hlsearch

hi Comment ctermfg=6 ctermbg=none cterm=none

 

syntax enable 

set bg=dark


"colorscheme torte

"colorscheme ron

"colorscheme zellner

colorscheme peachpuff

"colorscheme solarized

set ruler

 

set bs=2 fo=cqrt ls=2 shm=at ww=<,>,h,l ts=4 sw=4

 

map <F1> v]}zf

map <F2> zo

map <F3> [i

map <F5> gd

map <F6> :tnext^M

map <F7> :tprevious^M

nmap <F8> :SrcExplToggle<CR>

nmap <F11> :TrinityToggleAll<CR>

nmap <F12> :TlistToggle<CR>


"nmap <F9> :NERDTreeToggle<CR>

"let NERDTreeWinPos = "right"

let NERDTreeIgnore = ['\.o$', '\.ko$', 'cscope.*', '\.a$', '\.symvers$']


map <C-n> :NERDTreeToggle<CR>

nmap <C-H> <C-W>h

nmap <C-L> <C-W>l

"nmap <C-J> <C-W>j

"nmap <C-K> <C-W>k


"cscope key map

nmap <c-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>

nmap <c-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>

nmap <c-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>

nmap <c-\>f :cs find f <C-R>=expand("<cword>")<CR><CR>


let Tlist_Ctags_Cmnd = "/usr/bin/ctags"

let Tlist_Inc_Winwidth = 0

let Tlist_Exit_OnlyWindow = 0

let Tlist_Auto_Open = 0

let Tlist_Use_Left_Window = 1



"// Map the keys below to jump from one window to another:

let g:SrcExpl_winHeight = 8

let g:SrcExpl_refreshTime = 100

let g:SrcExpl_isUpdateTags = 0

" // Set “Enter” key to jump into the exact definition context

let g:SrcExpl_jumpKey = "<ENTER>"

" // Set “Space” key for back from the definition context

let g:SrcExpl_gobackKey = "<SPACE>"


set nocompatible

filetype off                   " required!


set rtp+=~/.vim/bundle/vundle/

call vundle#rc()


Bundle 'gmarik/vundle'

Plugin 'The-NERD-tree'

Plugin 'taglist.vim'

Plugin 'c-standard-functions-highlight'

Plugin 'Trinity'

Plugin 'SrcExpl'

Bundle 'git://git.wincent.com/command-t.git'


filetype plugin indent on     " required!



그리고 tab space로 재정렬 :retab

Posted by 쵸코케키

제목을 잘 못 짓겠네요

어떤 함수가 있는데

argument가 uint32_t 였심

그런데 문제가 이 함수랑 연동해서 사용해야하는 read나 write는 byte단위로 움직임

 

uint32_t는 4byte인데 read/write는 1byte씩 사용하는 함수니 뭔가를 해야함

 

#include <stdint.h>

uint32_t u32;

uint8_t chr[2]={'a', 'c'};

memset(u32, 0, sizeof(u32));

strncpy(u32, chr, 2);

이런식으로 무식하게 사용해볼까 라고 생각도 했지만

strncpy가 그 넓고 넓은 uint32_t의 어디에 복사해 넣을지를 몰라서 못 사용함

 

여튼...

 

 

32bit data type 의 pointer를 가지고 8bit data type만큼 돌아댕길 일이 있었음

 

FILE STRUCTURE
 A  B  C  D    1  2  3  4

MEM STRUCTURE(after read() called)
            &mod_data[0],  &mod_data[1]
[ ][ ][ ][ ],     [ ][ ][ ][ ]
 D  C  B  A        4  3  2  1

mod_data는 uint32_t

그러면 B에 직접 접근하고 싶다

-> 혹시나 해서 찾아보니까 맞는듯

(http://jongampark.wordpress.com/2010/08/27/bit-field%EC%99%80-endian-byte-ordering/)

 

80              , (raw_data[0]& 0xFF)
 81              , (raw_data[0]& (0xFF<<8) ) >>8
 82              , (raw_data[0]& (0xFF<<0x10)) >>0x10
 83              , (raw_data[0]& (0xFF<<0x18)) >>0x18
 84              , (raw_data[1]& 0xFF)
 85              , (raw_data[1]& (0xFF<<8) ) >>8
 86              , (raw_data[1]& (0xFF<<0x10)) >>0x10
 87              , (raw_data[1]& (0xFF<<0x18)) >>0x18

이런식으로 shift시켜서 빼는거 말고

어떻게 해야할까?

 

 

 

 

 1. uint8_t*로 type casting

 2. uint8_t* offset = (uint8_t*) u32;
 8 uint8_t* offset;
 9 uint32_t data[2];
 10
 11 offset = (uint8_t*) data;
 12 offset[0] = 'a';
 13 offset[1] = 'b';
 14 offset[2] = 'c';
 15 offset[3] = NULL;
 16
 17
 18 printf("%c,%c,%c\n%s\n", offset[0], *(((uint8_t*) data)+1), ((uint8_t*) data)[2], data);

그러하다

 

 

궂이 쉬프팅 시키지 않아도 된다

121 write(write_fd, &((uint8_t*) &mod_data[0])[0], 1);
122 write(write_fd, &((uint8_t*) &mod_data[0])[1], 1);
123 write(write_fd, &((uint8_t*) &mod_data[0])[2], 1);
124 write(write_fd, &((uint8_t*) &mod_data[0])[3], 1);
125
126 write(write_fd, &((uint8_t*) &mod_data[1])[0], 1);
127 write(write_fd, &((uint8_t*) &mod_data[1])[1], 1);
128 write(write_fd, &((uint8_t*) &mod_data[1])[2], 1);
129 write(write_fd, &((uint8_t*) &mod_data[1])[3], 1);

'devel' 카테고리의 다른 글

gcc 개인적인 정리  (0) 2012.04.23
Sprintf part1  (0) 2008.11.29
Posted by 쵸코케키

2012. 4. 23. 22:42 devel

gcc 개인적인 정리

출처 GCC 완전 정복(The Definitive Guide to GCC) 발췌

개인 정리용 문건임

 

 

0. source code decompress

tar -zxf gcc####.tar.gz -C dir 이런식으로 옵션을 줘도 되었던듯

 

 

1. configure script option before compile

./configure \

--prefix=/usr/local/ \    빌드 후 설치할 경로

--srcdir=~~~ \

.

.

.

 

 

make bootstrap으로 gcc를 컴파일 하게 되면 다음과 같은 과정을 밟는다

a. 컴파일러를 빌드하는데 필요한 bison?, textinfo?, gcov?, gpref같은 툴을 build한다

b. configure를 실행하기 전에 compiler를 위한 바이너리 유틸리티

(bfd, binutils, gas, gprof, ld, opcodes)가 gcc 빌드 디렉토리로 이동 되었거나 링크 되어있으면 바이너리 유틸리티를 빌드

c. 컴파일러 스스로 native compiler를 가지고 새로은 compiler를 만든다

1단계 compiler를 우선 맹글고 그거로 2단계를 만든다

2단계로 3단계 만듬 ㅇㅇ

★. 만약 2단계와 3단계 컴파일러가 다르면 오류 발생한거임 3단계 설치하면 안됨

e. 3단계 컴파일러로 필요한 runtime library만듬

 

 

2. GCC의 target

compare 2단계와 3단계를 비교

cleanstrap clean->make bootstrap

 

그 이후로 길고 긴 내용이 있는데  못 버티겠다

 

 

 

gcc의 출력 조절

.c 전처리를 해야 하는 c 소스코드

.C 전처리를 해야 하는 c++ 소스코드

.cc

.cpp

.cxx

.i 전처리를 하지 않을 c 소스코드

.ii c++

.m objective c source code

.h c header(컴파일, 링크하지 않는다)

.s assembly code

.S 전처리를 해야 하는 assembly code

 

-c 링킹 단계 앞에서 컴파일 과정을 멈춘다

-E 전처리 과정 후 컴파일을 끝낸다

-o file file에 출력한다

-S 어셈블러 코드를 작성한 후에 컴파일 과정을 멈춘다

-x lang 이 옵션 이후의 입력 화일에서 쓰는 프로그래밍 언어를 lang으로 설정한다

-x none 위에꺼 캔슬

 

예제

gcc -E sample.c -o sample.i

gcc -S test1.c test2.c

-> 확인해 보면 test1.s, test2,s가 생성되어 있음

-c 옵션도 뭐 동일함

.o 파일이 만들어져 있겠지

-x 옵션의 예제는 좀 길다

 

IamNotTextFile.txt <- 사실은 c 코드라고 해보자

gcc -x c IamNotTextFile.txt

 

다른 예제

단계별로 직접 컴파일하기

전처리 하기

gcc -E t1.c -o t1.ii

gcc -E t2.c -o t2.ii

 

어셈블리 번역

gcc -S -x cpp-output t1.pre -o t1.s

gcc -S -x cpp-output t2.pre -o t2.s

 

object file

gcc -c -x assmebler t1.s t2.s

 

linking object file

gcc t1.o t2.o -o dst

 

-S옵션을 통해 code 최적화가 가능하다

'devel' 카테고리의 다른 글

4bytes data type pointer에서 1byte 씩 접근하기  (0) 2012.06.02
Sprintf part1  (0) 2008.11.29
Posted by 쵸코케키

2012. 1. 28. 13:13 devel/man & example

strstr

const char DELIM[2] = {'$', '%'};
char* temp = strsrt("1234$%ABCD", DELIM);


vs

char* temp = strstr("1234$%ABCD", "$%");



같은 코드 같지만 다르다
전자는 틀린 코드이고 후자가 맞는 코드이다
이것 때문에 6시간을 날려먹었다


const char DELIM[3] = {'$', '%', 0}
이렇게 null로 terminate되는 문자열을 delimiter로 지정해야 한다OTL

'devel > man & example' 카테고리의 다른 글

#define function macro  (0) 2012.07.15
#define 문자열 치환 및 합치기  (0) 2012.07.15
arm inline assembly  (0) 2011.12.24
thread starvation  (0) 2011.12.09
scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함