Hello world! 출력 커널 프로그래밍(32bit)

간략 버전


1. cd /usr/src/linux-2.6.32.60


2. arch/x86/kernel/syscall_table_32.S  추가 --> .long sys_hello_world        /* 337 */


3. arch/x86/include/asm/unistd_32.h  추가 --> #define __NR_hello_world     337 추가(337 은 마지막 숫자(336) + 1)


4. kernel/hello_world.c 생성 --> 


/* kernel/hello_world.c */

#include <linux/linkage.h>
#include <linux/unistd.h>
#include <linux/kernel.h>

asmlinkage int sys_hello_world()
{
    printk("Hello World!\n");
    return (0);
}
 


5. kernel/Makefile 수정


obj-y += groups.o hello_world.o  # hello_world.o 추가


6. 커널 컴파일

 # make mrproper && make clean && make menuconfig && make && make modules && make modules_install


7. 커널용 램디스크 생성

# cd /boot && mkinitramfs -o initrd.img-2.6.32.60 2.6.32.60


8. #update-grub && reboot


9. kernel include 링크 설정.

# cd /usr/include

# mv asm asm_bak

# mv linux linux_bak

# ln -sf /usr/src/linux-2.6.32.60/arch/x86/include/asm asm

#  ln -sf /usr/src/linux-2.6.32.60/arch/x86/include/linux linux


10. 테스트 코드 작성 및 컴파일

$ cd ~

$ mkdir tmp

$ vi mysys.c


#include <linux/unistd.h>
#include <stdio.h>
int main() {
     printf("%d\n", syscall(__NR_hello_world));
     return 0;


$ make mysys

$ ./mysys


11. 커널 로그 확인

$ dmsg

 ...

 [ 4501.406221] Hello World!

+ Recent posts