嵌入式lab6——Linux系统调用

实验六——Linux系统调用


日期:2016-5-25


一、实验目的

1. 学习Linux内核的配置和编译;

2. 深入理解Linux系统调用;

3. 理解ARM和x86的CPU模式(系统模式、用户模式)的不同。

4. 掌握内核模块的编写方法。

二、实验器材

硬件

Ÿ  Linux实验板卡一块;

Ÿ  5V/1A电源一个;

Ÿ  microUSB线一根;

Ÿ  PCWindows/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文件


嵌入式lab6——Linux系统调用_第1张图片

②在linux/arch/arm/kernel/call.S中添加新的系统调用

嵌入式lab6——Linux系统调用_第2张图片

③修改arch/arm/kernel/目录下的Makefile文件,需要在obj-y后面添加与本次新添加的系统调用有关的mysyscall.o


嵌入式lab6——Linux系统调用_第3张图片

include/uapi/asm-generic/unistd.h头文件中将223号调用与某个宏进行关联,在syscall()中注册一个位置,方便调用


嵌入式lab6——Linux系统调用_第4张图片

3. 修改内核代码配置,编译内核;

①连接树莓派获取config文件,将config文件放在linux文件下

嵌入式lab6——Linux系统调用_第5张图片

嵌入式lab6——Linux系统调用_第6张图片

②进行项目配置

嵌入式lab6——Linux系统调用_第7张图片

③编译新核

嵌入式lab6——Linux系统调用_第8张图片

④编译module文件

在linux的上层目录新建modules文件夹,进入linux内核代码所在文件夹,执行下面语句编译:


嵌入式lab6——Linux系统调用_第9张图片

4. 将编译好的内核装载到板卡启动;

①将新核文件通过scp放入树莓派boot目录:

嵌入式lab6——Linux系统调用_第10张图片

②将modules/lib文件夹通过scp放入树莓派根目录

嵌入式lab6——Linux系统调用_第11张图片

③完成后重启树莓派即可

5. 编写C代码,用两种方法做系统调用,测试:

a. 嵌入汇编代码,用r0传参数;

嵌入式lab6——Linux系统调用_第12张图片

b. 用syscall()函数。

嵌入式lab6——Linux系统调用_第13张图片

结果:


6. 编写内核模块,在模块加载和卸载时能通过内核打印函数输出提示信息;

首先在linux中编写好c代码,然后用scp传输到树莓派中

嵌入式lab6——Linux系统调用_第14张图片

嵌入式lab6——Linux系统调用_第15张图片

嵌入式lab6——Linux系统调用_第16张图片

嵌入式lab6——Linux系统调用_第17张图片

设置Makefile文件:

嵌入式lab6——Linux系统调用_第18张图片

在这之后,用make指令交叉编译内核模块,生成mykernel.ko,将它放到树莓派的/home目录。

7. 通过insmod和lsmod等命令测试内核模块。

装载内核模块:

显示已装载模块:

嵌入式lab6——Linux系统调用_第19张图片

dmesg命令显示日志:

五、实验感想

遇到的问题:

①遇到的问题:一开始下载的是zip包,不管是直接在windows下解压还是在linux上用unzip命令解压都出现了奇怪的问题,在windows上解压可能是因为依赖关系出了问题,在linux上解压之后有几个文件打不开提示the file name is too long,图形界面查看呈红色,然后尝试用gitclone直接下载整个工程,终究因为源码文件太大还有不稳定的网络放弃了。

②传输module/lib文件的时候传了很久,然后发现里边有两个软链接,连向同一个文件夹,所以先把linux文件传输过去之后再重新建立软链接速度会快一倍。

③在树莓派上接收并备份文件的时候不小心把树莓派的lib目录改名了,导致整个系统所有命令都不能用且重启开不了机了,所以重新刷了一下机。









你可能感兴趣的:(嵌入式lab6——Linux系统调用)