日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

@[TOC]

uboot啟動內核分析

進入cmd_bootm.c,找到對應的bootm命令對應的do_bootm():int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])

{

boot_os_fn *boot_fn; //boot_fn是個數組函數

... ..

boot_fn(0, argc, argv, &images); //調用數組函數

... ...

}

boot_os_fn是個typedef型,如下圖所示:

由于定義了宏CONFIG_BOOTM_LINUX,最終會跳轉到do_bootm ->do_bootm_linux()

代碼如下所示:int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)

{

/* No need for those on ARM */

if (flag & BOOTM_STATE_OS_BD_T || flag & BOOTM_STATE_OS_CMDLINE)

return -1;

if (flag & BOOTM_STATE_OS_PREP) {

boot_prep_linux(images);

return 0;

}

if (flag & BOOTM_STATE_OS_GO) {

boot_jump_linux(images);

return 0;

}

boot_prep_linux(images); //該函數會將各個tag參數保存在指定位置,比如:內存tag、bootargs環境變量tag、串口tag等

boot_jump_linux(images); //該函數會跳轉到內核起始地址

return 0;

}

最終跳轉到do_bootm ->do_bootm_linux-> boot_jump_linux()static void boot_jump_linux(bootm_headers_t *images)

{

unsigned long machid = gd->bd->bi_arch_number; //獲取機器ID

char *s;

void (*kernel_entry)(int zero, int arch, uint params);

unsigned long r2;

kernel_entry = (void (*)(int, int, uint))images->ep; //設置kernel_entry()的地址為0x30000000

s = getenv("machid"); //判斷環境變量machid是否設置,若設置則使用環境變量里的值

if (s) {

strict_strtoul(s, 16, &machid); //重新獲取機器ID

printf("Using machid 0x%lx from environment\n", machid); //使用環境變量的machid

}

... ...

r2 = gd->bd->bi_boot_params; //獲取tag參數地址, gd->bd->bi_boot_params在setup_start_tag()函數里被設置

kernel_entry(0, machid, r2); //跳轉到0x30000000,r0=0,r1=機器ID,r2=tag參數地址

}

上面的machid默認值為MACH_TYPE_SMDK2410(也就是193),我們也可以在環境變量里設置machid變量

最終,便跳到內核執行代碼,步驟如下所示:

1)根據R1(機器ID),來判斷內核是否支持該機器,若支持則初始化機器相關函數

2)解析TAG參數,初始化串口,設置內存等

3)掛載根文件系統,并執行應用程序

簡單配置內核

修改Makefile,修改配置tar xjf linux-3.4.2.tar.bz2

cd linux-3.4.2/

vi Makefile

改為ARCH ?= arm

CROSS_COMPILE ?= arm-linux-

配置編譯cd arch/arm/configs //由于我們板子是arm板,進入該目錄

ls *2440* //找到有mini2440_defconfig、

ls *2410* //找到有s3c2410_defconfig

cd ../../..

make s3c2410_defconfig //配置2410, 更新.config配置文件

make uImage //編譯,生成uImage

cp arch/arm/boot/uImage /work/nfs_root/ //拷貝

cd /work/nfs_root/

mv uImage uImage_new

進入.config查看支持的CPUvi .config

如上圖所示,有我們的2440

編譯內核make uImage

報錯如下Can't use 'defined(@array)'(Maybe you should just omit the defined? )at kernel/timeconst pl line 373

/root/working/Hi3520D SDK V2.0.3.0/osdrv/kernel/linux-30y/kernel/Makefile:140

recipe for target kernel/timeconst h failed make【1】:*** 【kernel/timeconst h】 Error 255

Makefile:945:recipe for target kernel ' failed

【kernel】 Error 2

解決辦法:

將 kernel/timeconst.pl中第373行的 defined0去掉只留下@val就可以了vim kernel/timeconst.pl +373

進入uboot燒寫nfs 32000000 192.168.2.106:/work/nfs_root/uImage_new

bootm 32000000

如下圖所示,發現串口輸出亂碼:

設置機器ID

uboot傳遞進來的機器ID可以通過環境變量machid來設置

所以任意設置一個ID,這樣再次啟動內核時,內核識別不出來,就會打印出所有設備對應的機器ID。下面開始測試機器ID是否正確,進入uboot,輸入:set machid 33333

tftp 32000000 uImage

bootm 32000000

如下圖所示,由于內核不支持這個機器ID,所以打印出內核能支持的ID表:

ID所對應的文件為arch/arm/mach-s3c24xx/Mach-smdk2440.c

