module_param
소스코드에
iNum = 100;
cpT = "Hello World";
module_param(iNum, int, 0);
module_param(cpT, charp, 0);
을 적고
터미널에서
insmod main.ko iNum=999 cpT="Hi" 명령어를 친 뒤
dmesg 로 확인해보면
모듈이 붙을 때 메시지를 보면 iNum이 999 cpT가 “Hi"로 바뀌었다는 것을 확인할 수 있습니다.
결론 : module_param으로 모듈의 값에 영향을 줄 수 있습니다.
-------------------------------------------------------------------
장치
유닉스에서 장치의 분류
1. 캐릭터
2. 블록
3. 네트워크
캐릭터 디바이스 - 한번에 전송하는 데이터는 1바이트로 고정. 1바이트를 여러개 보냄.
( 스트림 - 네트워크 상황에 따라 많이 보내기도 하고 적게 보내기도 함)
전송 크기를 예상할 수 없다면 캐릭터 디바이스. 캐릭터 디바이스에는 키보드, 마우스 등이 있다.
블록 디바이스 - 20바이트 단위. 하드드라이브는 블록 단위로 저장을 한다. 조각을 저장함.
cd /dev
를 입력해 dev 폴더로 간 다음, ll을 입력해 보면 수많은 파일이 뜬다
노란색 파일들은 장치를 뜻한다. 그 중에 타입이 'c'인 파일(장치)들이 보이는데 ‘c’ 는 캐릭터 장치임을 뜻한다.
df 명령어를 치면 아래의 그림과 같이 출력되며 그 중 /dev/root의 상세 정보를 알기 위해 ll root를 치면 root -> mmcblk0p2 라고 출력된다.
다시 ll mmcblk0p2를 치게 되면 mmcblk0p2의 타입이 ‘b'라는 것을 확인할 수 있다. 타입 ’b'는 블럭 디바이스를 뜻한다.
-------------------------------------------------------------------
Monitor Program - Code영역 저장공간 확보
malloc으로 프로그램을 로드할 공간을 확보 (128KByte).
Code영역을 저정하기 위해 시작주소를 셋팅.
Code영역의 시작주소는 하위 바이트가 무조건 0000이어야 한다.
vpMem_Start 포인터는 동적할당받은 영역의 시작 주소를 가리킨다.
동적할당 받은 영역의 시작주소 하위바이트가 0000이면 참 좋겠으나.. 대개 그렇지 않으므로
코드영역이 동적할당받은 영역에 잘 안착할 수 있도록 vpCode 포인터의 가리키는 위치를 수정해 줄 필요가 있다.
식은 간단하다.
vpCode = (void *)( ((int)vpMem_Start & 0xFFFF0000) + 0x10000 )
그림으로 표현하면 아래와 같다.
<main.c> 전체 소스코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167 |
#include <stdio.h>
#define CMD_SIZE 20
#define MAX_PRG_SIZE (64 * 1024)
#define MEM_SIZE (MAX_PRG_SIZE * 2)
#define MASK_CODE 0xFFFF0000
///////////////////////////////////
// 구조체 선언
///////////////////////////////////
typedef struct _Context
{
unsigned int efl;
unsigned int eip;
unsigned int edi;
unsigned int esi;
unsigned int ebp;
unsigned int esp;
unsigned int ebx;
unsigned int edx;
unsigned int ecx;
unsigned int eax;
} Context;
typedef struct _Comm
{
char *cpCmd;
void (*fp)(void);
} Comm;
///////////////////////////////////
// 프로토타입 선언
///////////////////////////////////
void STST(Context *);
void LDST(Context *);
void PrintReg(void);
void PrintHelp(void);
void PrintAddress(void);
void MemoryClear(void);
void Quit(void);
int main(void);
///////////////////////////////////
// 전역변수
///////////////////////////////////
static Context stOldState;
Comm stCmdMap[] =
{
{"R", PrintReg},
{"P", PrintAddress},
{"H", PrintHelp},
{"MC", MemoryClear},
{"Q", Quit},
{0,0}
};
void * vpMem_Start;
void * vpMem_End;
void * vpCode;
void PrintReg(void)
{
printf("EAX = %08X ", stOldState.eax);
printf("EBX = %08X ", stOldState.ebx);
printf("ECX = %08X ", stOldState.ecx);
printf("EDX = %08X \n", stOldState.edx);
printf("ESI = %08X ", stOldState.esi);
printf("EDI = %08X ", stOldState.edi);
printf("ESP = %08X ", stOldState.esp);
printf("EBP = %08X \n", stOldState.ebp);
printf("EIP = %08X ", stOldState.eip);
printf("EFL = %08X ", stOldState.efl);
printf("MAIN= %08X ", main);
printf("State=%08X \n", &stOldState);
}
void PrintHelp(void)
{
printf("메모리 디버거 명령어 \n");
printf("R : Print Register Infomation \n");
printf("P : Print Memory Status \n");
printf("H : Print Command List \n");
printf("MC : Memory Clear \n");
printf("Q : Program Exit \n");
}
void PrintAddress(void)
{
printf("Code Start Address : 0x%08X \n", vpCode);
printf("Dynamic Memory Area : 0x%08X to 0x%08X (%dKBytes) \n",
vpMem_Start, vpMem_End,
(((int)vpMem_End - (int)vpMem_Start)/1024) + 1
);
}
void MemoryClear(void)
{
char cInput[11];
}
void Quit(void)
{
free(vpMem_Start);
exit(0);
}
int main(void)
{
char cInput[CMD_SIZE];
int iRet;
Comm *stpCmd;
vpMem_Start = (void *)malloc(MEM_SIZE);
if(0 == vpMem_Start)
{
printf("메모리 확보 실패!\n");
return 0;
}
vpCode = (void *)(((int)vpMem_Start & MASK_CODE) + MAX_PRG_SIZE);
vpMem_End = (void *)((int)vpMem_Start + MEM_SIZE- 1);
STST(&stOldState);
printf("Monitor Program Start... \n");
while(1)
{
putchar('>');
iRet = read(0, cInput, CMD_SIZE);
if( iRet == 1 )
{
continue;
}
cInput[iRet - 1] = 0;
strcpy(cInput, strupr(cInput));
stpCmd = stCmdMap;
while(0 != (stpCmd->fp))
{
if(0 == strcmp(cInput, stpCmd->cpCmd))
{
break;
}
stpCmd++;
}
if( stpCmd->fp != 0 )
{
(stpCmd->fp)();
}
else
{
PrintHelp();
}
}
return 0;
} |
cs |
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
load함수 참고하세요.. (6) | 2015.10.23 |
---|---|
20151020-21번-여지윤 GPIO6/모니터프로그램 (15) | 2015.10.21 |
20151020 엄민웅 armCortex3 TIM, asm MEMORY_MODIFY (6) | 2015.10.20 |
20151019 안향진 TIM2 delay_파이선 led on/off_code/data/stack view, load, memory clear (9) | 2015.10.20 |
20151015(목)_박서연_업무일지_Monitor Program(1) (8) | 2015.10.15 |
20151014 남수진 라즈베리파이 디바이스 드라이브 (8) | 2015.10.14 |
20151013 김태현 라즈베리파이 커널 업데이트(작성중) (3) | 2015.10.13 |
20151012-김재홍-어셈블리_Context Switching (9) | 2015.10.13 |