1. 程式人生 > >在內核中添加自己的代碼:

在內核中添加自己的代碼:

內核啟動 release 釋放 好處 查詢 \n hello 失敗 cst

/**************************************************************************************/
內核源碼的查看方法:
1.刪除linux-3.5-for-look/arch/arm/所無關於三星的代碼。因為這個內核支持的芯片比較多,我們學得是arm,查詢的時候防止查詢到其他平臺的代碼,所以精簡一下代碼。
2.ctags -R .
3.vim -t memcpy
4.vim 命令行模式下:cstag memcpy
5.ctrl + ] :進入
6.ctrl + o :退出

/**************************************************************************************/
在內核中添加自己的代碼:
1.驅動可以直接編譯到內核。
2.或者編譯成模塊,然後需要的時候在安裝。
3.mkdir linux-3.5/Driver/mydriver
4.創建一下幾個文件:my.c Makefile
my.c中代碼:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/sched.h>
4 //在內核啟動過程中執行,且在內核啟動過程中執行的函數類型是固定的:int test_init(void) :返回值和行>>
參是固定的。
5 //init 段:這個函數被放到init段,好處是代碼執行完成之後,函數體就釋放了,節省一部分內存。只能調用>>
一次。後面不要調用了。
6 static __init int test_init(void)
7 {
8 int i;
9 //如果資源申請失敗,要飯會相應的錯誤嗎
10 //
11 //return -ENOMEM;內存申請失敗
12 for(i=0;i<20;i++)
13 {
14 printk("hello kernel\n");
15 }
16 //printf("") //>> 1
17 return 0;
18
19 }
20 //把test_init函數放到內核啟動過程中執行
21 module_init(test_init);
22 MODULE_LICENSE("GPL"); //這個是代碼遵循GPL開源規則,以後誰要是用了我們寫的代碼,也必須要遵循GPL規則。
23 //下面三行可有可無
24 MODULE_AUTHOR("LIUYE");
25 MODULE_VERSION("V1.0");
26 MODULE_DESCRIPTION("test for class");

Makefile:
obj-y += my.o
vim ../Makefile 上一層makefile中添加下層Makefile的信息,makefile是分層編譯的結構,上層malefile記錄下層的makefile信息,才能正確編譯。
obj-y += mydriver/ 這裏一定要有“/”,因為這裏是一個目錄
之後就可退出到linux-3.5/ make -j4
[liuye@LiuYe linux-3.5]$>make -j4
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: ‘include/generated/mach-types.h‘ is up to date.
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
CC drivers/mydriver/my.o
LD drivers/mydriver/built-in.o
LD drivers/built-in.o
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
WARNING: modpost: Found 9 section mismatch(es).
To see full details build your kernel with:
‘make CONFIG_DEBUG_SECTION_MISMATCH=y‘
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
KSYM .tmp_kallsyms1.o
KSYM .tmp_kallsyms2.o
LD vmlinux
SYSMAP System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
Building modules, stage 2.
MODPOST 3 modules
可以看到我們的代碼被編譯並且鏈接了。之後更換zImage到SD卡,刷機,只需要刷zImage就可以了。
[ 3.225000] usbhid: USB HID core driver
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] hello kernel
[ 3.225000] Samsung Audio Subsystem Driver, (c) 2011 Samsung Electronics
[ 3.225000] audss_init: RCLK SRC[busclk]
[ 3.225000] Samsung SRP driver, (c)2011 Samsung Electronics
[ 3.310000] mmcblk0boot1: mmc0:0001 M4G1YC partition 2 2.00 MiB
可以看到我們的代碼在內核啟動過程中就已經運行了。
/**************************************************************************************/

在內核中添加自己的代碼: