ARM学习 之 如何在向内核写入系统调用

本文主要介绍两个例子:1-系统调用打印“hello kernel”  2-驱动开发板的蜂鸣器

使用的是友善之臂(Friendly ARM)的开发板,三星2440

========================================================================================

1. 进入linux-2.6.32.2 目录,新建mysyscall 文件夹,并进入。然后新建.c 文件

 

2. myadd.c 文件的内容

3. 新建, vi Kconfig  内容如下:

4.  vi makefile

5.  $  cd ..

     $  vi Kconfig

  

6. $  vi makefile

7.   $ cd  ..

     $ vi arch/arm/include/asm/unistd.h

8.  $ vi arch/arm/kernel/calls.S

9.  $ make menuconfig  (必须在~/sq1600/linux-2.6.32.2  目录下)

 

10. 回车进入my sys call ---> ,空格选择 *

 

 之后选择<Exit>退出并保存

 

11.  $ cat   .config|grep CONFIG_MY_SYSCALL  - (会有CONFIG_MY_SYSCALL=出现,则正确)

       $ make zImage   -  编译

=====================================================

[email protected]:~/sq1600/linux-2.6.32.2$ ls drivers/mysyscall/

built-in.o Kconfig  Makefile  myadd.c  myadd.o

=====================================================

 

12.   $ cp  arch/arm/boot/zImage   /tftpboot    - 复制到tftp的目录下

 

13. 进入开发板的【u-boot】,依次执行如下命令:

ping 192.168.0.1  - 网络是否通畅

tftp 0x30008000 zImage   -- 拷贝到开发板

nand erase 0x60000 0x500000  --  擦除缓存区内容

nand write 0x30008000 0x60000 0x500000  --  写入内容

14. 进入目录~/sq1600/07/1_syscall的目录下

新建test_syscall.c 文件输入如下内容:

// 以下是控制蜂鸣器的   新建test_buzzer.c 文件输入如下内容:

15.  [email protected]:~/sq1600/07/1_syscall$ arm-linux-gcc test_syscall.c -o test_syscall

       [email protected]:~/sq1600/07/1_syscall$ cp test_syscall  /tftpboot/

 

16.   重启开发板,

进入开发板的/home/plg目录下

[[email protected] plg]#

[[email protected] plg]#  ifconfig eth0 192.168.0.230   - 设置开发板ip地址

[[email protected] plg]#  ping 192.168.0.1     - 查看网络是否通

[[email protected] plg]#  ping 192.168.0.1  

=================================================

PING 192.168.0.1 (192.168.0.1): 56 data bytes

64 bytes from 192.168.0.1: seq=0 ttl=64 time=2.797 ms

64 bytes from 192.168.0.1: seq=1 ttl=64 time=0.775 ms

^C

--- 192.168.0.1 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.775/1.786/2.797 ms

==================================================

结果如上,表示网络通畅

17.  [[email protected] plg]#  tftp  -r  test_syscall  -g 192.168.0.1                      

       [[email protected] plg]#  ./test_syscall

时间: 2024-10-14 04:51:27

ARM学习 之 如何在向内核写入系统调用的相关文章

Linux学习(二)之内核、系统调用、库

这篇博客主要介绍Linux中几个常见的概念 Kernal:内核:我们知道计算机的硬件包括:cpu.内存.外存等等 系统想要统一资源分配就需要用到内核!内核是将计算机的硬件资源抽象出来,提供给其他的软件,可以理解为平台. 而内核提供的使用方式就是:系统调用(System call) 库: 因为系统调用的功能有限,所以,人们将多个系统调用功能封装起来,提供更高级的功能接口供开发者调用. 这些功能接口组成的就是库! 而库文件不能单独执行,必须被调用才能执行. Windows系统的库文件类型是:.dll

NIO学习:使用Channel、Buffer写入文件

NIO的效率要高于标准IO,因为NIO将最耗时的IO操作(填充和提取缓冲区)转移会操作系统.NIO以块为单位传输数据,相比标准IO的以字节为单位效率要高很多. 通道和缓冲时NIO的核心对象,每个NIO操作都要使用到它们. 通道是对流的模拟,但与流不同,通道的传输是双向的,一个通道可以同时用于读和写. 缓冲区是一个容器,它包含将要写入或者刚读出的数据.使用通道进行读写时都要经过缓冲区. 使用NIO写入文件,可以通过文件流获取通道 FileOutputStream outputStream=new

