【韦德国际1946】操作系统实验,Linux系统调用

作者: 韦德国际1946  发布:2019-09-24

一、实验目标

(一)领会应用程序怎么样调用系统调用

在平日情状下,调用系统调用和调用二个常备的自定义函数在代码上并不曾什么分别,但调用后发生的业务有比极大区别。调用自定义函数是通过call指令间接跳转到该函数的地方,继续运营。而调用系统调用,是调用系统库中为该系统调用编写的三个接口函数,叫API(Application Programming Interface)(它对应贰个宏_syscallx,在unistd.h中)。API并不能够一气浑成系统调用的的确效用,它要做的是去调用真正的系统调用,进程是:

  • 把系统调用的号子存入EAX
  • 把函数参数存入其余通用贮存器
  • 触发0x80号中断(int 0x80)
  • 接下去正是内核的暂停管理了,自动调用函数system_call(在kernel/system_call.s中),到sys_call_table找到系统调用号对用的种类调用sys_xxx,执行它。
  1. 翻阅文本lib/close.c、fs/open.c、kernel/system_call.s、include/unistd.h、include/linux/sys.h,搜索系统调用close与那一个文件之间的涉嫌,清晰close系统调用的长河;

  2. 参谋体系调用close,在地点一三种文件中增进或涂改系统调用iam和whoami相关的内容(系统调用号、系统调用表、系统调用总的数量等);

  3. 制造who.c文件,在里面分别编写制定包括具体落实细节的sys_iam()和sys_whoami()函数;

  4. 修改Makefile,以便在实行make命令时能够编写翻译who.c文件;

  5. 编译linux内核,运行bochs;

  6. 编辑测验程序iam.c和whoiam.c;

此次实验必要修改unistd.h sys.h system_call.s makefile,并编写who.c iam.c whoami.c

古板的神经互联网并不能够管理类似系列的多寡难点,那也是它的三个一点都不小的短板。举例,想象你要去看清电影中每一个点发出哪些的事件。守旧神经互连网是不能够将原先的光阴利用到当下事变的前瞻的。

前言

此次实验和某操作系统实验课好像啊,作者又回看起了那四遍被Linux支配着的恐惧。

此番试验应用Ubuntu 14.04 LTS 64 bits举办交叉编写翻译,下位机是Raspberry Pi 2,编写翻译的内核版本是3.18.16-v7,而下载链接中提供的Raspbian-Wheezy-2016-02-17的根本也是3.18。编写翻译基本遵从松木丛派官方文书档案进行。

自个儿本次实验的全部思路是先在SD card上烧录好打包好的系统镜像,而其后编写翻译的基业能够一向放进去而不用重城建总公司体根目录。借使镜像内核版本和编译内核版本差异过大的话轻易出难点。而自个儿选用的那几个3.18版本和自家原来操作系统实验所用的本子也正如像样,所以基本步骤能够通用。

倘若根据教程跑,並且选取交叉编写翻译的话,那么推荐编写翻译安装的时候采取叁个能够一向触及到悬钩子派TF内部存款和储蓄器卡的Computer,各类远程服务器以及设想机在编写翻译内核模块的时候假使出了小编文中的丰富标题可能会相比较伤心。大概说其实是自己方法反常?(Update: 目前想了想,感到本身好蠢啊,能够断断续续编写翻译好了再scp过去,(:з」∠)

最终一节是本人折腾Acadia的从入门到甩掉之路,希望能对大家有个别拉拉扯扯。(翁老大说Acadia直接放弃好了,不需要入门)

1、理解操作系统的种类机能调用。

(1)修改linux-0.11/include/linux/sys.h

依赖Linux调用系统调用的进度,需求把 iam()与whoami()多个函数加到全局变量,和行车制动器踏板函数表中就能够了,中断被调用的时候,先物色中断向量表,找到相应的函数名,调用其函数。

各自增添评释到最上边和数组中

extern int sys_setup();
extern int sys_exit();
extern int sys_fork();
extern int sys_read();
extern int sys_write();
extern int sys_open();
extern int sys_close();
extern int sys_waitpid();
extern int sys_creat();
extern int sys_link();
extern int sys_unlink();
extern int sys_execve();
extern int sys_chdir();
extern int sys_time();
extern int sys_mknod();
extern int sys_chmod();
extern int sys_chown();
extern int sys_break();
extern int sys_stat();
extern int sys_lseek();
extern int sys_getpid();
extern int sys_mount();
extern int sys_umount();
extern int sys_setuid();
extern int sys_getuid();
extern int sys_stime();
extern int sys_ptrace();
extern int sys_alarm();
extern int sys_fstat();
extern int sys_pause();
extern int sys_utime();
extern int sys_stty();
extern int sys_gtty();
extern int sys_access();
extern int sys_nice();
extern int sys_ftime();
extern int sys_sync();
extern int sys_kill();
extern int sys_rename();
extern int sys_mkdir();
extern int sys_rmdir();
extern int sys_dup();
extern int sys_pipe();
extern int sys_times();
extern int sys_prof();
extern int sys_brk();
extern int sys_setgid();
extern int sys_getgid();
extern int sys_signal();
extern int sys_geteuid();
extern int sys_getegid();
extern int sys_acct();
extern int sys_phys();
extern int sys_lock();
extern int sys_ioctl();
extern int sys_fcntl();
extern int sys_mpx();
extern int sys_setpgid();
extern int sys_ulimit();
extern int sys_uname();
extern int sys_umask();
extern int sys_chroot();
extern int sys_ustat();
extern int sys_dup2();
extern int sys_getppid();
extern int sys_getpgrp();
extern int sys_setsid();
extern int sys_sigaction();
extern int sys_sgetmask();
extern int sys_ssetmask();
extern int sys_setreuid();
extern int sys_setregid();

extern int sys_iam();//需要新增的地方
extern int sys_whoami();

fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid, sys_iam, sys_whoami };//记得在中断向量表的最后填上系统调用

