打印
[嵌入式Linux]

不会LINUX,但是我还要调试内核

[复制链接]
1542|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yjmwxwx|  楼主 | 2019-1-24 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yjmwxwx 于 2019-1-24 23:26 编辑


不是说学习LINUX么,但是我不会C语言啊,汇编能不能搞LINUX ?
先不说这个,还是调试下 明远什么睿的那个EK140迷你版IMX6ULL,但是你怎么给把JTAG口给关了啊,在哪里关的啊? 懒得问他们,我在淘宝买的,那个MM根本不懂技术,问她这种问题肯定解决不了。
就这一个简单问题上网搜吧,google ,yandex ,baidu 美俄中三大搜索没搜到,只搜到这个https://community.nxp.com/thread/376786 说让改imx6q_set_lpm,刚学内核也不懂C语言怎么改啊,看了看手册然后看汇编找到寄存器,把这个函数跳过去吧,要改机器码还要解压内核,我这内核是LZO的,解压后再同样参数打包,下载进去直接不运行了,看样子有校验。。
没办法还是得用官方固件调试,发现第三个灯灭JLINK就自动断开,于是上土法,终于找到了开关LED和关闭JLINK的地方,原来JLINK是在imx_pmx_set里面关闭的。
开关GPIO5上LED的函数

关闭JLINK的地方


通过调试发现开关led操作的是0X90850000,这是怎么回事,不是应该0X20AC000么? 怎么变过去的啊,后来网络搜索说是啥设备树页表什么的,我根本不懂啊,没办法先自学下吧,我自学从来不看网上的视频,我都是看书或者手册,先把参考手册和构架手册转成中文,有点大快7000页,也不知道什么人写的,让人怎么看啊。。 于是网上搜啊搜搜到个韩国人的博客,我不懂C语言不可能去一个函数一个函数的读内核,这个就看韩国人读吧。。
http://jake.dothome.co.kr/
先学习设备树,然后调试跟踪这个到底怎么变过去的啊,调啊调,内核函数比较绕,转来转去也没找到哪里变的走了弯路。
后来才知道原来是虚拟地址转物理地址的问题啊,真是的没学过操作系统,没往这方面想。。
也是从头开始从内涵那个汇编文件跟踪看看到底怎么初始化的,经过比较坎坷,后来知道页表作怪,又跟踪paging_init,这个函数也比较绕太垃圾了,没办法缩小范围到create_mapping,经过跟踪发现这个函数向0X80006000写一些数据,每个间隔0x100000,写了很多难道这个就是传说中的页表?



这是什么啊,光听网上大神门说页表页表的,这东西到底什么样子?
简单点问题0X90850000怎么变成0X20AC000的??
后来韩国人博客看到下面这张图片

不知道大家刚学页表的看不看的懂,反正我是没看懂,我这个和他这个地址不一样啊,也没啥文字描述让人怎么看啊。。

还是上土法,调试,搜索内存,写个程序把页表清零,看看到底哪个地址起的作用,就顺着0X90850000这条线索追踪,最后逐渐缩小范围,目标锁定在0X80006420上面,这地址里面是0X88005811,这个地址怎么变成0X20AC00的啊,还是不清晰,继续搜索内存,搜0X20AC,这次搜到了,原来在0X88005940,里面是0X20AC453。
结合这个关系才看明白前面韩国人那个图
自己总结了下计算经过

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


GPIO5_DR的虚拟地址是0x90850000

拆分成 从高向低分别是0x908, 0x50, 0x000

TTBR里面是0x8000406a


命令 mrc p15, 0, r0, c2, c0, 0 读TTBR0到R0
        mrc p15, 0, r1, c2, c0, 1 读TTBR1到R1
第一级


TTBR的0到9位清0等于0x80004000

0x908乘4等于0x2420,

0x2420加0x80004000等于0x80006420


第二级


内存地址0x80006420里面的数据是0x88005811

0x88005811的0到9位清0等于0x88005800

0x50乘4等于0x140

0x88005800加0x140等于0x88005940


第三级






地址0x88005940里面的数据是0x20ac453

0x20ac453的0到11位清0等于0x20ac000

