嵌入式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文件


②在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目录改名了,导致整个系统所有命令都不能用且重启开不了机了,所以重新刷了一下机。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值