只是锐界NN消除了那些难题,福特ExplorerNN中有个CR-VNN Cell用来长久化音信。<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="
" class="uri">

<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
韦德国际1946,<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
【韦德国际1946】操作系统实验,Linux系统调用。<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">
<a href="" class="uri">

试编译

事实上只要熟知的话,直接在文件目录底下改文件就能够,本步骤不是须求的。

唯独,得到不会的事物不足先点个灯?

第一从git上把品种拽下来,解压之后文件夹结构大意上长这么。

推介全部的操作均在linux下实现。因为假如缩减包内有局地软链接什么的在windows底下会出标题,而在linux下才会被准确深入分析。

而一旦在mac上架子不对也是会出标题的,比方说使用的文件系统是高低写不灵活的,那那会促成到背后编写翻译的时候贫乏有些文件或然缺少有个别宏定义等等。文件系统大小写标题标技术方案戳那位同学的在mac os x上进展嵌入式linux开荒[编译linux kernel]

韦德国际1946 1

文本夹结构

然后是安装交叉编写翻译工具,在Lab第22中学曾经下载过,直接拿来行使就可以。

韦德国际1946 2

编写翻译器们

还会有还会有,编写翻译从前有一部分依靠,别忘记装了,ubuntu仍是可以够apt-get大法砍下来的。

sudo apt-get install bc

松木丛派1和2里头的操作还是有一部分分其余,注意看好型号,托盘派1一直去找官方文书档案顺着做就好了。

希图好之后,就足以起来编写翻译了。

首先是config文件,可以行使今后马林派上选拔的config文件举办编写翻译,红树莓派上的铺排文件是/proc/config.gz,使用zcat命令能够一向查看。

而根据法定教程,源码包内有连锁安插能够平昔拿来选用。

KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

接纳上述命令选用好项目布局就能够。作者采用使用的是源码包内和本人地仙泡派对应的不行配置(官方的科目写的便是那几个)。

韦德国际1946 3

configuration

其后企图好之后就足以平素起首编写翻译了

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

童女祈祷中………………

左右又是一段持久的编写翻译之旅。

只要编译中间有标题,一般的话先思量是还是不是借助未有满足,而后借使再有啥file missing之类的荒谬小编赞成于是源码包相当。

完全编写翻译进程蛮顺遂的。不像某Acadia……一定是因为欧洲糙莓派长得更像自家熟谙的Linux……

韦德国际1946 4

编写翻译完结后文件结构

编写翻译达成之后正是设置,假如烧录了树莓派官方给出的SDcard镜像,那么今后您的SD存款和储蓄卡分区长这么。SDcard使用读卡器接入计算机。

/dev/sdd
    /dev/sdd1 fat32 boot  启动分区
    /dev/sdd2 ext4 /  根目录

由于目录与课程一致,所以就径直遵照步骤施行一次就能够。

# 建立挂载点
mkdir /mnt/fat32
mkdir /mnt/ext4

# 挂载
# fat32挂载boot
sudo mount -t vfat /dev/sdd1 /mnt/fat32
# ext4挂载根文件夹
sudo mount -t ext4 /dev/sdd2 /mnt/ext4

