ARM 9 학습 테스트
./configure --target=arm-linux
make
mkdir tmp
make install prefix=$PWD/tmp
./configure --host=arm-linux make
gdbserver 192.168.2.100:1234 ./test
arm-linux-gdb test
//
target remote 192.168.2.100:1234
l: 소스 코드 보기 c: 정지점 bt 로 실행: 스 택 break 호출: 정지점 step: 단일 실행3. 시스템 호출
asmlinkage void sys_mycall(char *buf, int count)
{
char buf_mod[1024];
if(*buf){
copy_from_user(buf_mod, buf, (count < 1023) ? count : 1023);
buf_mod[1023] = '\0';
}else{
buf_mod[0] = '\0';
}
printk("do_mysyscall : %s
", buf_mod);
}
CALL(sys_mycall)
asmlinkage void sys_mycall(char *buf, int count);
#include <errno.h>
#include <unistd.h>
void mycall(char *buf, int count)
{
/* SWI */
asm(
"mov r0, %0
" /* save the first argument into R0 */
"mov r1, %1
" /* save the first argument into R0 */
"swi %2
" /* do system calls */
:/* output list */
: "r"(buf), "r"(count), "i" (0x900000 + 352)
: "r0", "r1" /* the register list who were changed */
);
}
int main(int argc, char *argv[])
{
printf("Test for mycall
");
mycall("Powered by YellowMax
", 21);
return 0;
}
./syscall Test for mycall do_mysyscall : Powered by YellowMax 4. printk 의 원리 와 사용
4.1 、 관련setup
printk. c 에 다음 말 이 있어 요.
__setup("console=", console_setup);
init. h 중 다음 과 같은setup 의 매크로 정의
#define __setup(str, fn) \
__setup_param(str, fn, fn, 0)
#define __setup_param(str, unique_id, fn, early) \
static char __setup_str_##unique_id[] __initdata = str; \
static struct obs_kernel_param __setup_##unique_id \
__attribute_used__ \
__attribute__((__section__(".init.setup"))) \
__attribute__((aligned((sizeof(long))))) \
= { __setup_str_##unique_id, fn, early }
__setup("console=", console_setup);
대 입 하면 최종 적 으로 얻 을 수 있 습 니 다./* __initdata:#define __initdata __attribute__ ((__section__ (".init.data"))) * .init.data , .init.data , */
static char __setup_str_console_setup[] __initdata = "console="; \
static struct obs_kernel_param __setup_console_setup \
__attribute_used__ \ //
__attribute__((__section__(".init.setup"))) \ //.init.setup
__attribute__((aligned((sizeof(long))))) \ //
= { __setup_str_console_setup, console_setup, 0 }
/* obs_kernel_param : , */
struct obs_kernel_param {
const char *str;
int (*setup_func)(char *);
int early;
};
커 널 컴 파일 시 console 등 매개 변수 와 처리 함 수 를 obs 에 두 는 것 을 상상 할 수 있 습 니 다.kernel_param 구조 체 에서 이 구조 체 는. init. setup 세그먼트 로 컴 파일 되 었 습 니 다. 커 널 이 시 작 될 때 U - boot 에서 들 어 오 는 매개 변수 가 있 으 면. init. setup 세그먼트 에서 찾 습 니 다. 같은 이름 의 매개 변수 가 있 으 면 해당 하 는 setup 함수 로 관련 매개 변 수 를 설정 합 니 다.
static int __init console_setup(char *str)
add_preferred_console
/* ( 8 ), console_cmdline */
for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
if (strcmp(console_cmdline[i].name, name) == 0 &&
console_cmdline[i].index == idx) {
selected_console = i;
return 0;
}
register_console // console console_cmdline , , console_cmdline , , console , printk console , write 。
/* console_cmdline , : , , */
struct console_cmdline
{
char name[8]; /* Name of the driver */
int index; /* Minor dev. to use */
char *options; /* Options for the driver */
};
4.2 printk 함수
printk 에서 각 인쇄 단 계 를 정의 합 니 다.
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING, , */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use, */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG, */
단계 가 4 보다 크 면 위의 경고 단계 가 인쇄 되 고 기본 인쇄 단 계 를 바 꾸 면 더 많 거나 더 적은 정보 가 인쇄 됩 니 다.
printk("%s %s %d
", __FILE__, __FUNCTION__, __LINE__); // , ,
__FILE__, FUNCTION, __LINE__。컴 파일 러 를 통 해 컴 파일 할 때 문자열 상수 대 입
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GDB 로 core dump 파일 분석 하기프로 그래 밍 과정 에서 우 리 는 프로그램 을 컴 파일 할 수 있 지만 실행 할 때 Segment fault (단락 오류) 가 자주 발생 할 수 있 습 니 다.세그먼트 오류 가 발생 한 것 은 잘못된 메모리 세그먼...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.