2016-09-05 2 views
0

현재 Linux 장치 드라이버 프로그래밍을 시작했습니다. 어디 코드를 인쇄 안녕하세요 세계 printk() 기능을 사용 하여이 작은 조각을 발견. make 명령을 사용하여로드 드라이버 insmod 명령을 사용하여 코드를 컴파일 한 후printk를 사용하여 Linux 터미널에서 데이터 인쇄

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 

MODULE_LICENSE("Dual BSD/GPL"); 

static int hello_init(void) 
{ 
     printk(KERN_ALERT "Hello World!!!\n"); 
     return 0; 
} 

static void hello_exit(void) 
{ 
     printk(KERN_ALERT "Goodbye Hello World!!!\n"); 
} 

module_init(hello_init); 
module_exit(hello_exit); 

. "Hello world"이 로그 파일 /var/log/kern.log에만 인쇄되는 대신 화면에 인쇄되지 않습니다. 하지만 내 우분투 터미널에 인쇄하려면 printk을 원합니다. 우분투 (14.04)를 사용하고 있습니다. 가능한가?

+0

몇 가지 트릭이 있지만 가능하지는 않습니다. – 0andriy

+0

출력이 * 시스템 콘솔 *에 나타납니다. 임베디드 시스템 및 SBC의 경우 콘솔은 일반적으로 특정 직렬 포트입니다. 커널 매개 변수'console = ...'은 선택 속성을 가진 장치를 지정하는데 사용됩니다. 우분투 배포판은 일반적으로 명령 줄에 콘솔을 정의하지 않습니다. – sawdust

+0

https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks – sawdust

답변

0

printk은 커널 로그에 인쇄됩니다. 커널에 관한 한 "화면"이 없습니다. printk의 출력을 실시간으로 보려면 터미널을 열고 다음을 입력하십시오. dmesg -w. -w 플래그는 최신 버전 dmesg (util-linux 패키지에서 제공됨)에서만 지원됩니다.

+0

"커널과 관련된"화면이 없습니다 "* - 음, (시스템) 콘솔은 무엇입니까? 커널 커맨드 라인의 매개 변수)? – sawdust

+0

'dmesg -n9'를 사용하여 커널 로그의 모든 메시지를 주 콘솔로 출력하도록 커널에 요청하거나 더 작은 값을 사용하여 일부 메시지 만 선택할 수 있습니다. – redneb

+0

* "커널 로그에서 기본 콘솔로 모든 메시지를 출력하도록 커널에 요청할 수 있습니다."* - 아니요. 시스템 콘솔에서 메시지를 묻는 메시지가 * * 필요 없습니다. 커널 디버깅 및 [콘솔 로그 수준과 관련된이 질문에 대한] 링크 (http://stackoverflow.com/questions/16390004/change-default-console-loglevel-during-bootup)를 참조하십시오. 아마도 GUI 프론트 엔드로 Linux를 사용했을 것입니까? – sawdust

1

커널 로그와 마사지를 gnome-terminal로 리디렉션 할 수 없으므로 dmesg을 사용해야합니다. 그러나 가상 터미널 (ctrl+F1-F6으로 열림)에서 표준 출력으로 리디렉션 할 수 있습니다.
먼저 가상 터미널에 tty 명령을 입력하여 tty 번호를 결정하십시오. 출력은 /dev/tty (1-6) 일 수 있습니다.
이 코드를 지정한 인수로 컴파일하고 실행하십시오.

gcc setconsole.c -o setconsole 
sudo ./setconsole 1 

이 커널 메시지를받을 청각 장애를 설정합니다 :

/* 
* setconsole.c -- choose a console to receive kernel messages 
* 
* Copyright (C) 1998,2000,2001 Alessandro Rubini 
* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 2 of the License, or 
* (at your option) any later version. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/ioctl.h> 

int main(int argc, char **argv) 
{ 
    char bytes[2] = {11,0}; /* 11 is the TIOCLINUX cmd number */ 
    if (argc==2) bytes[1] = atoi(argv[1]); /* the chosen console */ 
    else { 
     fprintf(stderr, "%s: need a single arg\n",argv[0]); exit(1); 
    } 
    if (ioctl(STDIN_FILENO, TIOCLINUX, bytes)<0) { /* use stdin */ 
     fprintf(stderr,"%s: ioctl(stdin, TIOCLINUX): %s\n", 
      argv[0], strerror(errno)); 
     exit(1); 
    } 
    exit(0); 
} 

예를 들어 tty 명령에 대한 출력은 는/dev/tty1로 다음이 두 가지 명령을 입력 있다면.
그런 다음이 코드를 컴파일하고 실행하십시오. 당신이 KERN_ALERT이 them.To 중 하나가 콘솔이 모두 당신이 아규먼트로 8 위의 코드를 실행해야받을 수 있도록 당신의 코드에서 지정하는대로

/* 
* setlevel.c -- choose a console_loglevel for the kernel 
* 
* Copyright (C) 1998,2000,2001 Alessandro Rubini 
* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 2 of the License, or 
* (at your option) any later version. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/klog.h> 

int main(int argc, char **argv) 
{ 
    int level; 

    if (argc==2) { 
    level = atoi(argv[1]); /* the chosen console */ 
    } else { 
     fprintf(stderr, "%s: need a single arg\n",argv[0]); exit(1); 
    } 
    if (klogctl(8,NULL,level) < 0) { 
     fprintf(stderr,"%s: syslog(setlevel): %s\n", 
       argv[0],strerror(errno)); 
     exit(1); 
    } 
    exit(0); 
} 

커널 메시지의 8 레벨이 있습니다.
gcc setlevel.c -o setlevel
sudo ./setlevel 8

이제 커널과 콘솔에서 커널 로그를 확인하려면 모듈을 삽입 할 수 있습니다.
그런데이 코드는 ldd3 예제에서 나온 것입니다.