# 在文件系统中安装编译出来的模块
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/ext4 modules_install

# 备份原来的系统镜像,其中$KERNEL在编译前进行过设置,此时值为kernel7
sudo cp /mnt/fat32/$KERNEL.img /mnt/fat32/$KERNEL-backup.img
sudo scripts/mkknlimg arch/arm/boot/zImage /mnt/fat32/$KERNEL.img

# 将其他我不认识的文件拷到我不认识的地方
sudo cp arch/arm/boot/dts/*.dtb /mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /mnt/fat32/overlays/

# 卸载
sudo umount /mnt/fat32
sudo umount /mnt/ext4

这年平昔将SDcard插到三月泡派上,上电就足以运行了。

2、驾驭用C语言完成系统功效调用的方式和步骤。

(2) 修改系统调用数:

system_call.s 在 linux-0.11/kernel 中
需要把nr_system_calls 由72改为 74 表示了暂停函数的个数。

sa_handler = 0
sa_mask = 4
sa_flags = 8
sa_restorer = 12

nr_system_calls = 74

(3)新扩展系统调用 号:
unistd.h 无法直接在oslab间接直接改动,
而急需在虚构机中期维修改,
在oslab中有一个mount-hdc脚本
运营sudo ./mount-hdc 能够把虚构机硬盘挂载在oslab/hdc 目录下。
(这一个也得以达成文件分享)
在hdc/usr/include 目录下修改unistd.h
卡在那二日的经过.

#define __NR_setup    0   /* used only by init, to get system going */
#define __NR_exit    1
#define __NR_fork    2
#define __NR_read    3
#define __NR_write    4
#define __NR_open    5
#define __NR_close    6
#define __NR_waitpid    7
#define __NR_creat    8
#define __NR_link    9
#define __NR_unlink    10
#define __NR_execve    11
#define __NR_chdir    12
#define __NR_time    13
#define __NR_mknod    14
#define __NR_chmod    15
#define __NR_chown    16
#define __NR_break    17
#define __NR_stat    18
#define __NR_lseek    19
#define __NR_getpid    20
#define __NR_mount    21
#define __NR_umount    22
#define __NR_setuid    23
#define __NR_getuid    24
#define __NR_stime    25
#define __NR_ptrace    26
#define __NR_alarm    27
#define __NR_fstat    28
#define __NR_pause    29
#define __NR_utime    30
#define __NR_stty    31
#define __NR_gtty    32
#define __NR_access    33
#define __NR_nice    34
#define __NR_ftime    35
#define __NR_sync    36
#define __NR_kill    37
#define __NR_rename    38
#define __NR_mkdir    39
#define __NR_rmdir    40
#define __NR_dup    41
#define __NR_pipe    42
#define __NR_times    43
#define __NR_prof    44
#define __NR_brk    45
#define __NR_setgid    46
#define __NR_getgid    47
#define __NR_signal    48
#define __NR_geteuid    49
#define __NR_getegid    50
#define __NR_acct    51
#define __NR_phys    52
#define __NR_lock    53
#define __NR_ioctl    54
#define __NR_fcntl    55
#define __NR_mpx    56
#define __NR_setpgid    57
#define __NR_ulimit    58
#define __NR_uname    59
#define __NR_umask    60
#define __NR_chroot    61
#define __NR_ustat    62
#define __NR_dup2    63
#define __NR_getppid    64
#define __NR_getpgrp    65
#define __NR_setsid    66
#define __NR_sigaction    67
#define __NR_sgetmask    68
#define __NR_ssetmask    69
#define __NR_setreuid    70
#define __NR_setregid    71   /*Linux system_call total 72*/
#define __NR_iam    72     /*new system_call 72 and 73*/
#define __NR_whoami    73

 

修改系统调用

本节能够结合操作系统实验2的试验指点一齐食用。

系统调用实际上是调用内核有个别函数的长河。所以,为了告知操作系统曾几何时该用什么函数,须求在根本中进行部分修改。

率先,你必要在基本中有三个这么的可进行的函数。在arch/arm/kernel中新建二个sys_mysyscall.c文件,只富含一个函数,其职能为在运行后输出一条基本日志。

韦德国际1946 5

sys_mysyscall.c

而后,修改Makefile中的obj-y字段,将sys_mysyscall.o参预指标文件中。就要该函数放入系统的编写翻译进度。

韦德国际1946 6

Makefile

而后,你须求让操作系统知道这么些函数是管理有个别系统调用的函数。此时,须要修改系统的中断向量表。此时需求修改arch/arm/kernel/calls.S文件。

