[모듈과 커널 버전]


커널의 버전 확인하는 방법 : /linux/version.h


#define UTS_RELEASE "2.6.14.6"

#define LINUX_VERSION_CODE 132622

#define KERNEL_VERSION(a, b, c) (((a) <<16) + ((b) <<8) + (c))


예제)

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10)

MODULE_PARM(user_name, "char");

#else

MODULE_PARM(user_name, "s");

#endif


[모듈과 static 선언]


리눅스 커널은 커널전체가 하나의 프로그램이다. 그래서 기본적으로 (전역)함수나 전역 변수를 만들면 다른 모듈에서 접근이 가능하다. 그래서 이를 제어하기 위해서는 static 키워드를 적절히 사용해 주어야 한다.


공개된 함수나 변수등의 심볼들은 /proc/kallsyms에서 확인할 수 있다.


참고로, 2.6에서는 static없이 만들어신 함수는 자동으로 공개 되지 않는다.



저작자 표시
신고
by danguria 2012.11.23 07:31

C에서 프로그램 수행 시간 측정 방법

#include "stdio.h"
#include "time.h"

void main()
{
clock_t before;
double result;
before = clock();

for ( int i = 0; i <32765; i++ ) printf("%dn", i );
result = (double)(clock() - before) / CLOCKS_PER_SEC;

printf("걸린시간은 %5.2f 입니다.n", result); 

} 


저작자 표시
신고
by danguria 2012.11.22 10:08

1. 설정 파일 위치

/etc/screenrc


2. 유용한 옵션

# turn visual bell on

vbell on

vbell_msg "   Wuff  ----  Wuff!!  "


저작자 표시
신고
by danguria 2012.11.21 09:42

1. 2.6커널용 Hello_Module 작성


#include 
#include 
#include 

// init routine
int __init init_hello(void)
{
    printk(KERN_ALERT "[Module Message] Hello, Module.\n");
    return 0;
}

// finish routine
void __exit exit_hello(void)
{
    printk(KERN_ALERT "[Module Message] Do you realy want to break up with me?\n");
}

module_init(init_hello);
module_exit(exit_hello);

MODULE_LICENSE("GPL");

2. 2.6 모듈 빌드용 Make 파일



obj-m = hello_module.o
ARCH := arm
KDIR := /project/falinux/kernel/build_s5pv210
CROSS_COMPILE := arm-generic-linux-gnueabi-
PWD := $(shell pwd)

defaule:
        $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
        rm -rf *.ko
        rm -rf *.mod.*
        rm -rf .*.cm
        rm -rf *.o

3. 2.6커널에서 모듈 로드


insmod hello_module.ko

저작자 표시
신고
by danguria 2012.11.21 07:21

문제 출처 : http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=1889


나의 답 : 아래 코드이다.. 하지만 N = 13일경우 1초내에 계산이 안되서 accepted되었다..ㅠㅠ 속도 향상할 수 있는 point를 찾아야 겠다..


#include 
#include 
#define DEBUG 0
#define MAX_QUEENS 14

int g_cols[MAX_QUEENS]; // represent of chess board
                        // g_cols[index] : column, index : row
int g_num_queens;
int g_num_possible_sequence;

void SetInputFromFile(const char* fileName);
void PrintAnswerToFile(const char* fileName);
void NQueen(int irow);
int isThreathen(int irow);
void Print_Queen();

int main() {

    SetInputFromFile("input.txt");
    g_num_possible_sequence = 0;
    NQueen(0);
    PrintAnswerToFile("output.txt");

    return 0;
}

