实验六——Linux系统调用
日期:2016-5-25
一、实验目的
1. 学习Linux内核的配置和编译;
2. 深入理解Linux系统调用;
3. 理解ARM和x86的CPU模式(系统模式、用户模式)的不同。
4. 掌握内核模块的编写方法。
二、实验器材
硬件
Ÿ Linux实验板卡一块;
Ÿ 5V/1A电源一个;
Ÿ microUSB线一根;
Ÿ PC(Windows/Linux)一台;
Ÿ USB-TTL串口线一根;
软件
Ÿ 交叉编译软件;
三、实验步骤
1. 寻找、下载Linux实验板卡所用的Linux内核源码;
在https://github.com/raspberrypi/linux.git上选择3.18版本的源码tar包,直接下载,然后放入linux系统用tar -xzf进行解压并命名为linux。
在linux主目录下新建一个kernel目录,将源代码文件放在其下。
2. 在内核中加入新的系统调用,具体功能没有要求,能输出调试信息即可;
①在linux/arch/arm/kernel/目录下新建mysyscall.c文件
②在linux/arch/arm/kernel/call.S中添加新的系统调用
③修改arch/arm/kernel/目录下的Makefile文件,需要在obj-y后面添加与本次新添加的系统调用有关的mysyscall.o
④在include/uapi/asm-generic/unistd.h头文件中将223号调用与某个宏进行关联,在syscall()中注册一个位置,方便调用
3. 修改内核代码配置,编译内核;
①连接树莓派获取config文件,将config文件放在linux文件下
②进行项目配置
③编译新核
④编译module文件
在linux的上层目录新建modules文件夹,进入linux内核代码所在文件夹,执行下面语句编译:
4. 将编译好的内核装载到板卡启动;
①将新核文件通过scp放入树莓派boot目录:
②将modules/lib文件夹通过scp放入树莓派根目录
③完成后重启树莓派即可
5. 编写C代码,用两种方法做系统调用,测试:
a. 嵌入汇编代码,用r0传参数;
b. 用syscall()函数。
结果:
6. 编写内核模块,在模块加载和卸载时能通过内核打印函数输出提示信息;
首先在linux中编写好c代码,然后用scp传输到树莓派中
设置Makefile文件:
在这之后,用make指令交叉编译内核模块,生成mykernel.ko,将它放到树莓派的/home目录。
7. 通过insmod和lsmod等命令测试内核模块。
装载内核模块:
显示已装载模块:
dmesg命令显示日志:
五、实验感想
遇到的问题:
①遇到的问题:一开始下载的是zip包,不管是直接在windows下解压还是在linux上用unzip命令解压都出现了奇怪的问题,在windows上解压可能是因为依赖关系出了问题,在linux上解压之后有几个文件打不开提示the file name is too long,图形界面查看呈红色,然后尝试用gitclone直接下载整个工程,终究因为源码文件太大还有不稳定的网络放弃了。
②传输module/lib文件的时候传了很久,然后发现里边有两个软链接,连向同一个文件夹,所以先把linux文件传输过去之后再重新建立软链接速度会快一倍。
③在树莓派上接收并备份文件的时候不小心把树莓派的lib目录改名了,导致整个系统所有命令都不能用且重启开不了机了,所以重新刷了一下机。