奉公守法操作系统实验的课程,选用223号调用举办轮换。223号调用在x86体系架构的体系上是从未运用的,而arm的就如如此替换也从未难点?不是很懂,不过如此替换未有超出坑。

韦德国际1946 7

系统中断向量表 call.S

在include/uapi/asm-generic/unistd.h头文件元帅223号调用与有些宏举行关联,在syscall()中登记二个地点,方便调用。

韦德国际1946 8

unistd.h

然后接下去正是又一回的编写翻译了,可是此次由于改的事物很少,编写翻译会快一些。

将镜像载入到SDcard之后,起首编写制定使用系统调用的顺序。如下五个分别选择了汇编的法子以及系统提供的syscall格局调用系统调用。

#include <stdio.h>
#define sys_call() {__asm__ __volatile__ ("swi 0x900000 223nt");} while(0)

int main(void) {
    sys_call();
    printf("Type "dmesg | tail" to see the result.n");

    return 0;
}

#include <linux/unistd.h>
#include <sys/syscall.h>

int main(){
    syscall(223);
    return 0;
}

韦德国际1946 9

运转结果

3、领悟使用10H号作用调用(BIOS的突显I/O成效调用)来促成对荧屏的操作与垄断(monopoly)。

(4)新扩展who.c文件,达成系统调用的函数:

将不负职责的who.c文件放入linux-0.01/kernel 目录下

#include <string.h>
#include <errno.h>
#include <asm/segment.h>

char msg[24];

int sys_iam(const char * name)
{
    char tep[26];
    int i = 0;
    for(; i < 26; i  )
    {
        tep[i] = get_fs_byte(name i);
        if(tep[i] == '\0')  break;
    }

    if (i > 23) return -(EINVAL);

    strcpy(msg, tep);
    return i;
}

int sys_whoami(char * name, unsigned int size)
{
    int len = 0;
    for (;msg[len] != '\0'; len  );

    if (len > size) 
    {
        return -(EINVAL);
    }

    int i = 0;
    for(i = 0; i < size; i  )
    {
        put_fs_byte(msg[i], name i);
        if(msg[i] == '\0') break;
    }
    return i;
}

内核模块

第一要求写一个内核模块,作者就偷懒直接动用即时操作系统实验中写的连串经过总括的次序了。

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/uaccess.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lmzqwer2 <lmzqwerty@163.com>");
MODULE_DESCRIPTION("In-kernel processors infomation detector.");

#define show(id,arr,x) printk(KERN_INFO "%s%s %dn", id, #x, arr[x]);
#define clean(arr,x) arr[x] = 0
#ifndef IDENTIFIER
    #define IDENTIFIER aaaadfa
#endif

static int processorDetector_read(struct file *file, char __user *out,
                                    size_t size, loff_t *off){
    // identifier用于每次调用的输出,每行的输出均带有此标识符,而后用户程序在读取系统日志的时候只识别带有该标识符的日志。
    static char identifier[] = "IDENTIFIER";

    // 系统init进程指针,使用该指针可以将整个系统的所有进程遍历一遍
    struct task_struct *task = &init_task;

    int i, taskTotal = 0;

    // 用于统计每个状态的进程的个数,开大数组为了能少写点代码……写法比较蠢
    static int stateCollection[2049];

    // 每次进调用需要清除上一次的结果
    clean(stateCollection, TASK_RUNNING);
    clean(stateCollection, TASK_INTERRUPTIBLE);
    clean(stateCollection, TASK_UNINTERRUPTIBLE);
    clean(stateCollection, __TASK_STOPPED);
    clean(stateCollection, __TASK_TRACED);
    clean(stateCollection, EXIT_DEAD);
    clean(stateCollection, EXIT_ZOMBIE);
    clean(stateCollection, EXIT_TRACE);
    clean(stateCollection, TASK_DEAD);
    clean(stateCollection, TASK_WAKEKILL);
    clean(stateCollection, TASK_WAKING);
    clean(stateCollection, TASK_PARKED);
    clean(stateCollection, TASK_STATE_MAX);

    // 修改identifier,使每次读取该设备的时候返回的值均不同。
    identifier[0]  ;
    i = 0;
    while (identifier[i] == 'z' 1){
        identifier[i  ] = 'a';
        if (i < sizeof(identifier)){
            identifier[i]  ;
        }else
            break;
    }

    // 遍历系统的进程,有宏next_task进行进程之间的跳转
    // linux的进程使用环形链表,从init_task到init_task即完成了一次遍历
    do{
        printk(KERN_INFO "%s%s %d %ld %sn", identifier, task->comm, task->pid, task->state, task->parent->comm);
        stateCollection[task->state]  ;
        taskTotal  ;
        task = next_task(task);
    }while (task != &init_task);

    // 输出遍历之后的统计信息
    printk(KERN_INFO "%sThere is %d processes in system.", identifier, taskTotal);
    show(identifier, stateCollection, TASK_RUNNING);
    show(identifier, stateCollection, TASK_INTERRUPTIBLE);
    show(identifier, stateCollection, TASK_UNINTERRUPTIBLE);
    show(identifier, stateCollection, __TASK_STOPPED);
    show(identifier, stateCollection, __TASK_TRACED);
    show(identifier, stateCollection, EXIT_DEAD);
    show(identifier, stateCollection, EXIT_ZOMBIE);
    show(identifier, stateCollection, EXIT_TRACE);
    show(identifier, stateCollection, TASK_DEAD);
    show(identifier, stateCollection, TASK_WAKEKILL);
    show(identifier, stateCollection, TASK_WAKING);
    show(identifier, stateCollection, TASK_PARKED);
    show(identifier, stateCollection, TASK_STATE_MAX);

    // 将标识符拷贝给用户
    copy_to_user(out, identifier, sizeof(identifier));
    return 0;
}

