历史上的今天
返回首页

历史上的今天

今天是:2025年04月13日(星期日)

正在发生

2018年04月13日 | ARM嵌入式应用调试之自制系统调用

2018-04-13 来源:eefocus

一、原理

要想自制系统调用,当然首相要做的就是明白系统调用的过程:

我们拿open函数来举个例子:当用户空间执行open函数时,会通过glibc函数库的作用最终去调用sys_open函数,sys_open函数最终又会调用我们具体注册的open函数!那么这里最主要的就是glibc函数库干了些什么呢?其实它的作用就是当用户空间执行open函数时,会去执行一条swi #val指令,这条指令会使cpu发生异常,并跳转到异常向量入口:vector_swi处去执行,之后的代码会根据引发异常的指令取出其中的参数,并根据这个参数调用对应的处理函数!sys_open、sys_read、sys_write这些函数是放在一个数组里面的,就是根据取出的这个val值为下标找到sys_open函数!

说的有点乱,我们来理一理:app调用open->swi #val->引发cpu异常->跳转到异常向量入口处->根据引发异常的指令调用对应的处理函数!

 

那么我们自制系统调用的话,需要实现两点:
1、写一个应用函数:swi #val

2、在内核里面仿sys_xxx写一个函数,放入数组!

前者用于引发异常,后者用于具体实现!

 

二、实现

1、内核函数

(1)在arch/arm/kernel/call.S文件里面的CALL()列表的最后添加一项,如:CALL(sys_hello)

这里是用来调用sys_hello

(2)在fs/read_write.c文件里加入如下代码:

asmlinkage void  sys_hello(const char __user * buf, size_t count)
{
    char ker_buf[100];
    if(buf)
        {

// 目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0
            copy_from_user(ker_buf,buf,(count<100) ? count:100);
            ker_buf[99]='\0';
            printk("sys_hello:%s\n",ker_buf);
        }
}

这里是sys_hello的具体实现

(3)在include/Linux/syscalls.h文件里加入如下代码:

asmlinkage void  sys_hello(const char __user * buf, size_t count);

这是对函数sys_hello的声明

以上我们分别实现了函数的定义、声明和调用!这样内核里面的工作就完成了!

 

2、应用程序

#include
#include
#define __NR_SYSCALL_BASE       0x900000

void hello(char *buf, int count)
{
        

//这里C 语言调用汇编会使用asm();

        asm ("mov r0, %0\n"   
             "mov r1, %1\n"   
                 "swi %2\n"   执行swi指令进入内核态
                 :
                 : "r"(buf), "r"(count), "i" (__NR_SYSCALL_BASE + 352)
                 : "r0", "r1");


}

int main(int argc, char **argv)
{
        printf("in app, call hello\n");
        hello("www.100ask.net", 15);//这个函数会进行系统调用
        return 0;
}

当我们用原来的内核启动的时候,打印信息如下:
in app, call hello

当我们用新内核启动的时候,打印信息如下:

in app, call hello
sys_hello:www.100ask.NET

成功了!

在本节里面我们只是实现了一个系统调用,至于系统调用在应用调试里面如何应用,我们下一节里面会详细讲解!


推荐阅读

史海拾趣

国产公司的发展小趣事
合理布局电路中的元器件和走线,避免形成不必要的环路和耦合。
BCD Semi(Diodes)公司的发展小趣事

在追求经济效益的同时,BCD Semi(Diodes)公司也积极履行企业社会责任,关注可持续发展。公司严格遵守环保法规,采用环保材料和工艺,减少生产过程中的污染排放。同时,公司还积极参与社会公益事业,为当地社区的发展做出贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事是基于电子行业的一般情况和BCD Semi(Diodes)公司的行业地位构建的,并非真实发生的历史事件。如需了解BCD Semi(Diodes)公司的真实发展故事,建议查阅公司官方发布的资料或相关新闻报道。

Alpha Wire公司的发展小趣事

在追求经济效益的同时,BCD Semi(Diodes)公司也积极履行企业社会责任,关注可持续发展。公司严格遵守环保法规,采用环保材料和工艺,减少生产过程中的污染排放。同时,公司还积极参与社会公益事业,为当地社区的发展做出贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事是基于电子行业的一般情况和BCD Semi(Diodes)公司的行业地位构建的,并非真实发生的历史事件。如需了解BCD Semi(Diodes)公司的真实发展故事,建议查阅公司官方发布的资料或相关新闻报道。

