Ubuntu 18.04(Bionic) does not support arm-none-eabi-gdb. 

However, we can use gdb-multiarch for remote debugging

 

Installation

$ sudo apt-get install gdb-multiarch

 

Run & attach

$ gdb-multiarch
(gdb) set arc arm
(gdb) symbol-file <path_to_vmlinux>
(gdb) target remote localhost:7000

'Programming > Linux Kernel' 카테고리의 다른 글

Linux kernel module compile from linux source  (0) 2019.01.17
Kernel module programming  (0) 2018.05.23
Kernel Version Check  (0) 2018.05.23
Kernel 프로그래밍 - printk  (0) 2017.06.20

일반적인 Linux 배포판을 쓰지 않고, Kernel source와 Root file system 으로 부터 Linux system 을 구성한 경우,

Linux runtime 에 kernel module을 compile 하여 insmod/rmmod 를 할 수 있다.


Kernel module을 컴파일 하기 위해서는 현재 Linux system 에서 사용되고 있는 kernel source를 필요로 한다.

일반적인 방법과 유사하게 사용하기 위해

kernel source 를 /usr/src 디렉토리에 위치시키고,

/lib/modules/<kernel_version>/build 와 symbolic link 시킨다.

# cd /lib/modules/<kernel_version>

# ln -s /usr/src/<kernel_source_dir> build

커널 모듈을 컴파일 하기 위한 준비 작업은 아래 와 같다.

# cd /usr/src/<kernel_source_dir>

# make <defconfig>

# make prepare

# make scripts

※ 참조: http://www.fun25.co.kr/blog/linux-ubuntu-14-04-kernel-module-compile


kernel module을 컴파일 할 Makefile은 아래와 같이 구성한다.

obj-m := test_module.o


all:

make -C /lib/modules/<kernel_version>/build M=$(PWD) modules

clean:

make -C /lib/modules/<kernel_version>/build M=$(PWD) clean

아래는 테스트를 위한 기본적인 kernel module source code.

#include <linux/module.h>

#include <linux/kernel.h>


int init_module(void){

printk(KERN_ALERT"Hello"\n);

return 0;

}


void cleanup_module(void){

printk(KERN_ALERT"Bye"\n);

}


kernel module을 컴파일 하고, insmod/rmmod 를 통해 test 한다.

# make

# insmod <kernel_module>.ko

# rmmod <kernel_module>.ko

※ 이 때, 현재 Linux system 에서 사용되는 kernel 과 다른 source로 부터 kernel module을 컴파일 하게 되면 version 차이로 오류가 나타난다.

'Programming > Linux Kernel' 카테고리의 다른 글

cross kernel debugging  (0) 2020.06.19
Kernel module programming  (0) 2018.05.23
Kernel Version Check  (0) 2018.05.23
Kernel 프로그래밍 - printk  (0) 2017.06.20

Kernel Module Programming

Module 기본 구조

#include <linux/module.h>

#include <linux/kernel.h>


int init_module(void)

{

printk("<1>Hello world\n");

return 0;

}


void cleanup_module(void)

{

printk(KERN_ALERT "Bye World\n");

}

※ init_module()은 모듈 추가(insmod) 시, cleanup_module()은 모듈 삭제(rmmod) 시 호출 됨


아래와 같이 헤더로 linux/init.h 를 포함하고, module_init/module_exit 함수를 통해 init_module()/cleanup_module() 함수의 이름을 자유롭게 설정할 수 있다.

#include <linux/module.h>

#include <linux/kernel.h>

#inlcude <linux/init.h>


int my_init(void)

{

printk(KERN_ALERT"Hello World\n");

return 0;

}


void my_exit(void)

{

printk(KERN_ALERT"Bye World\n");

}


module_init(my_init);

module_exit(my_exit);


Device 를 시스템에서 사용하기 위해서는 우선 디바이스 노드를 만들어야 한다.

$ sudo mknod /dev/<device_name> <major_num> <minor_num>

$ sudo chmod 666 /dev<device_name>




참조: https://www.joinc.co.kr/w/Site/Embedded/Documents/LinuxKernelModuleProg 

'Programming > Linux Kernel' 카테고리의 다른 글

cross kernel debugging  (0) 2020.06.19
Linux kernel module compile from linux source  (0) 2019.01.17
Kernel Version Check  (0) 2018.05.23
Kernel 프로그래밍 - printk  (0) 2017.06.20

Linux 시스템 상에서 kernel의 version을 확인하기 위한 방법

$ cat /proc/version


참조: https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EC%BB%A4%EB%84%90_%EB%B2%84%EC%A0%84_%ED%99%95%EC%9D%B8

'Programming > Linux Kernel' 카테고리의 다른 글

cross kernel debugging  (0) 2020.06.19
Linux kernel module compile from linux source  (0) 2019.01.17
Kernel module programming  (0) 2018.05.23
Kernel 프로그래밍 - printk  (0) 2017.06.20

Linux Kernel programming 을 할 때는 일반적인 printf 함수를 사용 할 수 없다.

Kernel 에서 Debugging 등을 위해 print를 하고자 하는 경우

printk 함수를 사용할 수 있다.

헤더는 linux/kernel.h


사용법은 printf 함수와 유사하다.

printk("hello world\n");

printk("a=%d\n, a);

사용법은 비슷하지만, kernel에서 print 하는 것이기 때문에 print 된 것은 userspace 에서 보이지 않는다.

따라서, 프로그램 실행 후에 dmesg 를 통해 kernel message 를 확인해야 한다.

$ dmesg


printk 사용 시 floating point number 를 print 하는 데 문제가 생길 수 있다.

undefined reference to __aeabi_f2d 라고 나오는 것은 그 때문이라고 할 수 있는데,

Floting point 자체를 지원하지 않기 때문이다.

Kernel 버전 혹은 CPU 에 따라 kernel 내부에서 floating point 를 지원하는 경우도 있고, 지원하지 않는 경우도 있다.

'Programming > Linux Kernel' 카테고리의 다른 글

cross kernel debugging  (0) 2020.06.19
Linux kernel module compile from linux source  (0) 2019.01.17
Kernel module programming  (0) 2018.05.23
Kernel Version Check  (0) 2018.05.23

+ Recent posts