// 只实现了读取指令,返回identifier
static struct file_operations processorDetector_fops = {
    .owner = THIS_MODULE,
    .read = processorDetector_read,
    .llseek = noop_llseek
};

// 模块名为processorDetector
static struct miscdevice processorDetector_misc_device = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "processorDetector",
    .fops = &processorDetector_fops
};


// insmod的时候调用该函数进行一些处理
static int __init processorDetector_init(void){
    // create a device file at "/dev/"
    // named "processorDetector"
    misc_register(&processorDetector_misc_device);
    printk(KERN_INFO
            "processorDetector device has been registed.n");
    return 0;
}

// rmmod的时候调用该函数进行一些清理
static void __exit processorDetector_exit(void){
    misc_deregister(&processorDetector_misc_device);
    printk(KERN_INFO
            "processorDetector device has been unregisted.n");
}

// 注册模块的init & exit函数
module_init(processorDetector_init);
module_exit(processorDetector_exit);

该内核模块还亟需三个使用者举行利用。

#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <fcntl.h>

char identifier[100];
char buf[100000];

int inner(char* a, char* b){
    while (*a   == *b  );
    return *a==0;
}

int main(int argc, char* argv[]){
    // 这个fd打开的是上面编译的内核模块
    int fd = open("/dev/processorDetector", O_RDWR);

    // 这个FILE*打开的是系统log
    FILE* log = fopen("/var/log/kern.log", "r");
    int i, len, buflen;

    // 首先从内核模块中获取输出标识符
    read(fd, identifier, sizeof(identifier));
    printf("Identifier: %sn", identifier);

    // 为了方便以后性能优化,先睡个2s先
    sleep(2);

    // 读取系统日志,判断标识符后输出
    len = strlen(identifier);
    while (!feof(log)){
        fgets(buf, sizeof(buf), log);
        buflen = strlen(buf);
        i = 0;

        // 不要吐槽暴力枚举
        while (i   len < buflen && !inner(identifier, buf i)){
            i  ;
        }
        if (!feof(log) && i   len < buflen - 1){
            printf("%s", buf i len);
        }
    }
    return 0;
}

好了,今后有了内核模块,也是有了相应的的客商程序。那么正是编写翻译运营了。

自身所想的内核模块编写翻译进程是如此的,一切顺遂。

韦德国际1946 10

操作系统实验中的内核模块编写翻译

然后就崩了。一定是代码又过有效期了……

既然如此崩了就消除喽。

错误音讯提醒的是找不到build文件夹,原本还以为是安装的时候未有带上,然后开掘正是设置的时候从不带上。不过那错误和我料想的不等同……

韦德国际1946 11

编译错误

本身就一脸懵逼得看着这几个荒唐。那几个 build -> /home/lmuser/tmp/linux 的情趣是它在装置的时候只是送了二个软链接过去?竟然从未平素拷贝……

不过留意一想大概是SDcard上未曾这么大的空中把全路项目拷贝进去,所以就选用了软链接。

可是,不过,不过!以后SDcard在马林派上,并不曾/home/lmuser/这种事物。经过自个儿一番深谋远虑,笔者主宰——内核模块也用交叉编写翻译。