MACHINE_START為一個結構體,根據不同的機器ID找到對應的MACHINE_START,調用初始化函數。

由于我們板子是2440,所以測試7cf(mini2440)以及16a(smdk2440)這兩個機器ID,是否支持我們開發板。

但是依舊亂碼,可能是波特率設置不正確。重新設置下環境變量的波特率set bootargs root=/dev/mtdblock3 console=ttySAC0,115200

再次燒寫啟動,發現7cf(mini2440)這個ID,有串口輸出正常。下面看下16a(smdk2440)為什么串口亂碼,進入mach-smdk2440.c( 位arch/arm/mach-s3c24xx)找到問題出在smdk2440_map_io():static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

s3c24xx_init_clocks(16934400); //初始化時鐘clock

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

修改晶振

由于我們板子上的晶振是12Mhz,而mdk2440_map_io()里,初始化的時鐘是基于16934400hz的晶振。所以將:s3c24xx_init_clocks(16934400); //初始化時鐘clock

改為:s3c24xx_init_clocks(12000000); //初始化時鐘clock

然后重新編譯uImage:make s3c2410_defconfig //將mach-s3c2440.c配置進內核

make uImage

cp uImage /work/nfs_root/ uImage_new

進入uboot,輸入:set machid 16a

nfs 32000000 192.168.1.30:/work/nfs_root/uImage_new

bootm 32000000

如遇到排版錯亂的問題,可以通過以下鏈接訪問我的CSDN。

**CSDN:[CSDN搜索“嵌入式與Linux那些事”]

總結

以上是生活随笔為你收集整理的linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲麻豆av | 夜噜噜 | 午夜精品在线观看 | 国产乱码77777777 | 亚洲综合色网站 | 亚洲高清毛片 | 欧美在线一二三区 | www.haoav| 三级精品在线观看 | 亚洲免费成人 | 欧美性极品xxxx做受 | 福利视频精品 | 日韩一区二区三区中文字幕 | 久久麻豆av | 女生喷水视频 | 伦理片一区二区 | 韩日三级视频 | 国产爆乳无码一区二区麻豆 | 男女激情啪啪 | 黄色网址在线播放 | 久视频在线观看 | 国产ts在线观看 | 中文字幕av专区 | 影音先锋亚洲天堂 | 国产原创av在线 | 中文无码一区二区三区在线观看 | 日本在线加勒比 | 亚洲欧美在线一区二区 | 五月天精品| 欧美成人免费看 | 中国av在线播放 | 日韩高清影视 | 国产精品综合一区二区 | 中国黄色一级大片 | 免费的黄色网址 | 成人在线国产视频 | 思思在线视频 | 久久香蕉精品 | 久久网国产 | 视频二区中文字幕 | 国产女人18毛片18精品 | 网站一区二区 | 性爱视频日本 | 日韩av手机在线免费观看 | 亚洲熟妇av一区二区三区 | 国产三级在线观看 | 婷婷日 | av免费在线观看网站 | 中文字幕在线观看一区二区三区 | 天天插天天色 | 日本视频二区 | 一区二区不卡视频 | 亚洲无毛视频 | 婷婷玖玖 | 天天操夜夜操视频 | 在线观看亚洲av每日更新 | 亚洲在线观看免费视频 | 国产日批视频在线观看 | 欧美浪妇xxxx高跟鞋交 | 国产网站av| 黄色精彩视频 | 黄色片久久 | 无码精品在线观看 | 毛片综合 | 青青草免费观看视频 | 欧美一区二区三区免费视频 | 天天做日日干 | 欧美三级图片 | 综合婷婷久久 | 黄色大片av| 亚洲经典在线观看 | 国产精华7777777 | 男人的天堂在线观看av | 国产午夜激情 | 人妻av无码一区二区三区 | 秋霞午夜鲁丝一区二区 | 日韩www.| 欧美在线一区视频 | 久久久久在线观看 | 国产精品人 | 国产91在线免费 | 777午夜 | 手机av免费在线 | 女人高潮娇喘1分47秒 | 大胸喷奶水www视频妖精网站 | 女av在线| 九九视频在线观看 | 久久久av片 | 国内偷拍第一页 | 少妇一晚三次一区二区三区 | 亚洲第一欧美 | 69精品久久久久久久 | 国产人妖一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 精品国产一区二区在线 | 久久久久国产一区 | 国产精品情侣呻吟对白视频 | 成人黄色小视频 | 成人黄色免费视频 |