GE Power Electronics Inc公司的发展小趣事
合理设计电路布局和布线,避免信号干扰和串扰。同时,采用适当的保护电路,如过压保护、过流保护等。
Heimann Optoelectronics Gmbh公司的发展小趣事

近年来,随着全球对环保和可持续发展的重视,Hei Inc Optoelectronic Division积极响应国家号召,将绿色可持续发展理念融入到企业的生产经营中。公司投入巨资研发环保型光电子器件,并不断优化生产工艺流程以降低能耗和排放。同时,公司还积极参与各类环保公益活动,提升公众对绿色光电子技术的认知度。这些举措不仅赢得了社会各界的广泛赞誉,还为公司树立了良好的企业形象和品牌形象。在绿色可持续发展的道路上,Hei Inc Optoelectronic Division正稳步前行,不断开创光电子领域的新篇章。

捷嘉电子(Chequers Electronic)公司的发展小趣事

在国内市场取得一定成绩后,捷嘉电子开始将目光投向国际市场。通过与国外知名企业的合作,公司成功将产品出口到数十个国家。这一过程中,捷嘉电子不仅面临着文化差异、法律法规等挑战,还需要应对国际市场竞争的复杂性。然而,凭借着过硬的产品质量和专业的服务,捷嘉电子逐渐在国际市场上赢得了良好的口碑。

问答坊 | AI 解惑

研祥做客嵌入式在线

研祥做客嵌入式在线——嵌入式带来工业控制的新变革             ·2008年7月25日上午10:00--11:30             ·访谈嘉宾:朱 军              ·嘉宾简介:国家工控机专委会常委、研祥智能科技股份有 ...…

查看全部问答>

好东东共享,Cadence SPB15.7 视频教程第1-7讲(于博士版)

可在线观看,也可以下载。 文件太大,传不上来。 给个地址,自己去下载吧。 http://www.sig007.com/videoclass/107.html http://www.sig007.com/videoclass/108.html http://www.sig007.com/videoclass/109.html http://www.sig007.com/video ...…

查看全部问答>

AT89C52中文资料

AT89C52中文资料,希望对大家有用…

查看全部问答>

FPGA与单片机通信

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 大家FPGA与单片机用的什么通信模式呢?串口和并口哪个好做啊?不知哪里有相关资料可供下载阿……  …

查看全部问答>

高分求助!EVC4.0环境,就一个.c文件(demo.c),为什么不包含 dshow.h 时编译通过,包含时就出一大堆错误呢?

用的是EVC4.0开发环境,就一个.c文件(demo.c),文件内容非常简单,为什么不包含 dshow.h 时编译通过,包含时就出一大堆错误呢? #include //#include     // 不包含 dshow.h 编译通过,包含时就出一大堆错误,见后面。 int W ...…

查看全部问答>

唤醒后死机了,发现没有中断信号却不断产生中断??

我的情况是这样的:2450 WinCE5.0 唤醒后,机器卡死:除了显示屏显示一静态图像外,系统不响应其他的外设。 通过打印信息知道,与EINT9注册了的那个事件(我命名为Event_EINT9)不断地被置成通知状态。 因此系统就在那个处理中断的线程里循环,导 ...…

查看全部问答>

还是EEPROM,怎么用软件判断EEPROM的大小

RT,不知道能不能对地址以外的空间读写的异常来判断一个EEPROM的大小,比如一个8K的,我向8K以外的区域写数据,如果出现异常,而7K区域没异常,我就认为这个EEPROM是8K的,不知道这样行不行…

查看全部问答>

求救(摄像头背景偏暗且带有明显的红横条)

各位高手:      小弟使用美光的MT9D111摄像头,使用中发现LCD显示屏背景偏暗(LCD使用其它功能正常),同时横向布满密集的红色的线条,导致拍摄时图像不清晰。      不知道该怎么调节,高手们救我啊! ...…

查看全部问答>

求救

你哪位大侠有关于stm32的TFT屏资料,给我发一个:405838540@qq.com 谢了…

查看全部问答>

FLASH写的问题

请问各位大哥,F149要对FLASH写时。是不是把430程序停了就可以进行 ,请各位详细指点一下,小弟谢谢。 程序的要求是第一次程序用JTAG口烧到430里。然后程序进行到一定时间时要对FLASH里的几个数进行修改,下次RESET时CPU程序直接用新的参数。 ...…

查看全部问答>