既是要交叉编写翻译,那么makefile自然就不可能像原来的这样轻便了。手动加的特殊本领有一点点多。主如若钦点编写翻译文件夹以及钦点编写翻译的参数等。

obj-m := processorDetector.o
# 其实不需要这么多特技,直接定位/home/lmuser/tmp/linux即可
KERNEL_VER := 3.18.16-v7
KERNEL_DIR := /media/lmuser/f24a4949-f4b2-4cad-a780-a138695079ec/lib/modules/$(KERNEL_VER)/build

PWD := $(shell pwd)
ARGS := ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
all:
    make -C $(KERNEL_DIR) SUBDIRS=$(PWD) $(ARGS) modules
clean:
    rm *.o *.ko *.mod.c
.PHONY:clean

以为好蠢啊……一点都不佳看。可是照旧好用的……

然后将山抛子派关机,拔出SDcard,读卡器,cd,make,弹出SDcard,地仙泡派开机。

编写翻译期报了个warning,华丽丽无视之。

接下去正是认证成果的时候了,果断运营之。

韦德国际1946 12

内核模块运维结果

中标把整个操作系统当前运作的兼具进程都输出出来了。

撒花,庆祝!

二、实验内容

(5) 修改Makefile 文件

让大家抬高的kernel/who.c能够和别的Linux代码编写翻译链接到一齐,必须求修改Makefile文件
Makefile在代码树中有过多,分别担当分化模块的编写翻译专门的工作。我们要修改的是kernel/Makefile。

OBJS  = sched.o system_call.o traps.o asm.o fork.o 
        panic.o printk.o vsprintf.o sys.o exit.o 
        signal.o mktime.o
改为:
OBJS  = sched.o system_call.o traps.o asm.o fork.o 
        panic.o printk.o vsprintf.o sys.o exit.o 
        signal.o mktime.o who.o
另一处:
### Dependencies:
exit.s exit.o: exit.c ../include/errno.h ../include/signal.h 
  ../include/sys/types.h ../include/sys/wait.h ../include/linux/sched.h 
  ../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h 
  ../include/linux/kernel.h ../include/linux/tty.h ../include/termios.h 
  ../include/asm/segment.h
改为:
### Dependencies:
who.s who.o: who.c ../include/linux/kernel.h ../include/unistd.h
exit.s exit.o: exit.c ../include/errno.h ../include/signal.h 
  ../include/sys/types.h ../include/sys/wait.h ../include/linux/sched.h 
  ../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h 
  ../include/linux/kernel.h ../include/linux/tty.h ../include/termios.h 
  ../include/asm/segment.h

Makefile修改后,和过去同一“make all”就可以自行把who.c插手到根本中了

make all 
编译系统

(6) 新扩大iam.c 跟whoami.c文件以测量试验是不是丰硕种类调用成功:
iam.c

#define __LIBRARY__
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
_syscall1(int,iam,const char*,name)

int main(int argc,char* argv[])
{
    iam(argv[1]);
    return 0;
}

whoami.c

#define __LIBRARY__
#include <unistd.h>
#include <errno.h>
#include <stdio.h>

_syscall2(int, whoami, char*, name, unsigned int, size);

int main(int argc, char ** argv)
{
    char t[30];
    whoami(t, 30);
    printf("%sn", t);
    return 0;
}

注:那四个C文件是亟需在 你改改过的linux 0.11版本上编写翻译的,假使嫌在 0.11 里头用vi 写代码太烦,能够在设想机中写好, 在oslab中运维

sudo ./mount-hdc 

可以把设想机硬盘挂载在oslab/hdc 目录下。
接下来再将文件复制到 oslab/hdc/user/root/下
/user/root/ 就是你的linux 0.11 开机后所在目录
好了, 写完了,运行run

cd /home/fgx/oslab
./run

运维连串
(7)编译 iam.c 跟 whoami.c

gcc -o iam iam.c 
gcc -o whoami whoami.c 

运行一波,惊奇来啦~

韦德国际1946 13

image.png

关于Acadia

谈起底笔者利用托盘派并不是Acadia完结了实验,原因首如若因为大麦泡派在网络的学科很多,而且悬钩子派看上去整个文件结构怎么着的就相比较像本身熟悉的Linux。(主要是因为我和Acadia相性不合,折腾不出来)

还要没有沙窝窝派未有板载的存款和储蓄设备,SDcard间接当做系统存款和储蓄,插拔读取修改操作都很有益于。最要紧的是绝不顾虑刷机刷坏了,刷坏了再烧贰个就是了,Acadia有板载的仓库储存不是很敢乱玩。