void SetInputFromFile(const char* fileName) {
    FILE *input = fopen(fileName, "r");
    if (input == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    //TODO:
    fscanf(input, "%d", &g_num_queens);
    fclose(input);
    return;
bail:
    if (input != NULL) fclose(input);
}

void PrintAnswerToFile(const char* fileName) {
    FILE *output = fopen(fileName, "w");
    if (output == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    //TODO:
    fprintf(output, "%d\n", g_num_possible_sequence);
    fclose(output);
    return;
bail:
    if (output != NULL) fclose(output);
}

void NQueen(int irow) {
    int icol;
    if (DEBUG) {printf("nqueen(%d)\n", irow + 1); Print_Queen();}
    if (isThreathen(irow)) {
        if (DEBUG) {printf("irow(%d) is Threathen\n", irow);Print_Queen();}
        return;
    }
    if (irow == g_num_queens) {
        if (DEBUG) {printf("completed\n");Print_Queen();}
        g_num_possible_sequence++;
        return;
    }

    for (icol = 1; icol <= g_num_queens; icol++) {
        g_cols[irow + 1] = icol;
        NQueen(irow + 1);
    }
}

int isThreathen(int irow) {
    int k; // irow 보다 작은 row를 가리키는 index
           // TODO : rename k

    for (k = 1; k < irow; k++) {
        if (g_cols[irow] == g_cols[k]
            || abs(g_cols[irow] - g_cols[k]) == (irow - k)) {
            return 1;
        }
    }

    return 0;
}

void Print_Queen() {
    int i;
    for (i = 1; i <= g_num_queens; i++) {
        printf("%d ", g_cols[i]);
    }
    printf("\n");
}


저작자 표시
신고
by danguria 2012.11.20 10:17
출처 : http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=2499
 2011.KOI.전국.초등부

#include 
#define DEBUG 1
#define MAX_WEIGHTS 1000

void SetInputFromFile(const char* fileName, int *num_weights, int *weights);
void PrintAnswerToFile(const char* fileName, int min_umw /*minimum unmeasurable weight*/);
int GetMinUnmeasurableWeight(const int num_weights, int *weights);
void SortWeight(int num_weights, int* weights);

int main() {

    int num_weights;
    int weights[MAX_WEIGHTS];

    SetInputFromFile("input.txt", &num_weights, weights);
    PrintAnswerToFile("output.txt", GetMinUnmeasurableWeight(num_weights, weights));

    return 0;
}

void SetInputFromFile(const char* fileName, int *num_weights, int *weights) {
    int i;
    FILE *input = fopen(fileName, "r");
    if (input == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    //TODO:
    fscanf(input, "%d", num_weights);
    for (i = 0; i < *num_weights; i++) {
        fscanf(input, "%d", &(weights[i]));
    }
  
    fclose(input);
    return;
bail:
    if (input != NULL) fclose(input);
}

void PrintAnswerToFile(const char* fileName, int min_umw /*minimum unmeasurable weight*/) {
    FILE *output = fopen(fileName, "w");
    if (output == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    fprintf(output, "%d\n", min_umw);
    fclose(output);
    return;
bail:
    if (output != NULL) fclose(output);
}

int GetMinUnmeasurableWeight(const int num_weights, int *weights) {
    int pmr; // possible_measurement_range
    int nw;  // new_weight
    int i;

    SortWeight(num_weights, weights);

    pmr = 0;
    for (i = 0; i < num_weights; i++) {
        nw = weights[i];
        if (nw - 1 > pmr) {
            return pmr + 1;
        }
        pmr += nw;
    }
    return pmr + 1;
}

void SortWeight(int num_weights, int* weights) {
    int i, j, temp;

    for (i = 0; i < num_weights; i++) {
        for (j = i + 1; j < num_weights; j++) {
            if (weights[i] > weights[j]) {
                temp = weights[i];
                weights[i] = weights[j];
                weights[j] =  temp;
            }
        }
    }
}


저작자 표시
신고
by danguria 2012.11.19 23:27

arm에서 사용하는 cpu_info 구조체는 /arch/arm/include/asm/cpu.h

에 struct cpu_info_asm {...}으로 정의 되어 있다.


이 정보는 책과는 달라서 타겟의 proc/cpuinfo를 보려고 하였으나, proc파일시스템이 없는 것이다!!!!!

허걱....


그래서 FALINUX포럼에 가서 proc파일 시스템 만드는 법이 있길래 해보려고 했다..

하지만, 아직 실력이 부족해서 뭔 말인지 모르겠다.ㅠㅠㅠ


나중에 실력좀 쌓이면 타겟에 간단하게나마 proc파일 시스템을 올려 보아야 겠다.

저작자 표시
신고
by danguria 2012.11.19 07:26

출저 : 정올 (http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=1370)


#include <stdio.h>

#define DEBUG  1


typedef struct {

    int requested_order;

    int start_hour;

    int end_hour;

}MEETING;


MEETING g_requested_meetings[501];

int     g_num_requested_meetings;

MEETING g_scheduled_meeting[501];


int  ScheduleMeetings();

void SortRequestedMeetings();

void PrintRequestedMeetings();


// input output

void SetInputFfromFile(char* fileName);

void PrintAnwserToFile(char* fileName, int i_last_meeting);


int main() {      

    

SetInputFfromFile("input.txt");    

PrintAnwserToFile("output.txt", ScheduleMeetings());

    

return 0;

}


void PrintRequestedMeetings() {

    int im;

    for (im = 1; im <= g_num_requested_meetings; im++){

        printf("%d %d %d\n", g_requested_meetings[im].requested_order,

                g_requested_meetings[im].start_hour,

g_requested_meetings[im].end_hour);

    }

}


// sorting by end_hour

void SortRequestedMeetings() {

    int i, j;

    MEETING temp;

int end_hour_i;

int end_hour_j;


    for (i = 1; i <= g_num_requested_meetings; i++) {

        for (j = i + 1; j <= g_num_requested_meetings; j++) {


end_hour_i = g_requested_meetings[i].end_hour;

end_hour_j = g_requested_meetings[j].end_hour;


if (end_hour_i > end_hour_j) {

                temp = g_requested_meetings[i];

                g_requested_meetings[i] = g_requested_meetings[j];

                g_requested_meetings[j] = temp;

            }

        }

    }

}



int ScheduleMeetings() {

MEETING last_meeting, new_meeting;

    int il, in;  // index of last_meeting, index of new_meeting    

    SortRequestedMeetings();


    if (DEBUG) PrintRequestedMeetings();

    il = 1;

    g_scheduled_meeting[il] = g_requested_meetings[il];


for (in = 2; in <= g_num_requested_meetings; in++) {

last_meeting = g_scheduled_meeting[il];

new_meeting  = g_requested_meetings[in];


if (DEBUG) {

printf("%d : %d\n", last_meeting.end_hour, new_meeting.end_hour);

        }


if (last_meeting.end_hour <= new_meeting.start_hour) {

g_scheduled_meeting[++il] = new_meeting;

}

}


return il;

}



void SetInputFfromFile(char* fileName) {

int i;


FILE *input = NULL;

input = fopen(fileName, "r");

if (input == NULL) {

fprintf(stderr, "file open error : %s\n", fileName);

return;

}


fscanf(input, "%d", &g_num_requested_meetings);

    for (i = 1; i <= g_num_requested_meetings; i++) {

        fscanf(input, "%d %d %d", 

&(g_requested_meetings[i].requested_order), 

&(g_requested_meetings[i].start_hour), 

&(g_requested_meetings[i].end_hour));

    }


fclose(input);

}


void PrintAnwserToFile(char* fileName, int i_last_meeting) {

int i;

FILE *output = NULL;

output = fopen("output.txt", "w");

if (output == NULL) {

fprintf(stderr, "file open error : %s\n", fileName);

return;

}


fprintf(output, "%d\n", i_last_meeting);

    for (i = 1; i <= i_last_meeting; i++) {

        fprintf(output, "%d ", (g_scheduled_meeting[i]).requested_order);

    }

    fprintf(output, "\n");


fclose(output);

}


저작자 표시
신고
by danguria 2012.11.11 16:04

개발 환경 세팅


임베디드 보드에 개발을 하기 위해서는 개발환경 세팅을 좀 해주어야 합니다.

이 부분은 인터넷을 찾아보면 다양하게 나와 있어 저도 많이 참고 했습니다.


많이 이용하는 방법은.

윈도우가 설치된 PC, 가상OS로 리눅스(HOST), 개발보드(TARGET)를 갖춘 상태에서,

서로를 연결하기 위한 공유기(로컬네트워크를 구축해야지요..), tftp, samba, nfs 를 이용하여 개발환경우 갖추었습니다.


다만 제가 가장 OS상에서 네트워크 설정을 잘 못해서 노트북에 리눅스를 설치에 버렸습니다.(다행이 노는 노트북이 있었네요.ㅎㅎ)


자 그럼, 제가 어떻게 세팅했는지에 대한 개략도입니다..



저작자 표시
신고
by danguria 2012.11.11 14:52

저는 학교에서 하드웨어에 의존적이지 않은 순수 소프트웨어 공부를 주로 해서 리눅스, 특히 하드웨어에 의존적인 부분에대해 잘 모릅니다. 회사에 들어오니 이런것들을 몰라서 힘든 부분이 있어 나름 공부를 해보고자 보드도 하나 사고, 리눅스 커널 책도 사서 공부를 하기 시작했습니다.(돈을 버니좋군요.ㅎㅎ)


제가 산 보드는 falinux에서 판매하는 G100-S5PV200입니다.(이런 숫자로된 이름 어려워요ㅠㅠ).

사실 리눅스 커널 공부하는데에 꼭 보드가 필요한것 같지는 않지만, 나중에 디바이스 드라이버도 공부해보고자 샀습니다.(사실 지름신때문이랍니다.ㅋㅋ)




잘못 사서 아까운 돈 날릴까봐 가장 싼것으로 샀습니다^^


자 그럼 오늘은 여기까지 하고 내일부터 개발환경 세팅부터 해볼까요?



저작자 표시
신고
by danguria 2012.11.11 14:28

안녕하세요, 오랜만입니다.^^

누구한테 인사를 드리는지 모르겠지만요.ㅎㅎㅎ (나중에 다시 읽어 볼 나를 위해서??)


학교 졸업함과 동시에 블로깅과 기타 메신저와 담을 쌓고 지냈네요..

한 2년이 다되었는 것 같습니다.


그동안 저는 회사에 들어가서 회사에 적응하느라 바깥 세상에 소흘히 하고 있었네요..

그사이에 많은 일이 있었습니다.

돈도 벌게 되고, 이사도 하고,,,


그중에서 가장 큰일은 사랑하는 사람과 함께 살게 되었습니다!!!

제가 가장 사랑하는 사람입니다^^

하지만 가장 잘해주고 있지 못한다는 생각이 드네요.ㅠㅠㅠ


아, 갑자기 다른 곳으로 빠졌네요..ㅋㅋ

다시 본론으로.


이제 다시 블로그를 꾸며 볼 생각입니다.

그동안 회사에 적응하면서 나름대로의 생활 패턴이 생겼고, 앞으로 어떤 분야에 관심을

가져야할지 생각이 정리 되면서 공부를 하게 되었습니다.


그러다 보니 자연스럽게 블로그에 정리를 해야 겠다는 생각이 들었습니다.

당장 정리하기 시작할 것은 리눅스 커널프로그래밍과 알고리즘입니다.


매번 이것 찔끔 저것 찔끔 손대다 보니 내공이 제대로 쌓이지 않은것 같아서,

우선 이 두가지를 끊기 있게 하려구 합니다.


잘 했는지 확인하기 위해서 나름 목표를 세웠습니다.


1. 사내 알고리즘 대회 입상

 음.. 사내에 뛰어난 사람들이 많지만 나도 할수 있다고 생각합니다!!!


2. 리눅스 커널책 끝까지!!! 읽기

끝가지 읽기.. 이것이 가장 어려운것 같습니다. 잘 해보렵니다!!

대상 커널은  falinux에서 산 G100-S5PV210 보드에서 할 겁니다..^^



다들 잘 부탁 드립니다.

저작자 표시
신고
by danguria 2012.11.11 14:25
| 1 |