我記得今年的很多筆試面試都遇到了linux相關(guān)的操作,答題狀況都挺……昂。算是補(bǔ)課吧,正好大四的畢業(yè)實(shí)習(xí)、軟3還有研0的項(xiàng)目都需要linux的環(huán)境進(jìn)行推進(jìn),記錄一下,聊作紀(jì)念。
實(shí)驗(yàn)要求
- 編譯系統(tǒng),下載并提交,驗(yàn)收的時(shí)候,我會(huì)找MIPS板子,讓大家下載驗(yàn)證。
- 編譯一個(gè)內(nèi)核模塊,內(nèi)容任選,隨系統(tǒng)提交,要求內(nèi)容可體現(xiàn)在系統(tǒng)日志中。
- 編譯一個(gè)應(yīng)用模塊,內(nèi)容任選,以固件形式隨系統(tǒng)提交,要求可在自指定文件中有結(jié)果顯示。
- trunk/linux-3.4.x/kernel/sched/core.c 是進(jìn)程相關(guān)的一個(gè)核心文件,同學(xué)們在必要函數(shù)前加注釋,畫出大體調(diào)度流程。
trunk/linux-3.4.x/mm/page_alloc.c 是內(nèi)存管理相關(guān)的一個(gè)核心文件,同學(xué)們在必要函數(shù)前加注釋,畫出大體分配流程。
1 虛擬機(jī)的安裝以及環(huán)境配置
不一定非要是老師給的MV系統(tǒng),但是ubuntu的版本建議用老師給的版本,不然可能安裝過程會(huì)有一些比較頭疼的事情。
但是老師給的是無圖形界面的,對于大部分剛接觸的同學(xué)而言,確實(shí)不夠友好。所以這里也可以安裝同版本的帶UI版本。
我自己的話,是按照老師的流程走的,主要是當(dāng)時(shí)虛擬機(jī)裝了兩個(gè),內(nèi)存不允許我再折騰UI版本的了??。
2 實(shí)驗(yàn)一:編譯系統(tǒng)
這個(gè)沒什么好說的,就是按照老師給的流程走一遍,注意有一些包的安裝,如果在編譯的過程中報(bào)錯(cuò)說缺包,復(fù)制出錯(cuò)語句,搜索一下相關(guān)安裝命令即可。
3 實(shí)驗(yàn)二
1、首先進(jìn)入項(xiàng)目目錄中的/trunk/linux-3.4.x/drivers
目錄下,新建一個(gè)自己的內(nèi)核工程文件
cd ./trunk/linux-3.4.x/drivers # 進(jìn)入drivers目錄
mkdir ghykernel # 新建自己的工程目錄,這里我起名為ghykernel
2、接著,進(jìn)入該目錄,新建三個(gè)工程文件xx.c,Kconfig,Makefile
cd ghykernel
touch ghykernel.c Kconfig Makefile # 第一個(gè).c文件名稱不限,Kconfig和Makefile需要嚴(yán)格按照這個(gè)名稱,后面編譯需要
接著可以在命令行輸入ls命令,查看文件是否正常創(chuàng)建:
ls
成功創(chuàng)建如下:
3、接下來我們需要給三個(gè)文件分別寫入相應(yīng)的內(nèi)容:
- 首先寫入.c文件
vi ghykernel.c #進(jìn)入文件的讀寫模式,同時(shí)回車后需要按下鍵盤上的”I“進(jìn)入插入模式
像Windows一樣寫入文件即可
ghykernel.c內(nèi)容如下:
#include<linux/module.h>
MODULE_LICENSE("MIT");
MODULE_AUTHOR("GHY");
MODULE_DESCRIPTION("KERNEL EDIT EXAMINATION");
MODULE_VERSION("1.0");
//內(nèi)核模塊參數(shù),加載時(shí)指定或者動(dòng)態(tài)指定,以控制此模塊的行為
static char *name ="GHY";
module_param(name,charp,S_IRUGO);
NODULE_PARAM_DESC(name,"---------now it is a print test---------");
//初始化函數(shù),在加載時(shí)調(diào)用,分配資源準(zhǔn)備執(zhí)行環(huán)境
static int __init ghy_print_init(void){
printk(KERN_INFO "TESTING: test case written by %s,this is kernel edit module\n",name);
return 0;
}
//析構(gòu)函數(shù),在卸載時(shí)調(diào)用,回收資源,銷毀執(zhí)行環(huán)境
static void __exit ghy_print_exit(void){
printk(KERN_INFO "TESTING: kernel test exit for %s \n",name);
}
//登記初始化函數(shù)和析構(gòu)函
module_init(ghy_print_init);
module_exit(ghy_print_exit);
退出插入模式需要先按下Esc
鍵,再按下:
鍵,輸入wq
即可,再在命令行輸入
cat ghykernel.c
查看文件是否正確寫入并保存,正確的話,應(yīng)該顯示結(jié)果如下:
- 接著寫入Kconfig文件
步驟同上,寫入的內(nèi)容如下:
config GHY_KERNEL
tristate "HELLO GHY_KERNEL"
default y
- 最后寫入Makefile文件
步驟同上,寫入的內(nèi)容如下:
obj-y += ghykernel.o
4、返回上一層目錄,修改./trunk/linux-3.4.x/drivers
目錄下的Kconfig文件,操作如下,注意目錄填自己剛剛第一步創(chuàng)建的文件名:
同理修改目錄下的Makefile文件:
4 實(shí)驗(yàn)三
1、進(jìn)入./trunk/user
目錄下,創(chuàng)建文件夾:
mkdir ghyapp
2、進(jìn)入該目錄下,創(chuàng)建兩個(gè)文件.c和Makefile
touch main.c Makefile
3、在創(chuàng)建的文件中寫入內(nèi)容,注意內(nèi)容涉及文件名的要用自己第一步創(chuàng)建的文件名
main.c的內(nèi)容:
#include<stdio.h>
int main(){
printf("-----This is a TEST for APP----\n");
//只要是c++在stdio.h支持下的代碼都可以丟進(jìn)去
return 0;
}
Makefile的內(nèi)容:
CFLAGS += -ffunction-sections -fdata-sections -fPIC -std=gnu99
LDFLAGS += -Wl,--gc-sections
all : main.o Makefile
$(CC) -o ghyapp main.o $(LDFLAGS)
main.o : main.c
$(CC) -c main.c $(CFLAGS)
clean :
rm -f main.o
clean-all :
rm -f ghyapp *.o
romfs:
$(ROMFSINST) ghyapp /bin/ghyapp
4、實(shí)驗(yàn)二和實(shí)驗(yàn)三一起編譯,首先返回上層的./trunk
目錄,輸入
./build_firmware.sh
如果報(bào)錯(cuò)error: expected ‘)’ before string constant可以考慮把那一句注釋掉,也可以選擇按照這個(gè)教程解決。
成功編譯結(jié)束截圖:
5、查找生成的目標(biāo)文件
- 進(jìn)入
./trunk/romfs/bin
文件夾,查看自己實(shí)驗(yàn)三命名的app的c文件編譯結(jié)構(gòu)是否出現(xiàn)在這里 - 輸入rz [文件名]即可將結(jié)果保存至本機(jī)
同理進(jìn)入./trunk/images
目錄,將總的結(jié)果文件傳輸回來本機(jī)
5 實(shí)驗(yàn)四
這里主要是內(nèi)核模塊自己看懂,當(dāng)然結(jié)合一些文檔會(huì)更好。
這里我選擇了靜態(tài)代碼分析工具Understand來對源碼進(jìn)行分析:
- 安裝教程
- 使用教程
主要是考慮到代碼量太大了(1w+),而且.c文件中主要介紹的是局部實(shí)現(xiàn),沒有全局的概念.
代碼分析工具有很多種,這里我們關(guān)注的是代碼轉(zhuǎn)流程圖,知乎有一個(gè)問題和這個(gè)類似,可以提供更多靈感,但是大部分只支持單個(gè)函數(shù)的分析或者是全局.c文件的嵌套關(guān)系的分析,只能作為一種參考。
其中page_alloc.c文件中文章來源:http://www.zghlxwxcb.cn/news/detail-781596.html
- __alloc_pages_nodemask()模塊的實(shí)現(xiàn)可以參考【文章】
- __free_pages()模塊實(shí)現(xiàn)注釋可以參考【文章】,本質(zhì)和linux內(nèi)核中伙伴系統(tǒng)內(nèi)存釋放函數(shù)相似。
總體寫的比較虎頭蛇尾,年末擺爛了兩個(gè)月(借口新冠后遺癥就是“懶癌”啊哈哈哈,請大家保重身體呀,來自一整個(gè)寒假都砸咳嗽的選手碎碎念)文章來源地址http://www.zghlxwxcb.cn/news/detail-781596.html
到了這里,關(guān)于軟件課設(shè)(Ⅲ)——padavan-ng編譯以及內(nèi)核模塊修改的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!