以下的试验步骤作者编写翻译成功步入过一回系统,唯有二次。之后不管怎么操作都进不去,也许是那一步中间有甚十分的地点笔者没在意到啊。

试行一开端就不顺畅。固然pcDuino/kernel.git这一个git仓库十分的小,可是linux-sunxi这么些库房大呀,1.6G啊,500W 的文本啊。

老是git到1W 的时候就clone不下来了。后来缓慢解决方案是选拔服务器git clone --recursive下载完全之后,tar -czvf二遍性打个包,再wget / Thunder到本地,再丢给虚构机linux中就足以开展编写翻译了。

砍下来之后正是初阶编译了,遵照官方教程,一步一步跑下来。就像是也尚无叫本身安排哪些config之类的。_(:з」∠)_

然后编写翻译报了个错。

arm-linux-gnueabihf-ld.bfd: error: required section '.rel.plt' not found in the linker script

网络找了部分材质,说是要下载那几个包。

sudo apt-get install ia32-libs

可是笔者并未能成功找到这几个包,寻觅了半天,最后结果是采纳上面那么些包进行替换。

sudo apt-get install gcc-multilib

编写翻译继续。

fs/btrfs/ctree.c:26:21: fatal error: locking.h: No such file or directory
 #include "locking.h"

以此fs找不到底文件啊,拿很难办啊,反正不认得,config里面去掉好了。编译继续。

而后,又报了个错。

fel.c:21:20: fatal error: libusb.h: No such file or directory
#include <libusb.h>

英特网找说是缺那一个,

sudo apt-get install libusb-1.0-0-dev

不过依然找不到,末了发掘少了三个配备项指标先后。

sudo apt-get install pkg-config

下下来今后就足以持续编译了。

下一场就又编译不下来了。

Make sys configs: /home/linux/kernel/allwinner-tools/livesuit/default/sys_config_linux.fex
/home/linux/kernel/allwinner-tools/bins/script: 1: /home/linux/kernel/allwinner-tools/bins/script: Syntax error: end of file unexpected

先用file看了一晃那么些文件,并看不出什么。

linux@linux-VBox:~/kernel/allwinner-tools/bins$ file script 
script: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=7ce8c666545525b7459addd15d8d7b91c4e70009, not stripped

百度了弹指间发觉这么一句话

韦德国际1946 14

[【转】有关pcduino 内核编写翻译难点]()

诶,然后开掘真正是生成了hwpack这么些文件,作者就当是编写翻译成功没再管了。(说不定就是这个问题)

接下去正是何许将其设置到Acadia了。

先是解包,有如下文件结构。

韦德国际1946 15

文本结构

Acadia有贰个板载的系统以及俩SDcard插槽,通过计划能够从中自便选二个举办运营。

韦德国际1946 16

韦德国际1946 17

Acadia Boot开关选拔

本人首先采纳选择SD1举办运营。运维的格局也很保守,使用的是法定给的镜像,然后就像是是没运维起来照旧怎么回事,反正最后自个儿舍弃了从SDcard直接开发银行。

而一旦要从板子运维,由于有板子自带存款和储蓄器,无法备份,小编采用怂。

要把刚刚十二分hwpack中的文件全体归入系统,那么须要思考部分事物。首先,板载系统自带bootloader,那么bootloader这么些文件夹应该是不用去管的。而rootfs是放系统模块的,留意看了一晃,和原版系统尚未争执,直接拷贝之。而kernel相比较为难,想要无龃龉消除的话得加一些特技。

比方使用bootloader的的一些下令,将基本手动载入系统。

第一依然得把系统烧入SDcard,使用以下命令就可以,注意seek是一连载入系统的时候的参数之一,要前后一致。

sudo dd if=uImage of=/dev/sdd bs=512 seek=2048
sync

sync了今后,把SDcard从Computer上转到Acadia上,从emmc运行,步向bootloader。

# 设置了一些控制台的参数
setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'

# 控制文件系统的位置,使用的root位置为emmc即可
setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk0p1 rootwait rw'

# 载入系统内核,
# 表示读取SDcard1的
# 地址为0x800后续0x2000的内容
# 读入位置为$(loadaddr),即后续bootm所用的地址
setenv bootcmd_mmc 'run bootargs_base bootargs_mmc; mmc dev 1; mmc read ${loadaddr} 0x800 0x2000; bootm'

# 开始引导
setenv bootcmd 'run bootcmd_mmc'
boot

下一场,接下去出现了三种错误。

  • 率先种是根本读不到

    正如少见,重启可破。

  • 第二种是CRC校验失利

    能够运用命令强行扭过去。

