ARM 9 학습 테스트

10213 단어 디 버 깅ARM
1. gdb 의 설치
  • 홈 페이지 에 gdb 압축 패 키 지 를 다운로드 합 니 다.http://ftp.gnu.org/gnu/gdb/
  • 압축 해제 소스 패키지, 압축 해제 디 렉 터 리 에 들 어가 서 설정 – target = arm - linux 대표 프로그램 실행 목 표 는 arm - linux
  • 입 니 다.
    ./configure --target=arm-linux
  • 컴 파일
  • make
  • 현재 폴 더 에 설 치 된 tmp 디 렉 터 리
  • mkdir tmp
    make install prefix=$PWD/tmp
  • gdbserver 설치 설정
  • ./configure --host=arm-linux make
  • gdbser 를 개발 판 위 에 복사
  • 2 、 gdb 를 사용 하여 테스트
  • 개발 판 위 에서 운행
  • gdbserver 192.168.2.100:1234 ./test
  • PC 기기 에서 실행 (test 프로그램 디 렉 터 리 에서)
  • arm-linux-gdb test
    //      
    target remote 192.168.2.100:1234
  • help all: 모든 명령 보기
  • 
       
       
       
       
    l: 소스 코드 보기 c: 정지점 bt 로 실행: 스 택 break 호출: 정지점 step: 단일 실행
    3. 시스템 호출
  • 사용자 정의 시스템 함수 추가 / fs / readwrite.c 。안에 추가
  • 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); }
  • arch / arm / kernel / calls. s 추가
  • CALL(sys_mycall)
  • include / linux / syscalls. h 추가
  • 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__。컴 파일 러 를 통 해 컴 파일 할 때 문자열 상수 대 입

    좋은 웹페이지 즐겨찾기