0x20ac000加前面的0x000等于0x20ac000也就是说前面这个直接是物理地址。

到这里0x90850000虚拟地址转成了物理地址0x20ac000也就是GPIO5_DR



怎么样有了实物容易理解了吧,解决了这个跟踪起来就清晰多了,以前学过的前辈看看我计算的对不对??












相关帖子

沙发
yjmwxwx|  楼主 | 2019-1-28 01:14 | 只看该作者
本帖最后由 yjmwxwx 于 2019-1-28 01:18 编辑

验证下自己改虚拟地址,短描述符格式,两级描述符。 GPIO5虚拟地址0X10000000第一级描述符0X80004811写到0X80004400 第二级0X20AC453写到0X80004800。程序实现虚拟地址LED灯闪烁。

 .syntax unified
        .arch armv7-a
        .align 4
        .arm
        .text
        movw r6, # 0x4000
        movt r6, # 0x8000                [url=home.php?mod=space&uid=72445]@[/url] r6 = 0x80004000
        mov r0, r6                        [url=home.php?mod=space&uid=72445]@[/url] r0 读 r6
        mov r4, # 1000                        [url=home.php?mod=space&uid=72445]@[/url] 10K内存
        mov r5, # 0                        @ 10K内存写0
_nei_cun_qing_ling:                        @ 循环写0函数
        str r5, [r6], # 0x04                @ R5= 0 写到R6的地址然后地址加4
        subs r4, r4, # 1                @ 执行一次计数减1
        bne _nei_cun_qing_ling                @ 不等与0循环
        movw r1, # 0x4811         
        movt r1, # 0x8000                @ r1 = 0x80004811 第一级描述符
        add r0, r0, # 0x400                @ 0x80004000 加 0x400 = 0x80004400
        str r1, [r0]                        @ 第一级描述符写到0x80004400
        movw r1, # 0xc453
        movt r1, # 0x020a                @ r1 = 0x20ac453 第二级描述符
        add r0, r0, # 0x400                @ 0x80004400 加 0x400 = 0x80004800
        str r1, [r0]                        @ 第二级描述符写到0x80004800
        movw r0, # 0x406a
        movt r0, # 0x8000                @ r0= 0x8000406a
        mcr p15, 0, r0, c2, c0, 0        @ r0写到TTBR0
        mcr p15, 0, r0, c2, c0, 1       @ r0写到TTBR1
        movw r0, # 0x3C7D               
        movt r0, # 0x10C5                @ r0 = 0x10c53c7d
        mcr p15, 0, r0, c1, c0, 0        @ 打开MMU
        movw r0, # 0x0000
        movt r0, # 0x1000                @ GPIO5_DR虚拟地址= 0x10000000
_led_kai_guan:                                @ LED闪烁程序
        mov r1, # 0x10                        @ IO4
        str r1, [r0, # 0x04]                @ IO4配置为输出
        str r1, [r0]                        @ IO4开
        mov r3, # 0x00                        @
        movw r2, # 0xffff
        movt r2, # 0x03ff                @ R2 = 延时数0x3ffffff
_led_xun_huan1:                                @ IO开延时
        subs r2, r2, # 1                @ R2减1
        bne _led_xun_huan1                @ 开延时循环
        str r3, [r0]                        @ 延时结束关闭IO4
        movw r2, # 0xffff
        movt r2, # 0x03ff                @ 延时数重新写入R2
_led_xun_huan2:                                @ IO关延时
        subs r2, r2, # 1                @ R2减1
        bne _led_xun_huan2                @ 关延时循环
        b _led_kai_guan                        @ 跳转到LED函数
xu_ni_di_zhi.zip (119.21 KB)


使用特权

评论回复
板凳
Q394620173Q| | 2019-1-29 21:31 | 只看该作者
完全看不懂

使用特权

评论回复
地板
千岁寒| | 2019-2-22 09:40 | 只看该作者
yjmwxwx 发表于 2019-1-28 01:14
验证下自己改虚拟地址,短描述符格式,两级描述符。 GPIO5虚拟地址0X10000000第一级描述符0X80004811写到0X ...

任性

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

2765

帖子

48

粉丝