setenv verify no

不过这种方法基本上是会进第三种错误的。校验本来就是为了能够保证东西是对的。

未解决!

* 第三种是输出了 Starting kernel ... 之后,完全没有反应

这句话是bootloader输出的最后一句话,在此之后,控制权转交给内核。

然而内核一点反应都没有,那这就很尴尬了。原因有很多,没有再折腾了。

未解决。

最终我的Acadia之路在某次顺利从编译出的内核启动之后,就停留在了那个尴尬的阶段。

Starting kernel ...

总的来说,没做出来可能的原因有几点;

1. make没有make完毕
2. make前没有做相关的配置
3. 没有直接烧录板子,太怂
4. 虚拟机有毒
5. 和Acadia相性不合
6. 我太蠢

反正就是扑街了,哪来这么多原因……

#参考资料

* [git clone 一个比较大的 repo 出错, 纠结我 1 天了, 求助](https://segmentfault.com/q/1010000000637171)

树莓派相关

* [Raspberry Pi documentation: KERNEL BUILDING](https://www.raspberrypi.org/documentation/linux/kernel/building.md)
* [驱动开发的一些错误解决方法](http://blog.chinaunix.net/uid-24456535-id-2606924.html)
* [树莓派开发系列教程8——树莓派内核编译与固件升级](http://blog.csdn.net/xdw1985829/article/details/39077611)
* [树莓派上为内核添加系统调用](http://blog.csdn.net/rk2900/article/details/8848093)
* [在mac os x上进行嵌入式linux开发[编译linux kernel]](http://es.hzypp.me/zai-mac-os-xshang-jin-xing-qian-ru-shi-linuxkai-fa-bian-yi-linux-kernel/)

Acadia相关

* [Cross build pcDuino kernel on X86-64 machine](http://learn.linksprite.com/pcduino/a10-based-pcduino1pcduino2pcduino-litepcduino-lite-wifi/how-to-cross-build-pcduino-kernel-on-x86-64-machine/)
* [Tutorial on Flashing LinkSprite Acadia](http://learn.linksprite.com/acadia/tutorial-on-flashing-linksprite-acadia/)
* [pcDuino的Linux移植心得笔记](http://www.linuxidc.com/Linux/2013-04/83606.htm)
* [pcDuino: How to compile Kernel for pcDuino](http://blog.chinaunix.net/uid-23381466-id-3821540.html)
* [How to build linux images by yourself for pcDuino?](http://learn.linksprite.com/?p=1048)
* [pcDuino无显示器刷机与使用](http://www.cnblogs.com/damir/p/3200558.html)
* [【转】有关pcduino 内核编译问题](http://www.pcduino.org/forum.php?mod=viewthread&tid=147)
* [I.MX6Q(TQIMX6Q/TQE9)学习笔记——内核启动与文件系统挂载](http://blog.csdn.net/girlkoo/article/details/44626011)
* [Get stuck at "Starting kernel ..." using imx-3.10.17-1.0.1_ga](https://community.nxp.com/thread/329129)

# 下载链接

树莓派相关

* [raspberrypi / linux](https://github.com/raspberrypi/linux)

  整个项目大概git clone下来至少有1G。用校内的小水管慢慢跑简直难受。
  我选择的版本是rpi-3.18.y。如果有服务器直接git clone了之后git checkout到这个tag了之后,.git文件夹的历史使命就结束了。
  此时将.git文件夹直接删了就可以了。大概整个目录就剩下100多Mb了,这就能下载了。
  当然,如果有别人下载好了你直接拷贝也是极好的。

  官方文档提供了这样一个命令,也是能减少git文件夹的。

git clone --depth=1 https://github.com/raspberrypi/linux

* [raspbian-2015-02-17/](https://downloads.raspberrypi.org/raspbianraspbian-2015-02-17/)

Acadia相关

* [Github: pcduino / kernel](https://github.com/pcduino/kernel)
* [Image for Acadia](http://www.linksprite.com/image-for-acadia/)

1、在显示屏的钦点区域内显示字符串。(必做题)

2、在显示屏的制订区域内画框,在框内展现字符串。(提升题)

3、在荧屏上点名区域内画框并以动画方式显得字符串。(选做题)

清屏子程序:

void cls(void)

{ union REGS r;

  r.h.ah=6; /*子效能号*/

本文由韦德国际1946发布于韦德国际1946,转载请注明出处:【韦德国际1946】操作系统实验,Linux系统调用

关键词: 操作系统 嵌入式系统 伟德国际娱乐1