[linux内核]ARM-Linux系统调用

1,系统调用的概念: 是用户空间访问内核的唯一手段,系统调用依靠软件中断实现,每个系统调用被赋予一个系统调用号,用来指明要执行哪个系统调用. 2,系统调用的实现:系统调用是通过软中端(SWI)实现的,SWI指令SWI指令的格式为:SWI{条件} 24位的立即数SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程.操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用 户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序

深入理解Linux内核-系统调用

系统调用:用户态进程向内核发出的,实现用户态进程调用硬件设备的函数或者中断:优点:使编程更容易,将用户从学习硬件设备的低级编程特性中解放:提高系统到安全性,内核在满足请求之前可以做正确性检查:提高可移植性: 系统调用与API调用的区别:1.API调用是一个函数定义:系统调用是通过软中断向内核发出的明确请求2.内核不可以访问库函数 内核中,返回值为正数或者0表示系统调用成功结束,否则表示出错条件 进入内核态的两种方式:1.执行 int $0x80 指令 :2.执行 sysenter 指令内核推出系

linux内核增加系统调用--Beginner‘s guide

Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. 一般的,进程是不能访问内核的,它不能访问内核所占用内存空间也不能调用内核函数.这被称为保护模式.为了和用户空间上运行的进程进行交互,内核提供一组接口.通过该接口应用程序可以访问硬件设备和其他操作系统资源. 实际上提供这组接口主要是为了保证系统稳定可靠,避免应用程序肆意妄为. 系统调用在用户空间和硬

向linux内核添加系统调用新老内核比较

2.6内核 1>修改linux-source-2.6.31/kernel/sys.c文件,在文件末尾添加系统响应函数.函数实现如下: asmlinkage int sys_mycall(int number) { printk("这是我添加的第一个系统调用"); return number; } 2>在linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S 中添加:.long sys_mycall 如: .long sy

arm-linux内存管理学习笔记(2)-内核临时页表的建立

学习了arm内存页表的工作原理,接下来就开始咱们软件工程师的本职工作,对内核相关代码进行分析.内核代码那么复杂,该从哪里下手呢,想来想去.其实不管代码逻辑如何复杂,最终的落脚点都是在对页表项的操作上,那么内核是在什么时机会对页表项进行操作,如何操作? 对于一个页表项,抛开所有的软件复杂逻辑,操作无非就是2种吧.一是填写更新页表项,二是读取获取页表项. MMU负责根据页表项进行虚实地址转换,因此读取获取页表项的工作是MMU硬件完成,软件是不参与的.内核代码的主体工作是来更新内存页表.页表更新的时机

2017.2.28学习笔记------------uboot 与linux内核的打补丁,编译,烧写

三者ping通是为了可以传文件. 第0课第5节_刚接触开发板之u-boot打补丁编译使用及建sourceinsight工程: Uboot打补丁:uboot源码是不能在2440用的,打了补丁后可以在2440中使用(在虚拟机里面配置,具体用到ls,cd,tar xjf u-boot-1.1.6等指令),解压出来等等,忘了可以看视频. Source insight工程:操作软件,方便看uboot源码等等,没什么可说的. 编译:cd u-boot-1.1.6 make 100ask_24x0.confi

ARM学习篇 SDRAM理解

1.SDRAM单管存储单元 SDRAM单管电路图 C记忆单元 T控制门管 Z字线 W位线 注:图示为N沟道耗尽型MOS管 写入:Z加高电平,MOS导通,W状态决定了电容C的状态 读出:Z加高电平,MOS导通,可以从W状态得知C的状态 保持:Z加低电平,MOS关闭,电容保持原状态 注意:单管读出是破坏性读出,因为读出时电容充电或者放电了,所以读出后还要重写 2.      刷新与重写  ●  刷新是每隔一段时间,自动重写一次:重写是破坏性读出后立即还原 最大刷新间隔:所有的动态单元都被重新刷一遍的