# 2024q1 Homework6 (integration)
contributed by < `kevinzxc1217` >
## 閱讀〈[Linux 核心模組運作原理](https://hackmd.io/@sysprog/linux-kernel-module)〉
### 前期準備
練習Linux 核心模組的撰寫、掛載及卸載。
#### 撰寫核心模組
**hello.c**
```c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
printk(KERN_INFO "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
```
**Makefile**
```c
obj-m := hello.o
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order *.mod.cmd *.mod
```
#### 編譯核心模組
```c
$ make -C /lib/modules/`uname -r`/build M=`pwd` modules
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
CC [M] /linux_module/hello/hello.o
MODPOST /linux_module/hello/Module.symvers
CC [M] /linux_module/hello/hello.mod.o
LD [M] /linux_module/hello/hello.ko
BTF [M] /linux_module/hello/hello.ko
Skipping BTF generation for /linux_module/hello/hello.ko due to unavailability of vmlinux
make: Leaving directory '/usr/src/linux-headers-6.5.0-27-generic'
```
#### 掛載核心模組
```c
$ sudo insmod hello.ko
$ sudo dmesg
[254738.085528] Hello, world
```
#### 卸載核心模組
```c
$ sudo rmmod hello
$ sudo dmesg
[254849.049232] Goodbye, cruel world
```
### 解釋 insmod 後,Linux 核心模組的 symbol 如何被 Linux 核心找到