浙江大学软件学院嵌入式操纵系统实验报告实验2:向嵌入式Linux系统内添加系统调用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3、 预习怎么像内核中添加自己编写的系统调用函数
实验代码(c 语言):(10 分)
得分:
1、下载内核
apt-get install linux-source
2、解压内核
cd /usr/src
tar -jxvf linux-source-3.2.64.tar.bz2
3、修改文件
a)/usr/src/linux-source-3.2.64/kernel/sys.c
实验过程设计:(10 分) 1、下载 Linux 3.2.64 内核 2、 解压内核 3、 修改文件 4、 编译内核 5、 复制内核 6、 创建 initrd 文件 7、 更新配置 GRUB 引导列表 8、 检查系统调用 实验结果分析:(10 分) 1、 下载源码
得分: 得分:
2、 解压内核
3、 修改文件
这是第一次的截图,第一次失败后。我第二次改成了“Hello,我是包子陈!…” 4、 编译内核 5、 更改引导
6、重பைடு நூலகம்查看结果
结果分析:几次系统调用只出现了刚开始的 Hello 字段。。估计是汉子会乱码的缘故吧! 老师,还好我加了段英文。不然全乱码我都不知道有没有正确调用我加入的系统调用。
实验中遇到的问题及解决方法,思考题:(5 分)
得分:
1、 执行 update-initramfs -k 3.2.64 –c 出错 解决方法:复制原有内核配置文件 改成 3.2.62 的名字,这是一个关键点。 2、 内核调用全出现乱码 解决方法:调用中弄点英文就 OK 了。估计中文不支持。
指导教师评语:
指导教师:
日期:
}
asmlinkage int sys_addtotal(int number) {
int i=0,enddate=0; printk("Hello,我是包子·陈!这是我添加的第二个系统调用"); while(i<=number) enddate+=i++; return enddate; } asmlinkage int sys_three() { printk("Hello,我是包子·陈!这是我添加的第三个系统调用"); return 0; } b)/usr/src/linux-source-3.2.64/arch/x86/kernel/syscall_table_32.S 可以用右键管理员打开或者 gedit /usr/src/linux-source-3.2.64/arch/x86/kernel/syscall_table_32.S 然后在一列 .long sys_XXXX 的下一行添加 .long sys_mycall .long sys_addtotal .long sys_three 并记住他们分别是第几个.long sys_XXXX c)/usr/src/linux-source-3.2.64/arch/x86/include/asm/unistd_32.h 可以用右键管理员打开或者 gedit /usr/src/linux-source-3.2.64/arch/x86/include/asm/unistd_32.h 在一列#define __NR_XXXX NNN 后添加几行 #define __NR_mycall 338 #define __NR_addtotal 339 #define __NR_three 340 注意后面那个数字是接着上面那几行下来的
实验总分
实验内容:
1、 下载Linux 3.2.64内核
2、 解压内核 3、 修改文件
4、 编译内核 5、 复制内核
6、 创建 initrd文件 7、 更新配置GRUB引导列表
8、 检查系统调用
实验预习:(对实验内容、原理的理解)(5 分)
得分:
1、 预习嵌入式 Linux 系统内核
2、 预习嵌入式 Linux 系统内核系统调用的过程以及实现
gzip /boot/initrd.img-3.2.64.11.new cd /boot mv initrd.img-3.2.64.11.new.gz initrd.img-3.2.64.11
9、 重启 能进入 3.2.64 内核的系统。说明基本没问题了。
10、检查系统调用 编写用于测试添加的系统调用的 C 语言函数如下 Void main() { syscall(349,1); syscall(350,10); syscall(351); } 编译运行,然后打开终端输入 dmesg -c
6、创建 initrd 文件 在创建之前先安装必要的程序 apt-get install bootcd-mkinitramfs mkinitramfs -o /boot/initrd.img-3.2.64
7、更新配置 GRUB 引导列表 可以用右键管理员打开/boot/grub/grub.cfg 或者 gedit /boot/grub/grub.cfg 找到下面这种结构 menuentry 'Ubuntu, with Linux 3.2.64' --class ubuntu --class gnu-linux --class gnu --class os {
终端执行以下命令 cd /boot cp initrd.img-3.2.64.11 initrd-3.2.64.11.old 以上是备份 initrid,下面是修改 depmod -a cd /tmp gzip -dc /boot/initrd.img-3.2.64.11| cpio -id touch lib/modules/3.2.64.11/modules.dep find ./ | cpio -H newc -o > /boot/initrd.img-3.2.64.11.new
recordfail insmod part_msdos insmod ext2 set root='(hd1,msdos1)' search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 linux /boot/vmlinuz-3.2.64 root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splash initrd /boot/initrd.img-3.2.64 } 复制一份在这些结构前粘贴,注意必须贴在 ### BEGIN /etc/grub.d/10_linux ### …… ### END /etc/grub.d/10_linux ###
d)/usr/src/linux-source-3.2.64/ubuntu/omnibook/Makefile 用右键管理员打开或者 gedit /usr/src/linux-source-3.2.64/ubuntu/omnibook/Makefile 找到下面两行 #EXTRA_LDFLAGS += $(src)/sections.lds EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds 调换一下‘#’的位置,如下 EXTRA_LDFLAGS += $(src)/sections.lds #EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds 4、编译内核 进入解压目录 cd /usr/src/linux-source-3.2.64 a)make mrproper //清除内核中不稳定的目标文件,附属文件及内核配置文件 b)make clean //清除以前生成的目标文件和其他文件
可以用右键管理员打开或者
gedit /usr/src/linux-source-3.2.64/kernel/sys.c
在文件最后添加
asmlinkage int sys_mycall(int number)
{
printk("Hello,我是包子·陈!这是我添加的第一个系统调用");
return number;
c)make oldconfig d)make –j4 bzImage e)make –j4 modules f)make modules_install
5、复制内核 首先查看一下编译好的内核版本,以便命名 打开 /lib/modules 里面应该多了一个纯数字不带"generic"的文件夹,那就是新内核版本号,我的是 3.2.64.11 然后复制内核
嵌入式操作系统实验报告
实验 2:向嵌入式 Linux 系统内添加系统调用
姓名 包子·陳 任课教师 童春洋
院系 软件学院 指导教师
实验地点 实验课表现
S207 出勤、表现得分 10% 操作结果得分 50%
实验时间 实验报告 得分 40%
实验目的:
向嵌入式Linux系统内添加系统调用
学号 2145xxxx 童春洋 2014 年 12 月 4 日
相关文档
最新文档